2.CH-2文档学习笔记
第二章 操作系统的组织结构
1. 资源抽象
- 由操作系统管理硬件资源,用户程序通过操作系统提供的接口间接访问硬件资源
- 所有软件共享CPU,由操作系统进行进程切换的工作
- 进程通信通过文件描述符完成,省略了很多细节,比如管道文件的具体存放位置,而且如果管道中程序执行失败,内核会给管道另一端的程序发送EOF
(End Of File)信号
2. 用户态和内核态
-
RISC-V有三种模式:
-
机器模式:拥有全部权限,主要在电脑启动时,配置计算机 -
监督者模式:允许执行特权指令:例如,启用和禁用中断,读写保存页表地址的寄存器等。如果用户模式下,程序试图执行一条特权指令,将会切换到监督者模式,因为监督者模式下,在必要时可以终止该程序 -
用户模式:只能执行普通指令
-
-
XV6有两种模式:
用户态:对应用户模式,用户程序在用户态执行,当调用系统调用时,会通过一个特殊指令,切换到监督者模式,然后执行内核程序内核态:对应监督者模式,执行内核程序
进入内核态时,内核会
- 验证系统调用的参数(例如,检查是否有权限访问要访问的地址)
- 决定是否执行所请求的操作(例如,检查是否允许写入指定文件)
内核要控制进入监督者模式的入口点(只能通过指定的指令进入),如果应用程序可以自行决定内核的入口点,那么恶意程序就可以在跳过参数验证的地方进入内核。
3. 部分代码介绍
4. 进程
- xv6中隔离的基本单位
- 防止一个进程破坏或窥探另一个进程的内存
- 默认所有用户程序都是恶意的
页表
-
每个进程都有一个独有的页表,定义了进程的地址空间,记录了所有分配给该进程的物理内存页。
-
页表空间从0地址开始,依次是
指令,全局变量,栈区,堆区 (用于malloc)
-
trampoline包含了进入和离开内核的代码,trapframe用于保存/恢复用户进程的状态。Xv6使用这两个进入和返回内核,将在第四章详细解释; -
页表能表示的大小:RISC-V的指针是64位宽,硬件在页表中查找虚拟地址时只使用低39位;而xv6只使用这39位中的38位。因此最大的地址是\(2^{38} - 1\) = 0x3fffffffff,
MAXVA(kernel/riscv.h:363) -
xv6将每个进程的状态保存在
struct proc(kernel/proc.h:85)中,-
p->pagetable:指向页表的指针 -
p->state:进程状态:分配、准备运行、运行、等待I/O、退出
-
-
每个进程有一个线程,在用户态执行用户的程序,线程执行程序时的相关信息将保存在页表的栈区中
- 当内核切换进程时,线程的状态会保存在栈区,当调度回来时,仍可正常执行
- 进程的栈区仅用于执行用户程序,内核有自己的页表,进入内核时,将不会使用用户态的堆栈,因此,即便用户栈被破坏,内核仍不受影响
进程进入内核态:
- 使用
ecall指令,提升硬件权限,此时会跳转到内核安排好的内核入口点代码 - 通过入口点代码切换到内核堆栈,执行系统调用
- 执行完成后,通过
sret指令降低硬件权限级别,返回到用户空间
总结
- 使用页表,让进程有自己独享内存的错觉
- 使用线程,让进程有自己独享CPU的错觉
- 在xv6中,一个进程由一个地址空间和一个线程组成。在实际的操作系统中,一个进程可能有多个线程,以充分利用多个CPU。
XV6启动和第一个进程的创建相关分析在代码分析中

浙公网安备 33010602011771号