Grub 原理/代码分析

本文详细介绍了GRUB的启动流程,包括stage1.s和start.s的作用。通过分析MBR、stage1.s及stage2的加载过程,展示了如何从硬盘读取GRUB的各个阶段。文章还探讨了LBA和CHS模式的切换,并提供了错误处理的代码段。通过对启动扇区的十六进制代码展示,解释了如何识别关键的加载信息。
摘要由CSDN通过智能技术生成

Grub 原理分析————给对Linux启动流程感兴趣的同僚们。

Grub的启动流程:BIOS将MBR拷贝到0000:7c00处,将控制权交给mbr中的代码——stage1.s
stage1.s 将start.s从硬盘拷贝到内存中,并跳转执行。然后start.s需要加载stage1.5,只有加载了
stage1.5才能识别文件系统,这个stage1.5和boot目录下的众多stage1.5是一样的。然而它
的位置并不在boot目录下,而是在第三个山区开始到差不多10k的位置上。加载了stage1.5后可以识别boot目录
所在的文件系统,找到stage2加载,此时一个mini os已经起来。

grub在硬盘上的分布:
第一个扇区:stage1.s   任务:加载start.s到内存中运行
第二个扇区:start.s   任务:加载stage1.5到内存中运行
第三个山区往后10k左右的空间:stage1.s  任务:加载/识别文件系统,加载boot目录下的stage2
/boot目录:stage2    任务:实现一个minios,提供一个shell,加载Linux kernel

下面找个事例来证明一下上面的分布。以xgl的ubuntu为例,将其硬盘的头20K内容dd出来
dd of=/dev/sda of=/boot.img bs=1k count=20

vi打开查看16进制代码:

第一个山区的内容如下:
      1 0000000: eb48 90d0 bc00 7cfb 5007 501f fcbe 1b7c  .H....|.P.P....|
      2 0000010: bf1b 0650 57b9 e501 f3a4 cbbd be07 b104  ...PW...........
      3 0000020: 386e 007c 0975 1383 c510 e2f4 cd18 8bf5  8n.|.u..........
      4 0000030: 83c6 1049 7419 382c 74f6 a0b5 07b4 0302  ...It.8,t.......
      5 0000040: ff00 0020 0100 0000 0002 fa90 90f6 c280  ... ............
      6 0000050: 7502 b280 ea59 7c00 0031 c08e d88e d0bc  u....Y|..1......
      7 0000060: 0020 fba0 407c 3cff 7402 88c2 52be 7f7d  . ..@|<.t...R..}
      8 0000070: e834 01f6 c280 7454 b441 bbaa 55cd 135a  .4....tT.A..U..Z
      9 0000080: 5272 4981 fb55 aa75 43a0 417c 84c0 7505  RrI..U.uC.A|..u.
     10 0000090: 83e1 0174 3766 8b4c 10be 057c c644 ff01  ...t7f.L...|.D..
     11 00000a0: 668b 1e44 7cc7 0410 00c7 4402 0100 6689  f..D|.....D...f.
     12 00000b0: 5c08 c744 0600 7066 31c0 8944 0466 8944  /..D..pf1..D.f.D
     13 00000c0: 0cb4 42cd 1372 05bb 0070 eb7d b408 cd13  ..B..r...p.}....
     14 00000d0: 730a f6c2 800f 84ea 00e9 8d00 be05 7cc6  s.............|.
     15 00000e0: 44ff 0066 31c0 88f0 4066 8944 0431 d288  D..f1...@f.D.1..
     16 00000f0: cac1 e202 88e8 88f4 4089 4408 31c0 88d0  ........@.D.1...
     17 0000100: c0e8 0266 8904 66a1 447c 6631 d266 f734  ...f..f.D|f1.f.4
     18 0000110: 8854 0a66 31d2 66f7 7404 8854 0b89 440c  .T.f1.f.t..T..D.
     19 0000120: 3b44 087d 3c8a 540d c0e2 068a 4c0a fec1  ;D.}<.T.....L...
     20 0000130: 08d1 8a6c 0c5a 8a74 0bbb 0070 8ec3 31db  ...l.Z.t...p..1.
     21 0000140: b801 02cd 1372 2a8c c38e 0648 7c60 1eb9  .....r*....H|`..
     22 0000150: 0001 8edb 31f6 31ff fcf3 a51f 61ff 2642  ....1.1.....a.&B
     23 0000160: 7cbe 857d e840 00eb 0ebe 8a7d e838 00eb  |..}.@.....}.8..
     24 0000170: 06be 947d e830 00be 997d e82a 00eb fe47  ...}.0...}.*...G
     25 0000180: 5255 4220 0047 656f 6d00 4861 7264 2044  RUB .Geom.Hard D
     26 0000190: 6973 6b00 5265 6164 0020 4572 726f 7200  isk.Read. Error.
     27 00001a0: bb01 00b4 0ecd 10ac 3c00 75f4 c300 0000  ........<.u.....
     28 00001b0: 0000 0000 0000 0000 10cc 10cc 0000 0001  ................
     29 00001c0: 0100 82fe 3f7b 3f00 0000 3d65 1e00 8000  ....?{?...=e....
     30 00001d0: 017c 83fe 3f93 7c65 1e00 18e2 0500 0000  .|..?.|e........
     31 00001e0: 0194 83fe ffff 9447 2400 6809 7c12 0000  .......G$.h.|...
     32 00001f0: 0000 0000 0000 0000 0000 0000 0000 55aa  ..............U.
可以参考其中的打印信息,如"GRUB .Geom.Hard Disk.Read.Error."。这一段字符信息可以在stage1.s代码中找到:
notification_string: .string "GRUB "
geometry_error_string: .string "Geom"
hd_probe_error_string: .string "Hard Disk"
read_error_string: .string "Read"
general_error_string: .string " Error"
这个扇区放的代码就是stage1.s代码!
最后两个字节“55aa”,说明启动扇区有效。

看第二个扇区的内容:
     33 0000200: 5256 be03 21e8 2a01 5ebf f821 668b 2d83  RV..!.*.^..!f.-.
     34 0000210: 7d04 000f 84ca 0080 7cff 0074 3e66 8b1d  }.......|..t>f..
     35 0000220: 6631 c0b0 7f39 4504 7f03 8b45 0429 4504  f1...9E....E.)E.
     36 0000230: 6601 05c7 0410 0089 4402 6689 5c08 c744  f.......D.f./..D

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值