LinuxSir.cn,穿越时空的Linuxsir!

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

ram disk 是什么东东?

[复制链接]
 楼主| 发表于 2005-3-23 18:19:57 | 显示全部楼层
Post by home_king
不是的。
GRUB不参与Linux内核的初始化!它是与内核独立的。

记住,GRUB与Linux内核交互的方式遵循一种协议,目前的协议版本为2.02;GRUB通过"setup head"区域与内核交换数据。

假设内核映像为kernel.img,那么这个img文件里就包含着三截代码段(在编译内核的最后阶段生成),第一段是bootsect.S,就是旧的内核内置启动器,它的地位已经被GRUB替代,所以被丢弃不用;第二段是setup.S,由GRUB负责将其放置到物理地址0x90200上,它的头部就是前面提及的所谓head区,GRUB会把需要告诉内核的信息例如initrd的物理起始地址以及大小,放在这个head区;第三段就是真正的压缩内核映像,视乎其体积类型,如果是大内核,就将这段内核映像放至0x100000。

那么,在初始化页表的时候,内核会搬动head区的数据到合适的位置,里面的数据就会被内核初始化所利用,所以内核就得知了initrd的所有信息。明白了吗?

有点明白了,又有点糊涂了
也就是说,setup.S 前面一段是用来在grub和内核之间传递参数的,是吧?
如果在grub 中设置了 initrd的话,grub会读出该文件的地址以及文件的大小,然后将其写入setup.S的head区的特定地方,待内核启动时使用.
grub引导结束后,应该跳转至setup.S执行

这样对不对?
回复 支持 反对

使用道具 举报

发表于 2005-3-23 18:25:46 | 显示全部楼层
Post by rickxbx
有点明白了,又有点糊涂了
也就是说,setup.S 前面一段是用来在grub和内核之间传递参数的,是吧?
如果在grub 中设置了 initrd的话,grub会读出该文件的地址以及文件的大小,然后将其写入setup.S的head区的特定地方,待内核启动时使用.
grub引导结束后,应该跳转至setup.S执行

这样对不对?

嗯。理解正确。 ;)
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-3-23 21:05:50 | 显示全部楼层
还有最后一个问题,这样的initrd.img文件是被grub载入内存.然后grub告诉内核其内存地址,还是由内核载入内存,grub只告诉内核该文件的硬盘地址?
如果是由grub载入,那么grub怎么知道该加载到什么内存区域才会安全?
回复 支持 反对

使用道具 举报

发表于 2005-3-23 21:09:17 | 显示全部楼层
Post by rickxbx
还有最后一个问题,这样的initrd.img文件是被grub载入内存.然后grub告诉内核其内存地址,还是由内核载入内存,grub只告诉内核该文件的硬盘地址?

由grub载入内存,然后再将内存中的initrd信息告诉内核,让内核进行初始化。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-3-23 21:12:41 | 显示全部楼层
非常感谢你的热心细致的解答,能否再看看13帖?
回复 支持 反对

使用道具 举报

发表于 2005-3-23 21:20:02 | 显示全部楼层
Post by rickxbx
非常感谢你的热心细致的解答,能否再看看13帖?

呵呵。不用谢。
13帖,在哪?
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-3-23 21:34:12 | 显示全部楼层
Post by home_king
呵呵。不用谢。
13帖,在哪?

就是这个帖子的第13个回帖
我还是再写一遍吧:
就是grub能知道该把intrd.img这个文件放在内存的什么地方才安全吗?
回复 支持 反对

使用道具 举报

发表于 2005-3-23 21:49:21 | 显示全部楼层
Post by rickxbx
就是这个帖子的第13个回帖
我还是再写一遍吧:
就是grub能知道该把intrd.img这个文件放在内存的什么地方才安全吗?

我之前已经说过,Linux为它的启动制订了一个标准协议,GRUB或者LILO要启动Linux,就必须遵循这个协议。该协议放在内核源码目录的"Documentation/i386/boot.txt"。

根据这个协议,initrd的位置尽可能地放在内存的高地址,这个高地址的值取决于机器的架构,但为了达到最大的兼容性,一般放在16MB靠后的地方,因为16MB是i286能识别的最大内存。另外,不同的bootloader,对initrd的加载地址可能有点差异,但只要不覆盖内核以及内核初始化可能要用的数据区即可。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-3-23 22:15:26 | 显示全部楼层
Post by home_king
我之前已经说过,Linux为它的启动制订了一个标准协议,GRUB或者LILO要启动Linux,就必须遵循这个协议。该协议放在内核源码目录的"Documentation/i386/boot.txt"。

根据这个协议,initrd的位置尽可能地放在内存的高地址,这个高地址的值取决于机器的架构,但为了达到最大的兼容性,一般放在16MB靠后的地方,因为16MB是i286能识别的最大内存。另外,不同的bootloader,对initrd的加载地址可能有点差异,但只要不覆盖内核以及内核初始化可能要用的数据区即可。

看来兄弟内核读的挺透彻啊,以后还请多多指教才是啊
回复 支持 反对

使用道具 举报

发表于 2006-8-13 21:08:30 | 显示全部楼层
获益非浅啊!!
回复 支持 反对

使用道具 举报

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

本版积分规则

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