《oranges:一个操作系统的实现》阅读笔记

第一章 第一个程序

1. 为什么引导扇区要以0x55aah为结尾,还有为什么org 0x7c00h对执行程序有什么作用?

第一个程序我用bochs+软盘映像按照书上第二章的命令来实验, 毕竟现在找个软盘不容易。但是整个实验现象是如何产生的,是如何到最后在屏幕左上角显示出 Hello, Os World!这串字符串的?这些都是需要搞明白的。这里面有几个知识点,1:开机启动流程 ;2:引导扇区
开机启动流程:
1) 打开电源, 一通电源其实CPU已经开始工作了,CS: eip 指向 FFFF:0, 而FFFF:0处存放着一条跳转指令, 所以CPU就执行这条跳转指令
2) 跳转指令跳转到BIOS ROM中的程序中执行,控制权交给BIOS
3) BIOS 进行硬件检测和一些程序初始化比如设置一些BIOS中断向量(16位下)
4) BIOS根据硬件设置,取得第一个可开机装置(这也是我们经常装系统是需要去BIOS中设置的开机启动装置顺序)
5) BIOS去开机装置中加载数据,比如硬盘或者软盘就会去读取0号柱面0号磁柱1号扇区(MBR)中的数据,加载到内存0:7c00中(同时用0x55aa作为对引导扇区的校验, 如果不是以这两个字节数据结束,数据加载失败),加载完后cs:eip指向 0:7c00(加载过程是通过调用BIOS提供的扇区读取中断程序)
6) 从0:7c00开始执行程序,CPU控制权从BIOS转移到开机管理程序也就是从硬盘或者软盘第一个扇区加载进来的数据,所以严格意义上说第一个程序只是一个开机管理程
7) 我们的程序调用BIOS提供的中断程序向显存中写入字符串,并传递数量,现实属性等参数
8) 最后调用 jmp $进入无限循环

通过这个启动流程发现其实我们写org 0x7c00h并不能认为将程序加载到7c00处去执行,上面7)之前全部都是硬件执行,我们控制不了,我们做的只是将数据放到确定的地 方,让硬件去读去执行,我们写org 0x7c00h 只是让编译器将其他标签的偏移地址设置正确,如果我们写成org 0x1000h,程序依然会被加载到 0:7c00处,但是 mov ax, BootMessage这句就会执行出错, 因为此时BootMessage会变成 1000h+ 1c(BootMessage和程序开头之间所有指令长度总和),但字符串实际是存在 0:7c1c处的。


引导扇区:
我们以硬盘的引导扇区为例,0柱面0磁道1扇区是整个硬盘的第一个扇区,也是所谓的引导扇区MBR。MBR总共512字节, 446开机管理程序 boot loader,64字节的分区 表, 2字节 0x55aa校验字节。这个开机管理程序是由操作系统写进去的,所以开机管理程序认识操作系统安装分区的文件系统,可以找到操作系统的核心文件,然后加载进 内存,并 将CPU控制权交给操作系统。一个硬盘只有一个MBR,但是当将磁盘进行磁盘分区后,每个分区都会有一个启动扇区,每个分区都会被格式化为一种文件系统
启动扇区都可以安装boot loader,boot loader认识核心文件在文件系统的位置。这就是为什么可以创建双系统的原因。像下图:
《oranges:一个操作系统的实现》阅读笔记_第1张图片
首先安装windows操作系统,windows占有第一个分区叫做C盘吧,windows系统将自己的boot loader写入MBR,同时也会写入C盘分区的启动扇区(左下角的蓝块),这时如 果有其他分区比如D,E,其他分区的启动扇区都会写入boot loader
加入你现在想安装双系统,你需要分割出一个分区给linux, 叫D分区吧(当然一旦格式化成linux的文件系统比如ext3,windows就不认识这个分区了,在windows的文档管理 里也就看不见这个盘了),格式化分区(也就是写入文件系统信息),然后将linux的boot loader写入MBR和自己所在分区D的启动扇区。
启动机器时执行MBR的boot loader(因为这是最后linux写入的,而linux的boot loader不会覆盖windows所在分区的启动扇区)提供选单,MBR 的 boot loader可以直接加载l inux的核心文件(因为它认识linux的文件系统), 可以转向windows启动扇区的boot loader然后再由windows 自己的boot loader加载windows的核心文件,也可以转向linux启动 扇区的boot loader然后加载Linux的核心文件。这就是多重操作系统的原理。


你可能感兴趣的:(阅读笔记)