第5章 系统调用

2020-11-29  本文已影响0人  涵仔睡觉

一、与内核通信

系统调用在用户空间进程和硬件设备之间添加一个中间层,主要有三个作用:

二、系统调用

以系统调用getpid()为例,其内核实现为:

SYSCALL_DEFINE0(getpid) 
{
    return task_tgid_vnr(current);
}

其中SYSCALL_DEFINE0是一个宏,定义一个系统调用,0表示该系统调用无参数。该宏展开:

asmlinkage long sys_getpid(void)

其中:

2.1 系统调用号

Linux中每个系统调用被赋予一个系统调用号,可以关联系统调用。一旦分配就不能再变更,否则编译好的应用程序就会崩溃。若系统调用被删除,其所占用的系统调用号也不允许被回收利用。

内核记录了系统调用表中的所有已注册过的系统调用的列表,存储在sys_call_table中。这个表为每一个有效的系统调用指定了唯一的系统调用号。

2.2 系统调用性能

Linux系统调用比其他许多操作系统执行要快,主要因为:

三、系统调用处理程序

用户空间的程序无法直接执行内核代码,因为内核驻留在受保护的地址空间上。应用程序只能以某种方式通知系统,告诉内核自己需要执行一个系统调用,希望系统切到内核态,内核再代表应用程序在内核空间执行系统调用。

通知内核的机制是靠软中断实现的:通过引发一个异常来促使系统切换到内核态去执行异常处理程序(此时,也就是系统调用处理程序)。在x86系统上预定义的软中断号是128,通过int $0x80指令触发该中断,该指令触发一个异常导致系统切换到内核态并执行128号异常处理程序,也就是系统调用处理程序(system_call())

3.1 指定恰当的系统调用

在x86上,系统调用号是通过eax寄存器传递给内核的。在陷入内核之前,用户空间就把相应系统调用所对应的号放入eax中。这样系统调用处理程序一旦运行,就可以从eax中取得数据。

image.png

3.2 参数传递

除了系统调用号外,大部分系统调用都需要传递参数,在陷入内核时,应该把参数从用户空间传给内核,也是通过寄存器实现的。x86-32系统上,ebx、ecx、edx、esi和edi按照顺序存放前5个参数,需要6个及以上参数的情况不多,此时应用一个单独的寄存器存放指向所有这些参数在用户空间地址的指针。

给用户空间的返回值也通过寄存器传递。在x86系统上,返回值存放在eax寄存器中。

四、系统调用的实现

实现一个新的Linux系统调用所需的步骤:

五、系统调用上下文

内核在执行系统调用时处于进程上下文,current指针指向当前任务,即引发系统调用的那个进程。在进程上下文中,内核可以休眠并且可以被抢占。

系统调用返回时,控制权仍在system_call中,最终会负责切换到用户空间,并让用户进程继续执行下去。

5.1 注册系统调用

以添加系统调用foo()为例:

ENTRY(sys_call_table)
    .long sys_restart_syscall /* 0 */
...
    .long sys_rt_tgsigqueueinfo /* 335 */
    .long sys_perf_event_open
    .long sys_recvmmsg
    .long sys_foo

那么foo的系统调用就被分配为338。系统调用号是专属于系统结构ABI(应用程序二进制接口)的部分。每种体系结构不需要对应相同的系统调用号。

#define __NR_restart_syscall 0
...
#define __NR_rt_tgsigqueueinfo 335
#define __NR_perf_event_open   336
#define __NR_recvmmsg          337
#define __NR_foo               338
// kernel/sys.c

#include <asm/page.h>
asmlinkage long sys_foo(void)
{
    return THREAD_SIZE;
}

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

通常,系统调用靠C库支持。用户程序通过包含标准头文件并与C库链接,就可以使用系统调用。Linux提供一组宏,用于直接对系统调用进行访问,它会设置好寄存器并调用陷入指令,这些宏是_syscalln(),其中n取值范围为[0, 6],代表系统调用的参数个数。对于每个宏,都有2+2*n个参数:

#define __NR_foo 338
__syscall0(long, foo)

系统调用long foo()的系统调用号为338,返回值类型为long,函数名为foo,没有参数。

上一篇 下一篇

猜你喜欢

热点阅读