xv6

xv6

晚风吻尽荷花叶 17 2025-03-07

为什么要操作系统?管理计算机的硬件资源,为应用程序提供服务。

在硬件看来,压根就不知道操作系统,cpu只是无情的执行指令的机器罢了。

在应用程序看来,操作系统是上帝,可怜的应用程序们生活在在一个相当受约束的世界里,只能执行基本的指令,访问有限的内存,通过系统调用,上帝会给你们想要的结果,应用程序只等结果就可以了。

本文是在分析xv6源码后的一点记录。

1.初始化sp(Machine mode)

操作系统本质上是一个由汇编语言和c语言写成的程序,为了创造c语言的运行环境,xv6操作系统一开始就初始化了sp栈指针寄存器。

对于多核系统,每个cpu需要不同的sp来管理自己的运行时环境。

2.为跳转到S态做必要准备(machine mode)

cpu不同的特权等级是为了对程序能访问的资源加以限制。

操作系统一般运行在S态下,所以在跳转到s态前要做一些准备工作。

例如,将中断和异常委托给操作系统处理,配置pmp给S态所有资源的访问权限,暂时禁止分页机制,申请时钟中断。

然后mret直接跳转到S态。

3.做一系列主要的初始化工作

在多核系统中,从这里开始,只有一个核做主要的初始化工作,直到创造出第一个进程,剩下的空转等待,最后汇合。

  1. 串口初始化,可使内核打印出一些信息;

  2. 物理内存的初始化管理,用的是空闲链表头插,这里有并行问题,比如两个核同时申请或者释放物理内存,需要加锁保护。

  3. 将内核的虚拟地址空间映射到物理内存,但是这里大多是直接映射,比如IO空间,memory空间,代码和数据,但trampoline和tramframe还有进程的内核栈不能直接映射,因为他们都在虚拟地址空间的高空间,本质往PTE填写内容的过程,最后返回根页表页的物理地址。

  4. 启用分页,之后访问内核也可用虚拟地址。