|
本帖最后由 pppfj 于 2014-1-7 14:52 编辑
仔细阅读了这篇一年前的文档,对grub4dos的内部结构和工作原理又有了进一步的了解。
有些疑惑还想再请教一下不点大师:
GRLDR 的头部占用 16 扇区,也就是 8K,即 8192 个字节,或者(用十六进制表示)0x2000 字节。GRLDR 的头部会被 NTLDR 加载。遗憾的是,NTLDR 不能够把 GRLDR 完整加载到内存,只能刚好加载 8K 大小的头部。这就是 “ 为什么 GRLDR 的头部正好是 8K ” 的原因。这样,当头部获得控制后,它就有一个首要的任务,即寻找 “ 主体 ” 部分在哪里,然后加载主体部分到内存。实际的执行步骤是,头部在各个硬盘各个分区的根目录寻找整个 GRLDR 文件(如果都失败,那么最后会尝试在第一软盘 fd0 的根目录寻找 GRLDR 文件),找到 GRLDR 之后就加载完整的 GRLDR 文件到内存,并递交控制权。
疑惑:
1.“当头部获得控制后,它就有一个首要的任务,即寻找 “ 主体 ” 部分在哪里,然后加载主体部分到内存”。正确理解了这句话的意思,是把grldr头部16个扇区以后的“主体”载入内存,并移交控制权;
2.“实际的执行步骤是,头部在各个硬盘各个分区的根目录寻找整个 GRLDR 文件,找到 GRLDR 之后就加载完整的 GRLDR 文件到内存,并递交控制权。”理解这句话有点疑问:“加载完整的grldr文件到内存,并递交控制权”,意味着加载包含“16扇区头部+主体”到内存,然后递交控制权,不就意味着“16扇区头部”要再次执行寻找“主体”的工作,形成死循环?实际上程序运行的很好,肯定是我的理解有问题,请大师指点。
再请教:
grldr 并非只能被 ntldr 加载,它也可以被其它启动软件加载。例如,fbinst、syslinux 都可以加载 grldr。原则上讲,任何启动软件(经过改造以后)都可以加载 grldr,因为加载它是很容易的,只要把 grldr 放在 16 字节对齐的内存地址处便可递交控制权了。
1.如果用wee的命令“command /grldr”或“/grldr”来加载grldr,是不是一次性完整的把整个grldr(头部+主体)文件加载到内存,然后递交控制权?如果是完整加载整个文件,递交控制权后,“16个扇区头部”是否还要再“寻找”并加载“主体”一次,造成重复劳动?
2.如果用grub的“chainloader /grldr”命令加载grldr,是否与上述过程是类似的?
谢谢!
|
|