G RUB 源代码分析
资料来源:
http://linuxsir.org/bbs/thread170348.html
合集者: tbfly ( tbfly@smth , luzhihe@88 )
下文均是上面链接各网友精彩发帖的集合,除了明显的错误修改外,并无内容修改。若有 出
入请参考原链接。
�
phyma
phyma
phyma
phyma :
基于 0.93 grub 。
其实总体上我们可以把 grub 看成一个 mini os , 他有 shell , 支持 script , 有文件系统 … …
我们可以把 stage1 , stage1 . 5 看成一个 boot loader ,而 stage2 则是一个 os ,只不过这个 os 是
专门 load 其他 os 的 os ,为此, stage2 支持像 kernel , initrd , chainloader 等等为此目的而设
置的内部 “ 命令 ”……
1. 简略流程
(如果你不熟悉 grub ,建议您先看完这这一节再向后)
a , Bios 执行 int 0x19 ,加载 MBR 至 0x7c00 并跳转执行。
如果你安装 grub 到 mbr , grub 的安装程序会把 stage1 ( 512B )拷贝到 mbr 。
视 stage2 的大小,安装程序会在 stage1 中嵌入 stage1 . 5 或者 stage2 的磁盘位置信息。
b , stage1 开始执行,它在进行直接加载 stage1 . 5 或者 stage2 并跳转执行(还有些额外的工
作,这里忽略先)
stage1 . 5 很无辜,除了加载 stage2 以外它没有其他任何作用。
所以,不论是哪种情况,这一步的结果都是 stage2 开始运行了。
c
,
stage2 这个 mini os 终于开始正式运行了!它会把系统切入保护模式,设置好 C 运行环 境
(主要是 bss )
他会找 config 文件先(就是我们的 menulist ) , 如果没有的话就执行一个 shell ,等待我们 输
入命令。
然后 grub 的工作就是输入命令 - 解析命令 - 执行命令的循环,当然 stage2 本身也很无辜, 他
是为加载其他 os 而存在的, 所以如果情况允许,在他执行 boot 命令以后就会把控制权转 交
出去!
2. stage2- 文件系统
a ,调用接口
类似系统调用,在 stage2/disk_io.c 中定义了 grub_open,grub_close,grub_read,grub_dir
全局函数用于 stage2 的文件操作 : 打开,关闭,读,切换目录。
为了简化文件系统驱动的编写, grub 不支持磁盘写(对于一个 loader 来说也没有必要去写
磁盘)
b ,文件系统驱动接口
任何一个文件系统驱动必须在 fsys_table ( stage2/disk_io.c )数组中去放置一个