操作系统真象还原整体观
操作系统真象还原整体观
说明
该整体观,适合于完成操作系统真象还原代码编写实践的同学。用于从繁复,庞杂的代码细节梳理出主线,完成认知简化与升华。
基于操作系统实践的整体观完美状态应是:讨论某个代码细节,能意识到这是为了完成什么目的,服务于什么样的操作系统原理与机制。当我们讨论某个操作系统原理与机制,能随时回到代码细节,想到大概用什么数据结构,什么算法去实现这些。
特别感谢
梁哲浩、王柔柔、徐琦、崔健、索九博、李瑞东
第一章
使用vmware + ubuntu+ bochs完成环境搭建。
问题 | 问题意义 | 答案(仅做参考) |
---|---|---|
vmware扮演了什么角色? | 理解vmware的功能 | vmware提供了一个虚拟化平台,运行在此平台中的操作系统不会影响到原系统。比如我们在这个平台中运行一个linux发行版,那么这个linux系统就与原windows系统隔离开。这样,我们既能够享受到windows的生活便利(比如游戏,日常软件),也能享受到linux的开发便利(Linux非常适合开发,但是日常使用欠缺)。能扮演这个角色的还有virtulbox,wsl。 |
ubuntu扮演了什么角色? | 理解ubuntu的功能 | ubuntu提供了便捷,高效的开发环境。开发我们的操作系统需要使用众多编译工具,如gcc(编译c语言代码),nasm(编译汇编代码)等,这些在ubuntu上安装与使用就是一行命令的事情。能扮演这个角色的还有众多其他Linux发行版,比如centos,deepin等。 |
bochs扮演了什么角色? | 理解bochs的功能 | 模拟完整的 x86 硬件环境,并提供调试功能(如单步执行、查看寄存器/内存)。我们开发的是一个x86_32系统,自然需要模拟x86的硬件环境,而bochs就是扮演此角色。能扮演这个角色的还有qemu,但是qemu并不提供硬件级调试环境,无法更加细致的看到运行细节(单步执行机器指令,查看寄存器等操作),开发操作系统是必须掌握每一句代码会对机器产生什么影响。 |
三者如何共同发挥作用? | 理解三者之间的配合 | vmware+ubuntu提供了一个虚拟,且高效的开发环境。bochs模拟了x86环境,我们开发的操作系统就是在这个模拟的硬件环境上运行。 |
第二章
按照BISO的规定编写mbr,以实现BIOS能够找到mbr,识别mbr,加载mbr,最后跳转至mbr中执行。
BIOS是电源启动后运行的第一个软件,它在只读存储器ROM上,cpu在开机时cs:ip寄存器会被强行初始化为一个固定值,该固定值就是ROM中的BIOS入口,所以cpu在开机时就会直接执行BIOS。BIOS会进行硬件的检测与初始化,建立中断向量表便于后续可以通过int中断号来实现相关的功能调用,最后BIOS检测启动盘的0号盘面0号磁道1号扇面的内容,若此扇区的末尾2个字节是魔数0x55和0xaa,那么BIOS就会认为此扇区有MBR,接着BIOS就将此扇区的内容加载到物理地址0x7c00处,CPU跳转到0x7c00处执行MBR。
问题 | 问题意义 | 答案(仅做参考) |
---|---|---|
BIOS的英文全称与中文名称 | 理解BIOS的功能 | basic input output operating system,基本输入输出系统。从名称中就可以看出,它是一个非常基本的系统,需要一开始就运行。 |
BIOS为什么能做到开机就运行 | 理解BIOS为什么能一开始就被执行 | BIOS放在ROM中,而ROM中的内容不会断电消失。CPU开机时,其指令指针寄存器会强制初始化为一个固定值,该固定值就是ROM中的BIOS第一行代码。 |
ROM与RAM的关系 | 理解二者区别与联系 | 区别:ROM中的内容为只读,但是断电不会消失。RAM中的内容可擦写,断电会消失。 联系:ROM与RAM经过主板的统一编址,可以使用统一的地址进行访问。比如地址0-100访问的是RMA,地址100-200是ROM。 |
MBR英文全称与中文全称 | 理解MBR的功能 | Master Boot Record,主引导记录。主的意思是计算机开机以后访问硬盘时所必须要读取的第一个扇区(因为这里存储了元数据,读硬盘先读元数据就像你看论文先看目录),引导的意思是用于引导计算机开机,记录的意思是内容。合起来的意思就是,放在第一个扇区中用于引导计算机开机的内容。 |
为什么MBR能被BIOS找到 | 理解BIOS与MBR之间的约定 | 因为MBR就放在硬盘第一个扇区中,这个位置是固定的,BIOS会来这里找MBR。 |
BIOS如何识别第一个扇区中的内容是MBR | 理解BIOS与MBR之间的约定 | MBR共512字节大小,最后两个字节是固定的魔术,这样BIOS就知道,哦,这个扇区中的内容是MBR |
BIOS如何将接力棒交给MBR,或者换个问法,CPU是如何执行完毕BIOS后又执行MBR的 | 理解BIOS与MBR之间的约定 | MBR的内容总共就512字节大小,BIOS将这部分内容加载到固定的内存位置后,直接跳转这个固定位置开始执行就行了 |
编写MBR代码时,为什么会填充大量的0 | 理解BIOS与MBR之间的约定 | 因为MBR是固定大小512字节,最后两字节为魔术。所以我们需要填充大量的0,将魔术挤到最后的两字节位置去 |
第三章
编写更强大的加载器loader,实现mbr找到、加载、跳转执行loader。
问题 | 问题意义 | 答案(仅做参考) |
---|---|---|
loader一看名字就是个加载器,MBR的也是用来加载的(加载loader),为什么MBR与loader功能重合 | 理解loader与mbr的关系 | mbr与bios存在相关约定,导致其只有512字节,程序大小受限导致mbr功能受限。为了完成更多内容,所以我们需要一个功能更强大的加载器loader。所以mbr的使命就是来加载这个loader。就好像以前我们会用ie浏览器下载其他功能更强大的浏览器。 |
loader与mbr的关系,是不是像mbr与bios那样固定死了 | 理解loader的灵活性 | 不是,mbr去哪里找到loader,loader的大小,加载loader的物理内存地址,都是可以自己决定的,谁叫mbr的内容是我们自己写的呢? |