grub命令行 grub命令详解( 二 )


从版本 0.4.5 开始 , grub.exe 也能够被 ntldr 加载(在 boot.ini 的末尾添加 c:\grub.exe="grub.exe" 这样一行便可 , 完全类似于 grldr 的情况) 。
grldr 并非只能被 ntldr 加载 , 它也可以被其它启动软件加载 。例如 , fbinst、syslinux 都可以加载 grldr 。原则上讲 , 任何启动软件(经过改造以后)都可以加载 grldr , 因为加载它是很容易的 , 只要把 grldr 放在 16 字节对齐的内存地址处便可递交控制权了 。另外 , 凡是能够加载 ntldr 的引导管理器 , 也都能加载 grldr 。这是因为 ntldr 总是被加载在固定地址 2000:0000 处 , 而如果 grldr 也被加载在此处 , 当然是可以正常运转的 , 因为 2000:0000 是一个 16 字节对齐的地址 。
当网卡的 PXE BIOS 加载 grldr 时 , 它把 grldr 加载在 0000:7C00 处 , 这也是一个 16 字节对齐的地址 。所谓 “16 字节对齐” , 就是“可以被 16 整除”的意思 。
无论 grldr(或 grub.exe)被什么东西加载(以及加载在何处) , 这个被加载了的 grldr(或 grub.exe)都会自动执行一个附加的步骤 , 即把主体部分(pre_stage2)放置在固定地址 0000:8200 处 。这就是说 , 待到主体部分即将取得控制权的一刻 , 它总是位于 0000:8200 处 。
前面已经交代了 grldr 和 grub.exe 的宏观结构都是 “头部+主体” 。但是 , “头部”和“主体”都有更精细的结构 。
GRLDR 的头部固定占用 16 扇区(8K) 。但是 , GRUB.EXE 的头部很长 , 而且不是固定的长度 。因此首先需要确定这个头部的长度 。
相对于 GNU GRUB legacy 而言 , 头部是 grub4dos 特有的 。头部的唯一作用就是加载主体到内存 。而主体就是 GNU GRUB legacy 的核心代码 pre_stage2 。因此 , 当主体获得控制时 , 头部就没有必要存在了 。头部就像三级运载火箭中的一个级 , 它的目的和作用就是把主体送上轨道 , 然后自己也就废弃了 。当主体获得控制以后 , 此时再来找头部就找不到了 , 因为它已经从内存中消失了 。
grub4dos 也改造了 GNU GRUB legacy 的核心文件 pre_stage2(它就成为了 grub4dos 的主体部分) 。grub4dos 在主体的开头安排了很多核心变量 , 可以让用户读取或写入 。有些变量是不可以写入的 , 一旦写入 , 就破坏了 grub4dos 的运行环境 。而有些变量是可以写入的 , 用户通过写入这些变量 , 来控制 grub4dos 的行为方式 。
主体部分在内存中的位置是固定的 , 它被头部加载在物理地址 0x8200 处 , 此处可以看作是主体的固有 “轨道” 。因此 , 很多变量都在 0x8200 之后的一个较小的区域之内 。当然 , grub4dos 内核中的许多结构都属于用户可访问的信息 , 它们分散在全部内存空间中 。例如 , 0x800 处的 4K 字节是未压缩的内置菜单;0x110000 处的 256K 字节是压缩的内置菜单;而内存虚拟盘的映像通常位于内存的顶部 。grub4dos 内核对于内存的使用似乎有些“破碎”的感觉 , 但这是有一个发展过程的 , 我们不希望后续的 grub4dos 版本会给用户带来麻烦 , 因此要尽量保持兼容性 。而兼容性的要求 , 就使得 grub4dos 对内存的使用有些古怪 。
如何使用grub4dos
对于多数没有或很少接触过linux的windows用户来说 , 刚开始使用grub时离不开菜单 。也就是说 , 使用grub前 , 我们要准备menu.lst文件 。