Linux内核设计与实现 第五章

系统调用

作用:为用户空间提供一个管理接口;保证系统的安全;利于多任务和虚拟内存的实现。

系统调用

系统调用号:每个系统都有唯一的编号,即使该系统调用被删除此编号也不能回收利用,进程在进行系统调用时直接使用系统调用号而不是系统调用的名字。

系统调用的性能:Linux中系统调用贼快:进程切换快,系统调用本身简洁。

系统调用处理程序

用户空间的程序无法直接执行内核代码,所以必须通知内核自己需要执行一个系统调用,这样的行为是通过中断来实现的。此时的异常处理程序其实就是系统调用处理程序:128中断号被触发后执行128号异常处理程序就是所谓的系统调用处理程序(system_call())——x86体系。

指定恰当的系统调用:在进行系统调用时还需要把系统调用号传给内核,x86通过寄存器进行传递。

参数传递:x86-32前五个参数也是用寄存器传递,超过六个的话则用一个单独的寄存器传递用户空间的地址的指针。

系统调用的实现

参数验证:最重要的一项就是检查指针是否有效:指针必须指向用户空间;读写操作必须拥有相应的权限:capable()。copy_from_user和copy_to_user都可能发生阻塞:比如缺页。

系统调用上下文

current指针指向当前任务,也就是引发系统调用的那个进程 。内核可以休眠并且可以被抢占。

绑定一个系统调用最后的步骤:编写完一个系统调用后:系统调用表增加一个表项;定义系统调用号;被编译进内核映象。

从用户空间访问系统调用:以系统调用open()为例;

long open(const char *filename, int flags, int mode)

在不依靠libc库支持的时候,我们选择_syscalln(),

_syscall3(long, open, const char *, filename, int, flags, int, mode)

然而:在很多时候,添加一个新的系统调用是一个很方便的做法,但是在实际环境中尽量不要这么做,具体原因这部分可以看一下书。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章