L4 操作系统接口
本节比较简单,故与第五节课程笔记一起发布。本节主要是研究 上层应用 是怎么穿过边界进入 操作系统。
- 接口:操作系统提供的重要函数/指令(
system call
),用来连接硬件,所以OS接口就是系统调用- POSIX(Portable Operating System Interface of UNIX, 可移植操作系统接口):IEEE制定的OS接口标准
L5 系统调用实现
本节课程是重点,强调了系统调用的底层实现逻辑,主要涵盖三个问题:
1、用户系统调用 为什么 不应该进入内核?
2、怎么样 做到不让用户进入内核?
3、系统调用想进去内核应该 怎么办?
1、用户系统调用为什么不应该进入内核?
- 为了系统的隐私性,不能随意的
jmp
和mov
来获取内存中的数据。
- 内核(Kernel):内核是操作系统的核心部分,它负责管理系统的各种资源(如CPU、内存、设备等),提供服务给用户程序,实现了操作系统的基本功能,比如进程管理、内存管理、文件系统、设备驱动程序等。内核通常是操作系统的一个独立模块,负责运行在最高特权级别,控制整个系统的运行。
- 内存(Memory):内存是计算机系统中用于存储数据和程序的一种硬件设备。它是用来存放程序和数据的临时存储区域,供 CPU 进行读写操作。操作系统通过内存管理的功能来管理计算机系统中的内存资源,包括分配、释放、保护和共享内存等操作。
2、怎么做到不让用户进入内核?
- 硬件电路将内核程序和用户程序隔离,防止随意
jmp
- DPL(目标段特权级),CPL(当前段特权级),特权级数字越小等级越高。只有当 DPL≤CPL(由硬件来检查),当前段才可以访问目标段。
特权级: 核心态 = 0 OS服务 = 1/2 用户态 = 3
- 系统初始化
head.s
执行时,建立 GDT 表象时就初始化了各态的特权级别
3、系统调用想进去内核应该通过什么手段?
- 硬件提供了主动进入内核的方法:中断指令 int
open
展开实际包含了中断 int 指令,来实现调用内核
4、用户程序包含 int
指令的代码
- 只能通过
int 0x80
进入OS内核
- write 指令的系统调用,通过 宏 来展开
_asm_volatile
(内嵌汇编),输出=a
即eax
。先将NR_##name
置给 eax。代入即把write
置给eax
。核心:将系统调用号置给 eax,然后调用int 0x80
// 定义(上面这一页 PPT 是定义)
// weite 指令的调用(再上一页 PPT 是调用)
syscal13(int, write, int, fd, char const *buf, off_t, count)
/* 把 write 置给 eax (实际是一个系统调用号 _NR_write)
把 fd 置给 bax, *buf 置给 cax, count 置给 dax */
5、操作系统写中断处理
- 在
IDT
表中取出中断处理函数
- 实现了
DPL = 3
,CPL = 0
, 用户程序就可以进入内核了
6、操作系统根据编号执行相应代码
write
的系统调用对应的地址,乘4 是因为每次函数位置占32位 -> 4个字节。
- 通过 int 0x80 指令(CPL = 3, DPL = 3),才能穿过接口到达系统
至此,本节课程已介绍完毕。
再次强调一下本系列文章的定位:希望通过这一系列文章,可以帮助大家巩固与学习李治军老师课程上的重点内容。同时,也为大家后续知识点遗忘提供了查阅的渠道,而无需去视频中寻找知识,故本系列文章图片均保留了课堂笔记。希望对大家有所帮助!