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)

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

 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值