《内核设计与实现》第五章读书笔记

《内核设计与实现》第五章读书笔记


第五章:系统调用

用户进程与内核的接口:是用户进程与内核的使者。

  


5.1 与内核通信

用户空间进程和硬件设备之间中间层——系统调用

作用:    1为用户空间提供一种硬件的抽象接口;
         2保证系统的稳定安全(对权限访问等的裁决)
         3是用户空间访问内核的唯一手段(出异常和陷入),是内核唯一的合法入口。

  

5.2 API,POSIX和C库

5.3 系统调用

    访问系统调用,通过C库中定义的函数调用进行。
    系统调用在出错时,C库会把错误码写入errno全局变量。
    为保证32位和64位系统的兼容,系统调用在用户空间和内核空间有不同的返回值类型。

  

5.3.1系统调用号

    每个系统调用一个系统调用号。,用来关联系统滴啊用。
    进程不会提及系统调用的名称。
    专门针对无效的系统调用:sys_ni_syscall()

  

5.3.2系统调用性能

    比其他操作系统执行得快。
    原因:很短的上下文切换时间

  

5.4 系统调用的实现

    应用程序应该以某种方式通知系统,告诉内核自己需要执行一个系统调用,希望系统切换到内核态。内核就可以代表应用程序在内核空间执行系统调用。
    通知内核的机制是靠软中断实现的:通过引发异常来粗来系统切换内核态执行异常处理程序(系统调用处理程序)。

  

5.4.1制定恰当的系统调用

    系统调用号通过eax传递给内核。

  

5.4.2参数传递
    ebx,ecx,edx,esi,edi按照顺序存放前五个参数。
    需要六个或六个以上参数时,应用一个单独的寄存器存放指向所有参数在用户空间地址的指针。
    返回值用eax

  

5.5系统调用的实现

5.5.1实现系统调用

明确用户,确定调用参数,返回值和错误码。

  

5.5.2参数验证
    接收用户空间的指针前,内核保证:
    指针指向的内存区域属于用户空间
    指针指向的内存区在进程的地址空间里
    进程不能绕过内存访问限制

  

5.6系统调用上下文

    内核在执行系统调用时处于进程上下文。
    进程上下文中,内核可休眠(系统调用阻塞或显式调用schedule()时)并可以被抢占。
    系统调用返回时,控制权仍在system_call(),最终负责切换到用户空间,并让用户进程继续执行下去。

  

5.6.1绑定一个系统调用的最后步骤

    系统调用表加入一个表项
    系统调用号定义<asm/unistd.h>
    必须编译进内核映象

  

5.6.2从用户空间访问系统调用

    系统调用靠C库支持。
    Linux提供一组宏,用户直接对系统调用进行访问。每个宏都有2+2*n个参数。

  

5.6.3为什么不通过系统调用方式实现

原文地址:https://www.cnblogs.com/zhengwei0712/p/5285370.html