系统调用
:material-circle-edit-outline: 约 429 个字 :material-clock-time-two-outline: 预计阅读时间 1 分钟
系统调用是内核向用户进程提供服务的唯一方法,应用程序调用操作系统提供的功能模块(函数)。
用户程序通过系统调用从用户态(user mode)切换到核心态(kernel mode),从而可以访问相应的资源。
一些概念
运行模式
Linux使用了其中的两个:特权级0和特权级3 ,即内核模式(kernel mode)和用户模式(user mode)
地址空间
每个进程的虚拟地址空间可以划分为两个部分:用户空间和内核空间。
上下文
一个进程的上下文可以分为三个部分:用户级上下文、寄存器上下文以及系统级上下文。
- 用户级上下文:正文(代码)、数据、用户栈以及共享存储区;
- 寄存器上下文:通用寄存器、程序寄存器(eip)、处理机状态寄存器(eflags)、栈指针(esp);
- 系统级上下文:进程控制块task_struct、内存管理信息(mm_struct、vm_area_struct、 pgd、pmd、pte等)、核心栈等。
内核函数
内核函数在形式上与普通函数一样,但它是在内核实现的,需要满足一些内核编程的要求
系统调用是用户进程进入内核的接口层,它本身并非内核函数,但它是由内核函数实现的
进入内核后,不同的系统调用会找到各自对应的内核函数,这些内核函数被称为系统调用的“服务例程”
当用户态的进程调用一个系统调用时,CPU切换到内核态并开始执行一个内核函数