(6)要实现系统调用需注意哪些方面
给linux添加一个系统调用不难,但怎么设计和实现一个系统调用是难题所在。linux不提倡采用多用途的系统调用(根据不同的参数提供不同的功能)。
系统调用必须仔细检查传入参数的有效性,尤其是用户提供的指针,必须确保:
*指针指向的内存区域属于用户空间,进程不能哄骗内核去读内核空间的数据 *指针指向的内存区域属于进程的地址空间,不能哄骗内核去读其他进程的数据 *进程不能绕过内存访问权限。内核在执行系统调用的时候处于进程上下文,可以休眠,也可以被抢占,所以必须保证系统调用是可重入的。
(7)一个系统调用的例子(包括内核的修改和用户空间程序的实现)
实现一个系统调用sys_foo
a.添加系统调用号
修改include/asm/unistd.h,加入:#define __NR_foo 289 并修改:#define NR_syscalls 290
b.在系统调用表中添加
修改arch/i386/kernel/entry.s或syscall_table.s,加入:
.long sys_foo
c.系统调用必须编译到核心的内核映像中,可以将系统调用的定义放置到和其功能联系最紧密的代码中,如kernel/sys.c,加入:
| #include <asm/thread_info.h> /* * return the size of kernel stack */ asmlinkage long sys_foo(void) { return THREAD_SIZE; } |
d.在用户空间进行调用
通常,系统调用靠c库支持,glibc不可能支持我们自己的系统调用,此时,需要借助linux本身提供的一组宏来对系统调用直接进行访问。
man 2 syscall
总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对易采站长站的支持。如果你想了解更多相关内容请查看下面相关链接








