1.我们都知道计算机是取指执行的。
每一条指令(有一个基址,一般放在CS。有一个偏移地址,一般放在IP)。比如说我们要运行qq程序,我们首先肯定是把qq从磁盘上加载到我们的内存(不会全部加载)。我们加载到内存的肯定是一段代码。运行的时候就是取指执行。
2.问题是刚开机内存里面啥也没有,CS、IP该指向哪里呢?该执行内存中的哪一条指令呢?
3.直接说结论:刚一上电,会设置CS=0xFFFF;IP=0x0000。就会寻址到0xFFFF0(CS<<4+IP)区域。
这个区域其实就是ROM BIOS映射区(ROM没电也能保存信息),然后在这个区域检查RAM、键盘、显示器、软硬磁盘。(因此计算机执行的第一条指令就是BIOS里面的代码)
4.然后就把硬盘512字节的引导扇区加载进入内存,放在 0x07c0:0x0000。引导扇区的代码文件是bootsect.s(汇编代码)
5.然后把0x07c0:0x0000处的512个字节再放在0x9000:0x0000处。
6.然后开始运行bootsect.s的代码。然后读入磁盘中setup的4个扇区。磁盘第2个扇区开始,读4个。(int 0x13读磁盘)放到0x9020:0x0000也就是0x9000:0x0000再偏移512个字节。接着读取System模块
7:
8:然后把System模块移动到0地址。此后操作系统一直都在0地址。
9:通过改变cro寄存器,使得计算机变成32位模式(通过CS、IP、GDT表开始寻址)。
10:最后Setup.s执行了下面的代码(操作系统在次之前已经进入保护模式,就是步骤9)。
这个跳到了0地址。(通过查GDT表,而不是通过CS<<4+IP )
11:开始执行System.s代码。
12:System.s源代码最开始就是head.s。然后进行初始化GDT、IDT等操作。
13:head.s执行完之后就执行main.c(c语言)。
例:其中的mem_init其实就是将内存分页,4k一页。然后用个位图记录。