GRUB是目前较流行启动引导程序。其第二版被主流Linux发行版所包括。本文将探索和分析GRUB的设计和实现机制。

boot.S是第一个研究对象,因为boot.S将被编译成boot.img(512字节),安装时安装在0号扇区,即主引导扇区(MBR)。

BIOS引导时会把主引导扇区装载到0x7c00开始的512字节内存区域,并设置CS:IP为0x0000:7c00。接着CPU会执行0x7c00处的指令,即boot.img(boot.S)中的第一条指令: jmp LOCAL(after_BPB) /* 机器码: eb 63 */ ,跳转到偏移量0x65的地方。

接下去的代码检查并设置正确的引导驱动器号码。

设置实模式堆栈指针为0x2000。

打印提示信息,如果没按SHIFT键并且不是SILENT引导的话。

调用BIOS中断INT 0x13, AH 0x41检测BIOS是否支持磁盘LBA模式。

如果支持LBA模式,通过BIOS中断INT 0x13, AH 0x42来装载1号扇区到地址0x70000(0x7000:0000)开始的内存区域。

如果不支持LBA模式,就使用CHS模式。通过BIOS中断INT 0x13, AH 0x02装载1号扇区到地址0x70000(0x7000:0000)开始的内存区域。这里会先调用BIOS中断INT 0x13, AH 0x13来获取磁盘参数。如果失败了并且启动盘是软盘的话,会进行软盘探测。有意思的是软盘探测的代码是放在偏移量0x1be开始的区域内的,也就是硬盘分区表在MBR中的相应位置。因为软盘是不使用硬盘分区表的,所以覆盖没有关系。而当boot.img被安装到硬盘上时,安装时这段代码将不会被复制,因为硬盘引导不需要进行软盘探测,失败就失败了。

接下来跳转到被命名为copy_buffer的一段代码来将前面装载到地址0x70000的1号扇区数据复制到内存地址0x8000开始的内存区域。

最后,在偏移量0x016f处执行指令 jmp *(kernel_address) /* 机器码: ff 26 5a 7c */ 会跳转到0x8000执行下一条指令。

至此boot.S中的代码执行完毕。

下一篇

最新文章

  1. php Zend Opcache,xcache,eAccelerator缓存优化详解(具体根据个人需要选择其一即可,功能都一样切勿重复选择)
  2. WPF 自定义滑动ScrollViewer
  3. MySQL常见错误
  4. ajax post 请求415\ 400 错误
  5. RestSharp使用
  6. JS对于数据常见操作
  7. Excel 数值转换为人民币大写金额字符串
  8. cocos2d 定时器
  9. MAC下查看端口占用并杀死进程
  10. 编译错误“The run destination My Mac 64-bit is not valid for Running the scheme '***',解决办法
  11. iOS开发之视差滚动视图
  12. hashCode花式卖萌
  13. 网络1711班 C语言第八次作业批改总结
  14. python爬取全名k歌
  15. Windows下 Robhess SIFT源码配置
  16. JavaSE——线程通信
  17. Binary Tree(生成二叉树)
  18. Python使用pycurl获取http的响应时间
  19. div 居中方法汇总
  20. Python基础-面向过程编程实现Linux下cat -rl ‘dir’ |grep ‘keywords’ 功能

热门文章

  1. Android下在onCreate中获取控件的宽度和高度(通过回调)
  2. Myeclipse下使用Maven搭建spring boot项目
  3. netty接收大文件的方法
  4. ie8兼容:对象不支持“trim”属性或方法
  5. python--excel
  6. react-native 学习(二)
  7. 在R语言中封装类读写sql操作工具类
  8. wiki配置文件
  9. java.math.BigDecimal
  10. My Neural Network isn't working! What should I do?