grub2-自身启动-阅读笔记

1. BOIS->MBR执行0扇区的boot.s,它将第二扇区的diskboot.s读到GRUB_BOOT_MACHINE_BUFFER_SEG=0x7000先缓冲(实际地址是0x70000高于0x8000),再copybuf到内存0x8000处;

2. diskboot.s将其后面的扇区(grub内核)读到GRUB_BOOT_MACHINE_BUFFER_SEG=0x7000先缓冲(实际地址是0x70000高于0x8200),再copybuf0x8200处,其实这部分就是grub的内核了(下图第1幅)

3. 实际上内核一般情况下是压缩的,结构应该是 汇编代码(用来解压,startup.s)+压缩的内核及模块

4. 由于startup.s在内核首部,所以它正好处于0x8200处。diskboot.s从磁盘上将内核加载到0x8200后,就跳转到0x8200去执行startup.s(下图第1幅)

5. startup.s包括 初始化、用reedsolomn校验内核完整性、多重载入支持、lama解压(见后)、其它函数库。startup.s会将其身后的内核解压到1M的位置(下图第2幅)。

6. kernel.img被解压到1m地址后,生成kernel和modules,kernel解压后被移动到低地址0x8200继续执行(注意覆盖了原来startup.s的位置),modules依旧保存在1M以上的地址(模块的位置没变)

7. 加载模块,一般情况下进入normal模式

++++++++++++++++++++++++++++++++++++++


++++++++++++++++++++++++++++++++++++++++++++

modules部分先是一个module总头结构,然后是每个module信息;每个module又包含一个module头,紧接着一个elf文件格式

其中modules是以下的结构

 


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