操作步骤
- 在系统调用表里添加一个表项,位于entry.s的ENTRY(sys_call_tall)
- 将系统调用号定义到<asm/unistd.h>中(定义位置:include/asm-i386/unistd.h)
- 在**sys_ni_syscal()**增加系统调用完成的功能
- 编译到内核映像
- 重新编译内核,启动新内核
- 封装系统调用例程,支持用户空间的访问
具体实现
1. 在系统调用表里添加一个表项,位于entry.s的ENTRY(sys_call_tall)
按之前编译内核时解压缩的源代码的目录下去找/arch/x86/entry/syscalls(下面是我的目录位置)
/usr/src/linux-5.6.4/arch/x86/entry/syscalls
sudo gedit syscall_64.tbl
系统调用编号:/根据自己的在后面增加,注意不要把之前的系统调用覆盖掉/
适用位数:x86/64/common
名称:自定义
函数名:/建议以sys_开头/
注:我的一开始用sys_开头,后来编译内核的时候出了问题,后来改成了 __x64_sys_开头
例如我打算添加两个系统调用:
long __x64_sys_MyInfo64(void)
long __x64_sys_MyInfoCommon(void)
2. 将系统调用号定义到<asm/unistd.h>中(定义位置:include/asm-i386/unistd.h)
/*在/usr/src/linux-5.6.4目录下*/
sudo gedit include/linux/syscalls.h