实现一个sys_printf的系统调用:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
unsigned long sys_printf(struct pt_regs *regs) {
color_printk(BLACK, WHITE, (char*)regs->rdi);
return 1;
}

unsigned long no_system_call(struct pt_regs *regs) {
color_printk(RED, BLACK, "no_system_call is called, NR: %#04x\n", regs->rax);
return -1;
}

system_call_t system_call_table[MAX_SYSTEM_CALL_NR] = {
[0] = no_system_call,
[1] = sys_printf,
[2 ... MAX_SYSTEM_CALL_NR-1] = no_system_call
};

sys_printf的系统调用向量号是1,内部封装了函数color_printk函数,并借助RDI寄存器(参数regsrdi成员变量)向color_printk传递打印的字符串。

1
2
3
4
5
6
7
8
9
10
11
12
13
void user_level_function() {
long ret = 0;
char msg[] = "Hello World!\n";
__asm__ __volatile__("leaq sysexit_return_address(%%rip), %%rdx \n\t"
"movq %%rsp, %%rcx \n\t"
"sysenter \n\t"
"sysexit_return_address: \n\t"
: "=a"(ret)
: "0"(1), "D"(msg)
: "memory");
while (1)
;
}

将字符串的起始地址保存到rdi寄存器中,然后执行系统调用。

运行结果:

![Screenshot_20220828_004650](https://img.ansore.de/2022/08/28/86f4898524a9cfac15095f1570264036.png