《内核设计与实现》第五章读书笔记
《内核设计与实现》第五章读书笔记
第五章:系统调用
用户进程与内核的接口:是用户进程与内核的使者。
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个参数。