一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第14天,点击查看活动详情。
原文链接 xv6-riscv文档
2.5 进程概览
和其他Unix操作系统一样,xv6隔离的单元是进程(process) 。进程抽象防止了进程间互相破坏和查看其他进程的内存、CPU、文件描述符等信息。这也防止了进程破坏内核,所以进程不能颠覆内核的隔离机制。内核必须仔细的实现进程抽象因为一个有错误或者有问题的应用会引导内核或者硬件做一些坏的事情,比如规避隔离。内核使用实现进程的机制包括了用户/特权模式标记,地址空间和时间片切换的线程。
为了实现隔离,进程抽象构造了程序拥有他自己私有机器的假象。进程提供了给了程序看起来是私有的内存,或者说地址空间,这些空间是其他进程不能读写的。进程也提供给程序看起来是属于自己的来执行程序指令的CPU。
xv6使用硬件实现的页表来给每个进程它自己的地址空间。RISC-V的页表提供了虚拟地址(指令运行的地址)到物理地址(CPU送到内存的地址)的转换。
xv6给每个进程维护了一个分离的定义内存地址空间的页表,就像图2.3展示的那样,地址空间包含了从虚拟地址0开始的进程的用户内存。最下面的是指令,跟着的是全局变量,然后是栈,最后是进程可以按需拓展的堆空间。有很多限制进程地址空间范围的因素:RISC-V的指针是64位的,硬件只使用低39位在页表中寻找虚拟地址,而xv6只使用了39位中的38位,因此最大的地址是2^38-1 = 0x3fffffff,这就是MAXVA的值。在xv6地址空间的顶部,xv6反转了一页来提供给trampoline和trapflame。xv6用这两页来进入到内核并且返回,trampoline页包含了进入和离开内核的代码,映射trapflame是必要的来存储和获取用户进程的状态信息则是必要的,我们会在第四章中解释。
感谢阅读。