linux系统调用实现的介绍

操作系统负责资源管理,当应用层需要使用资源时就需要向内核发起系统调用。如读取文件时发起syscall_read系统调用,建立socket时发起syscall_socket等等
内核完成引导后,就处于等待处理各种中断的状态下,以实现对硬件资源的管理,对上层请求的响应。
能够触发内核响应的有三类
1,系统调用,是基于软件中断实现的,应用层向内核层发起请求的方式
2,异常,如缺页异常,使虚拟地址被分配物理空间
3,中断,一般为硬件状态改变发起中断引起内核相应。如usb设备插入等。


本文重点介绍系统调用,系统调用是靠软件中断实现的。首先,用户程序为系统调用设置参数。其中一个参数是系统调用编号。参数设置完成后,程序执行“系统调用”指令。x86系统上的软中断由int产生。这个指令会导致一个异常:产生一个事件,这个事件会致使处理器切换到内核态并跳转到一个新的地址,并开始执行那里的异常处理程序。此时的异常处理程序实际上就是系统调用处理程序。

内核空间中的实现
在Linux中,每个系统调用被赋予一个系统调用号。这样,通过这个独一无二的号就可以关联系统调用。当用户空间的进程执行一个系统调用的时候,这个系统调用号就被用来指明到底是要执行哪个系统调用。进程不会提及系统调用的名称。
所有的系统调用陷入内核的方式都一样,所以仅仅是陷入内核空间是不够的。因此必须把系统调用号一并传给内核。在x86上,系统调用号是通过eax寄存器传递给内核的。在陷人内核之前,用户空间就把相应系统调用所对应的号放入eax中了。这样系统调用处理程序一旦运行,就可以从eax中得到数据。其他体系结构上的实现也都类似。
除了系统调用号以外,大部分系统调用都还需要一些外部的参数输人。在发生异常的时候,应该把这些参数从用户空间传给内核。最简单的办法就是像传递系统调用号一样把这些参数也存放在寄存器里。在x86系统上,ebx, ecx, edx, esi和edi按照顺序存放前五个参数。需要六个或六个以上参数的情况不多见,此时,应该用一个单独的寄存器存放指向所有这些参数在用户空间地址的指针。 
给用户空间的返回值也通过寄存器传递。在x86系统上,它存放在eax寄存器中。
arm使用的相关寄存器有待补充。
内核记录了系统调用表中的所有已注册过的系统调用的列表,存储在sys_call_table中。它与体系结构有关,一般在entry.s中定义。这个表中为每一个有效的系统调用指定了惟一的系统调用号。sys_call_table是一张由指向实现各种系统调用的内核函数的函数指针组成的表:
android系统中的内核调用函数列表在kernel\arch\arm\kernel\calls.S

用户空间的使用
Linux 下三种发生系统调用的方法:
1,通过 glibc 提供的库函数
glibc 是 Linux 下使用的开源的标准 C 库,它是 GNU 发布的 libc 库,即运行时库。glibc 为程序员提供丰富的 API(Application Programming Interface),除了例如字符串处理、数学运算等用户态服务之外,最重要的是封装了操作系统提供的系统服务,即系统调用的封装。,
2,使用 syscall 直接调用
使用上面的方法有很多好处,首先你无须知道更多的细节,如 chmod 系统调用号,你只需了解 glibc 提供的 API 的原型;其次,该方法具有更好的移植性,你可以很轻松将该程序移植到其他平台,或者将 glibc 库换成其它库,程序只需做少量改动。
但有点不足是,如果 glibc 没有封装某个内核提供的系统调用时,我就没办法通过上面的方法来调用该系统调用。如我自己通过编译内核增加了一个系统调用,这时 glibc 不可能有你新增系统调用的封装 API,此时我们可以利用 glibc 提供的syscall 函数直接调用。
3,通过 int 指令陷入
如果我们知道系统调用的整个过程的话,应该就能知道用户态程序通过软中断指令int 0x80 来陷入内核态(在Intel Pentium II 又引入了sysenter指令),参数的传递是通过寄存器,eax 传递的是系统调用号,ebx、ecx、edx、esi和edi 来依次传递最多五个参数,当系统调用返回时,返回值存放在 eax 中。

android系统下没有使用glibc,而是使用一套更为轻量的,与glibc十分相似的bionic
bionic中实现了标准api的c库如stdio,math,string等,其中syscall相关的封装在
bionic\libc\arch-arm\syscalls\
其中每个系统调用为一个汇编文件:

如其中bionic\libc\arch-arm\syscalls\read.S


猜你喜欢

转载自blog.csdn.net/RadianceBlau/article/details/78751189