没有合适的资源?快使用搜索试试~ 我知道了~
grub源代码分析 0.93
需积分: 0 0 下载量 5 浏览量
2024-06-05
21:53:08
上传
评论
收藏 601KB PDF 举报
温馨提示
![preview](https://dl-preview.csdnimg.cn/89402182/0001-5062a2f9787837ffa7a0d8e5edf442bf_thumbnail.jpeg)
![preview-icon](https://csdnimg.cn/release/downloadcmsfe/public/img/scale.ab9e0183.png)
试读
31页
phyma 写的grub源代码分析,0.93版的grub
资源推荐
资源详情
资源评论
![application/x-gzip](https://img-home.csdnimg.cn/images/20210720083646.png)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![application/msword](https://img-home.csdnimg.cn/images/20210720083327.png)
![none](https://img-home.csdnimg.cn/images/20210720083646.png)
![thumb](https://img-home.csdnimg.cn/images/20210720083646.png)
![rar](https://img-home.csdnimg.cn/images/20210720083606.png)
![none](https://img-home.csdnimg.cn/images/20210720083646.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![rar](https://img-home.csdnimg.cn/images/20210720083606.png)
![](https://csdnimg.cn/release/download_crawler_static/89402182/bg1.jpg)
GRUB源代码分析
资料来源:
http://linuxsir.org/bbs/thread170348.html
合集者:tbfly(tbfly@smth,luzhihe@88)
下文均是上面链接各网友精彩发帖的集合,除了明显的错误修改外,并无内容修改。若有出
入请参考原链接。
�
phyma
phyma
phyma
phyma:
基于0.93grub。
其实总体上我们可以把grub看成一个minios, 他有shell, 支持script, 有文件系统……
我们可以把stage1,stage1.5看成一个bootloader,而stage2则是一个os,只不过这个os是
专门load其他os的os,为此,stage2支持像kernel,initrd,chainloader等等为此目的而设
置的内部“命令”……
1.简略流程
(如果你不熟悉grub,建议您先看完这这一节再向后)
a,Bios执行int0x19,加载MBR至0x7c00并跳转执行。
如果你安装grub到mbr,grub的安装程序会把stage1(512B)拷贝到mbr。
视stage2的大小,安装程序会在stage1中嵌入stage1.5或者stage2的磁盘位置信息。
b,stage1开始执行,它在进行直接加载stage1.5或者stage2并跳转执行(还有些额外的工
作,这里忽略先)
stage1.5很无辜,除了加载stage2以外它没有其他任何作用。
所以,不论是哪种情况,这一步的结果都是stage2开始运行了。
c
,
stage2这个minios终于开始正式运行了!它会把系统切入保护模式,设置好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)数组中去放置一个
链接已不可用
![](https://csdnimg.cn/release/download_crawler_static/89402182/bg2.jpg)
struct fsys_entry 的结构体,定义如下( stage2/filesys.h
) :
struct fsys_entry
{
char *name; // 文件系统名称
int (*mount_func) (void); // 初始化函数
int (*read_func) (char *buf, int len); // 文件读函数
int (*dir_func) (char *dirname); // 目录 / 文件打开函数
void (*close_func) (void); // 文件关闭函数
int (*embed_func) (int *start_sector, int needed_sectors); // ?大部分驱动设置此项为 NULL
};
c ,情景:读入文件
假设在 grub 的 m enulist 中有: kernel (hd0,0)/boot/vmlinuz (或者我们在 grub shell 中执行此 命
令)
stage2 会先调用 grub_open("(hd0,0)/boot/vmlinuz") 来打开文件。
在执行这个函数中, grub 会先在 fsys_table 中循环调用 fsys_entry
: :
mount_func 去发现一 个
返回值为真的文件系统,即为当前的文件系统。然后利用当前文件系统驱动的 fsys_entry
::
dir_func 去打开 /boot/vmlinuz
然后 stage2 会调用 grub_read(buf,0) 读入全部的 /boot/vmlinuz 文件至内存中的 buf 地址
grub_read 是 fsys_entry
: :
read_func 的封装。
最后 stage2 回调用 grub_close 关闭文件,跟前面一样,这个调用仅仅是当前文件系统
fsys_entry
: :
close_func 的简单封装。
d ,文件系统驱动
你可以在 stage2/fsys_*.c 找到各个文件系统驱动, 当然你如果对某个文件的结构熟悉, 而 g rub
中又没有相应的驱动, 你可以 按照 b 节中方法向 grub 中添加此文件系统的支持, 比如 NTF S
,
你只要实现 mount (判断是否是你所支持的文件系统) ,
dir
(打开文件或者目录) ,
read
(
读) ,
close (关闭文件)功能就好。
3. stage2-Shell
大部分情况我们是通过一个 menulist 文件来控制 grub ,这样 grub 会分析此文件的内容,然
后显示一个菜单让我们选择。但是我不打算介绍 grub stage2 时怎样显示这个菜单的,这不
是 grub 特殊的地方,这一节将对菜单选择执行的底层机制做小小的分析。 (在 grub 没有找
到 menulist 的时候, 它 就会执行一个 shell ,你完全可以通过这里内置的命令来控制 grub
,
实际上你可以把 menulist 当作一个脚本文件,它也完全是通过内置命令执行的)
a , stage2 流程
stage1 或者 stage1 . 5 加载完 stage2 后,会跳转至 stage2 执行, stage2 的入口是 stage2/asm.S
asm.S 在设置好 C 运行环境之后,会调用第一个 C 函数 init_bios_info ( stage2/common.c
),
这个函数在执行一些底层的初始化之后, 会调用 stage2 的 main 函数
cmain
( stage2/stage2.c
),
这样 stage2 这个 mini os 正式开始运行了!
针对 menu. l st 和 shell 这两种情况, cmain 将:
menu.lst: run_menu()(stage2.c)->run_script()(cmdline.c)->find_command-> 执行命令函数
![](https://csdnimg.cn/release/download_crawler_static/89402182/bg3.jpg)
shell: enter_cmdline()(cmdline.c)->find_command-> 执行命令函数
殊途同归,最后都归结为命令行的解释执行 find_command ( stage2/cmdline.c )
按照 menu.lst 中或者 shell 用户输入的命令字符串,在一个全局性 struct builtin
*builtin_table[](stage2/builtin.c) 变量中去找到内置命令的函数,然后执行。
值得一提的是 grub 的 shell 类似 bash 的命令补全和命令历史纪录。
b ,内部数据结构
struct builtin
{
/* 命令名称,重要,是搜索命令时的依据 */
char *name;
/* 命令函数,重要,是搜索匹配后调用的函数 */
int (*func) (char *, int);
/* 功能标示,一般未用到 . */
int flags;
/* 简短帮助信息 */
char *short_doc;
/* 完整帮助信息 */
char *long_doc;
};
struct builtin *builtin_table[] ; (stage2/builtin.c)
c , Hack 提示
编写一个自己的 grub 命令。只需按照 b 节所述,填充一个 struct builtin 结构,按后将其指 针
放入 builtin_table 指针数组,你就可以在 menu.lst 或者 grub shell 中使用这个命令了。
4. TODO
�
home_king
home_king
home_king
home_king :
引用 :
针对上面,我来修正一下。
stage1 的代码文件,是源码目录下 stage1/stage1.S ,汇编后便成了一个 512 字节的 img
,
被写在硬盘的 0
0
0
0 面 0
0
0
0 道第 1
1
1
1 扇区 ,作为硬盘的主引导扇区。
作者 : phyma
视 stage2 的大小,安装程序会在 stage1 中嵌入 stage1 . 5 或者 stage2 的磁盘位置信息。
b
,
stage1 开始执行,它在进行直接加载 stage1 . 5 或者 stage2 并跳转执行(还有些额外的工作
,
这里忽略先)
stage1 . 5 很无辜,除了加载 stage2 以外它没有其他任何作用。
![](https://csdnimg.cn/release/download_crawler_static/89402182/bg4.jpg)
注意,硬盘主引导扇区 = 硬盘主引导记录( MBR ) + 硬盘分区表( DPT )
stage1 的工作并不是加载什么 stage1 . 5 或者 stage2 , 而是加载 0
0
0
0 面 0
0
0
0 道第 2
2
2
2 扇区 上的 512 字
节代码至 0x8000 ,然后跳至 0x8000 执行。这里我们提及的另一个 512 字节代码,是来
自源码目录下 stage2/start.S 文件的,而 start.S 的作用是作为 stage1 . 5 或者 stage2( 视乎
编译 grub 时的指定 ) 的总入口,它才是 stage1 . 5 或者 stage2 的真正加载器。
总结起来, 那么就是 stage1 加载 start , 然后将执行权交给 start , 由 start 来加载 stage 1 . 5
或者 stage2 。所以,斑竹说的 “ 安装程序会在 stage1 中嵌入 stage1 . 5 或者 stage2 的磁盘
位置信息 ” 这句话是错误的。
大家想验证这些关系,请使用以下命令 ( 这里假设你把 grub 安装在第一个 IDE 硬盘 )
:
代码 :
stage2 的内幕并不神奇,正如斑竹所言,是一个 mini OS ,但我们觉得 GRUB 神奇的地方在
于文件系统的识别功能。这种神奇色彩也就是 " 鸡蛋与鸡谁先有 " 的矛盾体。
PC 上电后,就会执行 BIOS 的代码, BIOS 将加载硬盘主引导扇区,总共 512 字节的二进制
代码,这些代码就是 stage1 ,然后 BIOS 将执行 stage1 。这一点大家都不会感到奇怪,这 是
很自然的流程。然而, stage2 的体积比较大 ( 因为它实现的功能比较全面嘛 ) ,所以一般 stage 2
不会被放在固定的磁盘扇区中以供 stage1 只使用 BIOS 例程便可对其 raw read
,那么,
stage 2
就会作为一个文件被放在文件系统里。
大家都知道, stage1 . 5 就是文件系统的支撑代码,在 stage1 . 5 没有被加载以前, stage2 是不能
被 stage1 找到的,所以我们研究 GRUB ,关键看看究竟 stage1 是怎么加载 stage1 . 5 的,而
stage1 . 5 又被放在哪里。
接着上面的话题。
stage1 . 5 究竟被放在哪呢?很多兄弟可能以为它就是 /boot/grub/ 底下的哪些 xxfs_stage1_5 文
件,但试想一下,要找到 boot 分区所在的 stage1_5 文件,那么就必须使得 stage1 具备文 件
系统识别功能,而 stage1 . 5 本身就是文件系统的支撑代码,它必须加载 stage1 . 5 才能具备 这
种功能。那么,我们又回到了那种矛盾体的悖论 ── 要加载 stage1 . 5 来找到 stage1 . 5 ? 呵呵
。
所以 用来识别 boot 分区文件系统的 stage1_5 不能作为文件来被 stage1 读取,它只能被存放
在固定的扇区中。这里强调 " 用来识别 boot 分区文件系统 " ,那是因为并不是所有的 stage1 . 5
文件都被放在固定扇区的,只有 boot 分区的文件系统对应的 stage1 . 5 才会被放在固定的扇
1.
倾印 stage1.S 的机器代码映像 dd if=/dev/hda of=BOOT.img bs=1 count=512
2.
倾引 start.S 的机器代码映像 dd if=/dev/hda of=START.img skip=512 bs=1 count=512
3.
用 emacs 打开这些映像,并将它们转换为 16 进制格式来查看 emacs xxx.img M-x hexlify-
buffer 同时对照一下源码中的内容,尤其是那些 "GRUB" 、 "Loading stage1.5" 等静态显示数
据,你就会验证了上面我的说法,并且在 start.S 中找到更多的内幕。
![](https://csdnimg.cn/release/download_crawler_static/89402182/bg5.jpg)
区中去!比如说,你的 boot 分区的文件系统是 ext2 ,那么在安装 GRUB 的 stage1
的时候,
e2fs_stage1_5 就会被存放至一个固定的扇区集,而其他的如 reiserfs_stage1_5 就依然作为文
件来存放,以供 GRUB 使用 root() 命令来识别 其他的 boot 分区 ( 那时候, stage2 已经被加载
了,所以这个不成问题 ) 。
那么,如何验证我上面的说法呢?还是使用 dd 命令。
代码 :
查找这两个文件中相同的字符串,如 "Loading stage1.5" , "GRUB" 等,同时注意到它们交集
的行数数量,你会发现,原来 e2fs_stage1_5 被放在 0 面 0 道的第 3 个扇区开始往后 10 多 K 的 扇
区集里。
这里是 e2fs_stage1_5 文件的 hex 倾印片断:
这里是从 0 面 0 道的第 3 个扇区倾印片断:
1.
dd if=/dev/hda of=STAGE1_5.img bs=1k skip=1 count=20 将 STAGE1_5.img 用 emacs 打开
,
转换为 hex 格式查看。
2.
将 /boot/grub/e2fs_stage1_5 拷贝一份到当前目录, 用 emacs 打开, 转换为 hex
格式查看。
注
意, 如果你的
boot 分区是别的文件系统, 应该打开对应的 stage1_5 文件来查看。 我这里的 boot
分区为 ext2 文件系统。
剩余30页未读,继续阅读
资源评论
![avatar-default](https://csdnimg.cn/release/downloadcmsfe/public/img/lazyLogo2.1882d7f4.png)
![avatar](https://profile-avatar.csdnimg.cn/default.jpg!1)
2301_77312364
- 粉丝: 0
- 资源: 1
上传资源 快速赚钱
我的内容管理 展开
我的资源 快来上传第一个资源
我的收益
登录查看自己的收益我的积分 登录查看自己的积分
我的C币 登录后查看C币余额
我的收藏
我的下载
下载帮助
![voice](https://csdnimg.cn/release/downloadcmsfe/public/img/voice.245cc511.png)
![center-task](https://csdnimg.cn/release/downloadcmsfe/public/img/center-task.c2eda91a.png)
最新资源
- 652027170733254多亿影视.apk
- 创新实践CNN车牌识别项目
- 小程序版图像分类算法对中文数字识别-不含数据集图片-含逐行注释和说明文档.zip
- 公交卡管理系统一个实验
- C语言学生成绩管理系统(信息可保存读取txt文件)
- 网上零食销售系统论文.docx
- 小程序版图像分类算法对电脑配件分类识别-不含数据集图片-含逐行注释和说明文档.zip
- 小程序版深度学习CNN训练识别8种水果-不含数据集图片-含逐行注释和说明文档.zip
- 小程序版基于深度学习对手势动作分类识别-不含数据集图片-含逐行注释和说明文档.zip
- 小程序版深度学习CNN训练识别手写数字图像中的数字分类-不含数据集图片-含逐行注释和说明文档.zip
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
![feedback](https://img-home.csdnimg.cn/images/20220527035711.png)
![feedback](https://img-home.csdnimg.cn/images/20220527035711.png)
![feedback-tip](https://img-home.csdnimg.cn/images/20220527035111.png)
安全验证
文档复制为VIP权益,开通VIP直接复制
![dialog-icon](https://csdnimg.cn/release/downloadcmsfe/public/img/green-success.6a4acb44.png)