【Linux内核学习】 如何添加一个系统调用

参考资料: linux内核设计与实现 第三版 第五章

添加系统调用的步骤

以加入一个虚拟的系统调用为例。

  1. 在系统调用表项的最后加入表项
    对于大多数体系结构说,系统调用表项在 entry.s 文件中,
    在这里插入图片描述在这里插入图片描述
    不用特意的指定编号,从0开始 , 按序列到添加的就是 338.

  2. 对于支持的体系结构,系统调用号需要在unistd.h中
    在这里插入图片描述

  3. 最后,实现foo(系统调用)
    可以将其实现在kernel的.c文件下,该例添加实现在kernel/sys.c文件中
    在这里插入图片描述
    可以根据功能在相关的文件中实现相应的系统调用。

从用户空间测试

通常,系统调用靠C库支持,用户程序通过包含头文件并和C库链接,就可以使用系统调用(或者调用库函数,再由库函数实际调用)。

但是linux提供了一种宏,使得我们可以直接对系统调用进行访问,它会设置好寄存器并调用陷入指令,这些宏就是__syscalln()。
__syscall 是前缀, 后面的n代表参数个数。
在这里插入图片描述
注意中间的是逗号。

对于每个宏来说,都有2 + 2 n 个参数。

由此 测试代码如下
在这里插入图片描述

总结

总的来说, 系统调用是为了应用程序的接口的各种库在不同平台上能够共用的一种有效的机制,各种库在不同平台上提供的接口都是一致的,但是在各种系统或者平台上,这些接口的实现可能是不一样的,即,实现这些接口的系统调用可能不一样,有的可能实现成一个系统调用,也可能调用多个系统调用来实现。
在这里插入图片描述

执行系统调用后,通过异常中断,陷入内核,传递系统调用号以及参数(正确的),执行正确的系统调用函数,并把返回值带回用户空间。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值