SystemInit系统初始化时钟源码分析
伪代码如下:
前面已经分析了XV6的启动流程以及内存管理,接下来,我们探究进程调度的实现。与其说进程调度,我觉得可以顺应内存的虚拟化的叫法,将进程调度称为“CPU的虚拟化”更加贴切。
首先明确目前XV6的cpu的状态如下:关中断 & 进入了保护模式 & 安装了包括【内核&用户】【代码&数据】段描述符 & BSP分配了一个4K的内核栈 & 开启了以kmap为基础的粒度为4K的内核分页。
Onix相关链接:
XV6-x86的github链接:
Onix是一款相对于XV6来说功能更为健全的单核OS,由于功能更加完善,Onix也更加复杂。代码阅读起来会比较绕。
XV6是一款简单易读的多核操作系统,但其功能相对Onix来说更为简陋,比如Onix对物理内存的管理采用了位图、内核内存和进程相关的内存进行了分开管理,页目录使用单独的内核内存,没有和页表、页框混用等。而XV6显得非常简陋。尽管XV6的实验可以弥补部分缺陷。
Onix操作系统也实现了bootloader,对于将OS加载到内存的操作,Onix是采用汇编进行内核加载,并且在加载内核前,还会进行一个内存探测的操作,所以Onix的bootloader稍微有些复杂。而XV6操作系统的启动操作写的非常简洁,加载内核的操作采用的是C语言的形式,非常利于阅读学习,但是XV6不会进行内存探测。为求方便,本文主要叙述XV6的启动流程。
Onix相关链接:
XV6-x86的github链接:
前一章我们介绍了XV6的启动流程,在本章,我们就要开始介绍类Unix操作系统最重要的一部分——内存管理模块。
本文以XV6里面的内存管理为主,后面会提炼Onix中内存管理比较好的部分,来对XV6进行一个补充。
Onix相关链接:
XV6-x86的github链接: