int 0x80
软中断,来跳转到相应的中断处理服务例程,即系统调用服务程序system_call
, systeml_call
根据系统调用号查找系统调用获取到系统调用服务例程地址并调用之.hello
include/linux/syscalls.h
文件, 添加声明:asmlinkage long sys_hello(const char __user *name);
其中
asmlinkage
即为extens C
, 按 c的编译方式long
;sys_
为前缀;__user
表示是从用户空间传递来的参数;kernel/sys.c
, 添加定义:asmlinkage long sys_hello(const char __user *name) {
char *name_kd;
long ret;
name_kd = strndup_user(name, PAGE_SIZE);
if (IS_ERR(name_kd)) {
ret = PTR_ERR(name);
goto error;
}
printk("Hello, %s!\n", name_kd);
ret = 0;
error:
return ret;
}
arch/x86/entry/syscalls/syscall_64.tbl
, 添加调用号333(根据自己的源码,可自定义):333 64 hello sys_hello
#include <stdio.h>
int main(int argc, char *argv[]) {
long ret = syscall(333, "lw");
printf("ret: %d\n", ret);
return 0;
}
gcc -o test_syscall test_syscall.c
dmesg
命令查看,在结尾会有类似下面的显示:[ 402.829360] Hello, lw!