Linux内核设计与实现(5)第五章:系统调用

1. 系统调用

1.1 定义

系统调用就是用户程序和硬件设备之间的桥梁。
用户程序在需要的时候,通过系统调用来使用硬件设备。

1.2 作用(四个作用)

系统调用在用户空间进程与硬件设备之间添加了一个中间层。
该层主要作用有:

1. 他为用户空间提供了一种硬件的抽象接口
	而不用关心具体的硬件设备,这样大大简化了用户程序的开发。
	比如:用户程序通过write()系统调用就可以将数据写入文件,
		而不必关心文件是在磁盘上还是软盘上,或者其他存储上。
	
2. 系统调用保护了系统的稳定和安全
	因为系统调用是内核实现的,内核通过系统调用来控制开放什么功能及什么权限给用户程序。
	这样可以避免用户程序不正确的使用硬件设备,从而破坏了其他程序。

3. 系统调用使得用户程序有更好的可移植性
	只要操作系统提供的系统调用接口相同,用户程序就可在不用修改的情况下,
	从一个系统迁移到另一个操作系统。

4. 有效的分离了用户程序和内核的开发
	用户程序只需关心系统调用API,通过这些API来开发自己的应用,不用关心API的具体实现。
	内核则只要关心系统调用API的实现,而不必管它们是被如何调用的。

1.3 用户程序,系统调用,内核,硬件设备的调用关系

用户程序
	|
系统调用api
	|
  内核
	|
硬件设备

1.4 printf()函数调用过程

在这里插入图片描述

1.5 系统调用命名

系统调用在内核中均以sys_作为前缀

2. Linux上的系统调用实现原理

2.1 调用过程

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

2.2.1 通知内核调用哪个系统调用

每个系统调用都有一个系统调用号
即:系统调用发生时,内核就是根据传入的系统调用号来知道是哪个系统调用的。

在x86架构中,用户空间将系统调用号是放在eax中的,系统调用处理程序通过eax取得系统调用号。

2.2.2 用户程序把系统调用的参数传递给内核

系统调用的参数也是通过寄存器传给内核的。 在x86系统上,系统调用的前5个参数放在ebx,ecx,edx,esi和edi中。
如果参数多的话,还需要用个单独的寄存器存放指向所有参数在用户空间地址的指针。

2.2.3 用户程序获取内核返回的系统调用返回值

获取系统调用的返回值也是通过寄存器,在x86系统上,返回值放在eax中。

猜你喜欢

转载自blog.csdn.net/lqy971966/article/details/119541970