项目地址:https://www.lanqiao.cn/courses/115
修改include/unistd.h文件以添加系统调用,
移动include/unistd.h到usr/include文件夹下
在函数表中增加函数引用
编写测试程序传到linux0.11中
1.从linux/include/unistd.h中可以知道,_syscall宏展开的系统调用最多有三个参数,使用ebx、ecx、edx寄存器存储参数。
解决限制的办法:将需要传递的多个参数保存在一段自定义的数据结构中,并将该用户态地址空间的首地址作为参数传递给系统调用,最后通过寄存器间接寻址即可获得所有参数,当然先需要验证参数的合法性。
2.首先修改include/linux/sys.h,在sys_call_table数组末尾加上sys_foo,再加上extern rettype sys_foo();
修改include/unistd,#define __NR foo num,这里的num表示接下来的系统调用号
修改kernel/system_call.s,nr_system_calls = num,num为在原值上加1,即系统调用总数加一
在kernel中添加foo.c,如果需要支持内核态和用户态的数据交互,则应包含include/asm/segment.h,其中有put_fs_XXX, get_fs_XXX函数,在foo.c中实现系统调用sys_foo()
修改kernel的MAKEFILE,将foo.c与其他内核代码编译链接到一起
系统调用用户界面需要
#define LIBRARY
#include <unistd.h>
_syscallN宏展开系统调用,提供用户态的系统调用接口