Linux内核设备驱动之系统调用笔记整理

2019-01-16 20:37:36于海丽

(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

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对易采站长站的支持。如果你想了解更多相关内容请查看下面相关链接

您可能感兴趣的文章:

将Linux代码移植到Windows的简单方法Linux内核设备驱动之内存管理笔记整理Linux内核设备驱动之内核的时间管理笔记整理Linux内核设备驱动之字符设备驱动笔记整理Linux内核设备驱动之虚拟文件系统笔记整理Linux内核设备驱动之内核的调试技术笔记整理Linux内核设备驱动之内核中链表的使用笔记整理Linux内核设备驱动之proc文件系统笔记整理Linux内核设备驱动之高级字符设备驱动笔记整理Linux内核设备驱动之Linux内核模块加载机制笔记整理Linux内核设备驱动地址映射笔记整理Linux内核设备驱动之Linux内核基础笔记整理移植新内核到Linux系统上的操作步骤