参考资料: linux内核设计与实现 第三版 第五章
添加系统调用的步骤
以加入一个虚拟的系统调用为例。
-
在系统调用表项的最后加入表项
对于大多数体系结构说,系统调用表项在 entry.s 文件中,
不用特意的指定编号,从0开始 , 按序列到添加的就是 338. -
对于支持的体系结构,系统调用号需要在unistd.h中
-
最后,实现foo(系统调用)
可以将其实现在kernel的.c文件下,该例添加实现在kernel/sys.c文件中
可以根据功能在相关的文件中实现相应的系统调用。
从用户空间测试
通常,系统调用靠C库支持,用户程序通过包含头文件并和C库链接,就可以使用系统调用(或者调用库函数,再由库函数实际调用)。
但是linux提供了一种宏,使得我们可以直接对系统调用进行访问,它会设置好寄存器并调用陷入指令,这些宏就是__syscalln()。
__syscall 是前缀, 后面的n代表参数个数。
注意中间的是逗号。
对于每个宏来说,都有2 + 2 n 个参数。
由此 测试代码如下
总结
总的来说, 系统调用是为了应用程序的接口的各种库在不同平台上能够共用的一种有效的机制,各种库在不同平台上提供的接口都是一致的,但是在各种系统或者平台上,这些接口的实现可能是不一样的,即,实现这些接口的系统调用可能不一样,有的可能实现成一个系统调用,也可能调用多个系统调用来实现。
执行系统调用后,通过异常中断,陷入内核,传递系统调用号以及参数(正确的),执行正确的系统调用函数,并把返回值带回用户空间。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。