Linux内核设计与实现——系统调用

系统调用的意义

  1. 为用户空间提供了一种硬件的抽象接口,可移植性
  2. 系统调用保证了系统的稳定和安全,作为硬件设备和应用程序之间的中间人,保护系统安全
  3. 操作系统的虚拟化和抽象的需要,方便开发,只需要和API打交道

Linux中,系统调用是用户空间访问内核的唯一手段:除异常和陷入外,它们是内核唯一的合法入口

系统调用图.png

1. 系统调用

步骤

  1. 通知内核调用一个哪个系统调用
  2. 用户程序把系统调用的参数传递给内核
  3. 用户程序获取内核返回的系统调用返回值

系统调用号

每个系统调用有一个系统调用号,指明到底执行哪个系统调用,分配后不能有任何变更,删除后也不能回收利用调用号。
有一个错误号专门针对无效的系统调用

系统调用处理程序

用户程序通过引发一个异常来促使系统切换到内核态去执行异常处理程序,此时的异常处理程序实际上就是系统调用处理程序

  • 需要将系统调用号传递给内核(通过寄存器)
  • 传递参数也通过一组寄存器

2. 系统调用的实现

实现要力求简洁,稳定,仔细检查合法输入,和异常处理,系统调用是可重入的

3. 系统调用上下文

内核在执行系统调用的时候处于进程上下文,系统调用返回的时候,控制器仍在system_call()中,负责切换到用户控件,并让用户进程继续执行下去。

系统调用的两种方法

  • C库函数
  • Linux本身提供了一组宏,用于直接对系统调用进行访问

虽然可以建立新的系统调用,而且系统调用性能也不错,但是通常都会有更好的办法来代替新建一个系统调用的实现
因为改系统总是很麻烦的,还是尽量避免啦

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 计算机系统漫游 代码从文本到可执行文件的过程(c语言示例):预处理阶段,处理 #inlcude , #defin...
    willdimagine阅读 3,680评论 0 5
  • 本章讲解了系统调用的抽象概念与实现方式;总的来说,系统调用是内核提供的方便用户进程与内核进行交互的一组接口;主要系...
    muux阅读 513评论 0 2
  • 高中老师曾教导我们:好逸恶劳,人之本性。某商业大腕说:聪明人都会偷懒。说的都是一码事,但懒和偷懒就不是一码事了,至...
    512song阅读 465评论 0 0
  • 不依赖jQuery,使用原生JSTabdemo:https://leeeozhang.github.io/Demo...
    LeeoZz阅读 172评论 0 0
  • 选自《遇见未知的自己》31章-心想事成的秘密,P189第五段及P192最后一段。 R(原文):当你真心想要一样东西...
    箴签阅读 218评论 0 0