|
楼主 |
发表于 2006-4-15 20:36:38
|
显示全部楼层
ram disk 是什么,它和initrd.img 文件的关系是怎样的
摘录自(该贴子有详细讨论):http://www.linuxsir.cn/bbs/showthread.php?t=184629
(rickxbx从home_king兄那里理解到的结论摘录:)
home_king:
ramdisk是一种基于内存的虚拟文件系统,通常用于放置内核的中间数据。
而initrd全称为"boot loader initialized RAM disk",也就是由启动加载器所初始化的RamDisk设备,它的作用是完善内核的模块机制,让内核的初始化流程更具弹性;内核以及initrd,都由bootloader在机子启动后被加载至内存的指定位置,主要功能为按需加载模块以及按需改变根文件系统。
更详细的内容,请参阅initrd的man手册,里面阐述了内核开发者对initrd制订的功能标准。
man initrd
......
rickxbx:
你看是不是这样:grub 中的 initrd 指令告诉 grub 可以从 initrd 指定的文件读取,然后将读到的内容拷贝到 ram disk,然后将该 ram disk 挂载到文件系统的根目录,然后执行/linuxrc(如果存在的话),并将真正的根文件系统挂载到vfs的根
如果是这样的话,现在就有一个问题:这个ram disk 怎么确定?也就是上面说的 /dev/ram0 怎么确定?
......
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的所有信息。明白了吗?
rickxbx:有点明白了,又有点糊涂了
也就是说,setup.S 前面一段是用来在grub和内核之间传递参数的,是吧?
如果在grub 中设置了 initrd的话,grub会读出该文件的地址以及文件的大小,然后将其写入setup.S的head区的特定地方,待内核启动时使用.
grub引导结束后,应该跳转至setup.S执行
rickxbx:还有最后一个问题,这样的initrd.img文件是被grub载入内存.然后grub告诉内核其内存地址,还是由内核载入内存,grub只告诉内核该文件的硬盘地址?
如果是由grub载入,那么grub怎么知道该加载到什么内存区域才会安全?
home_king:由grub载入内存,然后再将内存中的initrd信息告诉内核,让内核进行初始化。
Linux为它的启动制订了一个标准协议,GRUB或者LILO要启动Linux,就必须遵循这个协议。该协议放在内核源码目录的"Documentation/i386/boot.txt"。
根据这个协议,initrd的位置尽可能地放在内存的高地址,这个高地址的值取决于机器的架构,但为了达到最大的兼容性,一般放在16MB靠后的地方,因为16MB是i286能识别的最大内存。另外,不同的bootloader,对initrd的加载地址可能有点差异,但只要不覆盖内核以及内核初始化可能要用的数据区即可。
---------------------------------------
好了,现在知道genloo为什么给我提出这个思路了,大致的原理稍微了解了,下来就是:怎么实际上来尝试。
如果在win下面,尽管不懂原理也可以尝试,但是linux下面甚至连基本命令都不懂,白痴中的白痴,咳,因为习惯问题,win好象很简单,到dos里面去,要运行什么,要去C盘就去C盘,找什么东西就去找,唉,被洗脑的感觉正历历在目,可见越是用win会越“傻”,继续探索... |
|