LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
楼主: phyma

Grub 源代码分析

[复制链接]
发表于 2006-8-5 20:22:03 | 显示全部楼层
是啊或许大大们说说grub4dos更好吧?它的grldr安装在MBR的部分不用类似start.s中的list,而是搜索各分区根下的grldr文件。看了上面的start.s中的list,觉得不好,当碎块太多时,list溢出就会死机。还是grldr这种办法比较可靠。
回复 支持 反对

使用道具 举报

发表于 2006-9-4 00:22:12 | 显示全部楼层
楼主好厉害~~~继续期待中~~~
回复 支持 反对

使用道具 举报

发表于 2006-9-6 10:47:08 | 显示全部楼层
Post by home_king
接着上面的话题。

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才会被放在固定的扇区中去!比如说,你的boot分区的文件系统是ext2,那么在安装GRUB的stage1的时候,e2fs_stage1_5就会被存放至一个固定的扇区集,而其他的如reiserfs_stage1_5就依然作为文件来存放,以供GRUB使用root()命令来识别其他的boot分区(那时候,stage2已经被加载了,所以这个不成问题)。

那么,如何验证我上面的说法呢?还是使用dd命令。

  1. 1. dd if=/dev/hda of=STAGE1_5.img bs=1k skip=1 count=20
  2. 将STAGE1_5.img用emacs打开,转换为hex格式查看。

  3. 2. 将/boot/grub/e2fs_stage1_5拷贝一份到当前目录,用emacs打开,转换为hex格式查看。
  4. 注意,如果你的boot分区是别的文件系统,应该打开对应的stage1_5文件来查看。我这里的boot分区为ext2文件系统。
复制代码


查找这两个文件中相同的字符串,如"Loading stage1.5","GRUB"等,同时注意到它们交集的行数数量,你会发现,原来e2fs_stage1_5被放在0面0道的第3个扇区开始往后10多K的扇区集里。
To home_king and all:

你好,我的系统是sda硬盘,有F5和XP两个系统
执行以下命令:
dd if=/dev/sda of=START.img skip=512 bs=1 count=512
dd if=/dev/sda of=STAGE1_5.img bs=1k skip=1 count=20
得到的都是0

这是为什么?
回复 支持 反对

使用道具 举报

发表于 2006-9-21 21:55:28 | 显示全部楼层
Post by biosedit
stage1要占用512字节,那分区表存放在什么地方呢?
+-----------------+
|                                              |0000
|      Master Boot Record        |
|     主分区记录(446字节)    |
|                                              |
+-----------------+01BD
|                                              |01BE
|      分区信息1(16字节)       |
|                                              |
+-----------------+01CD
|                                              |01CE
|      分区信息2(16字节)       |
|                                              |
+-----------------+01DD
|                                              |01DE
|      分区信息3(16字节)       |
|                                              |
+-----------------+01ED
|                                              |01EE
|      分区信息4(16字节)       |
|                                              |
+-------+---------+01FD
| 01FE          |01FF                 |
|          55     |                    aa  |
+-------+---------+
在stage1.S中有如下的代码:
part_start:
    . = _start + STAGE1_PARTSTART
         ......

    . = _start + STAGE1_PARTEND
如果stage1是写到MBR里的话,这里的代码是不会写到硬盘里去的。(因为这部分刚好是硬盘的分区表)
但是如果是写到软盘上的话,这部分的代码是会被写到磁盘上的

我觉得很奇怪的是,为什么stage1要先把start加载0x7000的位置,再考到0x8000的位置?直接到0x8000不就好了?
回复 支持 反对

使用道具 举报

发表于 2006-9-25 10:06:30 | 显示全部楼层
顶一下.~~~~~
回复 支持 反对

使用道具 举报

发表于 2006-9-29 00:55:48 | 显示全部楼层
跟着楼上的牛人看grub源代码。
看得过程中觉得下面的这两个链接很有帮助。
一个是介绍内存的数据分布及其相关的bios功能调用
http://www.mega-tokyo.com/osfaq/ ... mount%20of%20RAM%3F
一个是介绍mbi结构体的
http://www.gnu.org/software/grub ... nformation%20format

另外我还有些问题:
像grub中stage1的Makefile中LDFLAGS = -nostdlib -Wl,-N,-Ttext,7C00
-Ttext,7C00应该是告诉ld,代码的地址从0x7C00开始吧。
回复 支持 反对

使用道具 举报

发表于 2006-10-9 17:01:48 | 显示全部楼层
谢谢哦,好同志
回复 支持 反对

使用道具 举报

发表于 2006-10-19 10:50:42 | 显示全部楼层
顶 先下来研究一下先
回复 支持 反对

使用道具 举报

发表于 2006-11-16 01:12:50 | 显示全部楼层
Post by phyma
对,grub在设置好内核后,然后切换至实模式,具体跳向哪里取决于kernel header里面的一个字段

不可能吧,
我记得要从保护模式转到实模式只能够reset,
这样计算机就重启了呀!
回复 支持 反对

使用道具 举报

发表于 2006-11-16 16:03:26 | 显示全部楼层
留个名
这种帖子要好好的读读的
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表