发新话题
 搜藏 打印 该页面添加到 Mister Wong

GRUB FOR DOS 的总体框架

本主题被作者加入到个人文集中

GRUB FOR DOS 的总体框架

转帖说明

出  处:忘了,sorry。下次补上
个人评价:好文
推荐理由:阅后会对grub有更深入的了解
推荐人群:对grub了解不深或一知半解的朋友


月下刀客

//=============转帖内容开始===========================//

GRUB FOR DOS 的总体框架


  bendany 建议我写一写 GRUB4DOS 的大致结构,以便准备投入开发 GRUB4DOS 的朋友们能够对此有一个快速的了解。我试试吧,就写了这篇短文。文章有什么不妥的,或者需要补充的,希望大家提出来,我再加以完善。几年前写过两三篇 GRUB4DOS 的技术文章,虽然某些内容有些陈旧,但似乎也还可以用。有需要的朋友,可以在各大搜索引擎中搜索grub for dos 或者 grub.exe 或者 grldr 等字眼,应该能够找到那些文章。这次不重复那些文章的内容了,主要面向准备继续开发 Grub4dos 的朋友们。

  GRUB for DOS 是 GNU GRUB 的功能扩展,是以 GNU GRUB 为基础的。有关 GNU GRUB 的技术信息,可以由 Linux 下的 info grub 命令获得。这里主要说说 GRUB for DOS 的特有信息,并且只是粗略的、轮廓性的介绍。详细的信息还是要通过源代码才能得到。在关键的地方,源代码中都有比较详细的注释。


1、启动过程,启动方式

  GNU GRUB 的启动过程大致是这样的:512 字节的 stage1,放在 MBR 或者软盘第一扇区,它从 BIOS 那里获得控制,然后它负责查找 stage1.5 或者 stage2。其实,stage1 在被放置到 MBR 或者软盘第一扇区的时候,已经把 stage1.5 或者 stage2 的物理扇区位置记录到 stage1 的某个区域中了,这通常称为硬编码。这些都不重要,重要的是,stage1 和 stage1.5 都不是 GRUB 的主体,它们都是为了把 stage2 装入到内存中,除此之外,它们没有别的用处。

  stage2 又分两部分:第一部分是 512 字节的开头,它像 stage1 一样,里面含有 stage2 的物理扇区位置列表,整个扇区没有别的用处,仅仅只是为了寻找 stage2 的后续部分(也就是从第二扇区开始一直到文件结尾)。这第二部分才是 GRUB 的主程序体,它叫做 pre_stage2。也就是说,

stage2 = 512 字节的头部 + pre_stage2

stage1 和 stage2 中都含有扇区绝对定位信息,这些信息,是在将 GNU GRUB 安装到 MBR 或者软盘第一扇区时,由 setup 命令计算之后写入的。

  说了这么多,其实只是为了说明一点:pre_stage2 才是对我们的 GRUB FOR DOS 有用的。所以,你在程序中会看到 pre_stage2_start 这个标号。

  GRUB FOR DOS 主要有两大类启动方式。一类是从操作系统中启动(grub.exe),一类是由 BIOS 引导启动(GRLDR)。

  GRLDR 也可以由 NTLDR 启动,不过这其实也类似于从 BIOS 启动,因为由 NTLDR 所赋予的启动环境,没有破坏 BIOS 中断向量。

  GRUB.EXE 可以从 DOS/Windows9x 下运行,也可以经由 kexec 而从 Linux 下运行,或者也可以经由 LILO 或者 syslinux 这类引导器而启动运行。这又分为两种情况:在 DOS/Windows9x 下,GRUB.EXE 是被作为 DOS 的可执行文件或者可以作为 CONFIG.SYS 里的设备驱动文件而运行。在其他情况下,GRUB.EXE 是作为 LINUX 内核格式而被启动运行的。


2、文件结构

  GRLDR 的文件结构相对来说比较单一,源代码文件是 grldrstart.S。它的第一扇区,是启动代码,如果这是在 MBR 上,它负责装入位于硬盘第一磁道上的其余扇区。如果是经由 NTLDR 启动,那么 NTLDR 会装入 GRLDR 的开头 16 个扇区。这些扇区中的代码,负责查找各个硬盘各个分区根目录下的 grldr 文件,并装载整个 grldr 文件到内存中。紧接着 GRLDR 开头的 16 扇区,就是 pre_stage2 了。GRLDR 开头的 16 扇区代码,负责把 pre_stage2 放到 0000:8200 处,并把控制交给 pre_stage2。在 GNU GRUB 中,0000:8000 处放置的是 stage2,由于我们不用 stage2 的第一扇区,所以,我们直接把 pre_stage2 放置在 0000:8200 了。

  bootlace.com 可以用来将 grldr 的启动代码写入到 MBR 或者软盘的第一扇区上。其实,写入到 MBR 上的,不完全就是 GRLDR 开头的 16 扇区,而是 GRLDR.MBR 文件的内容(只有第一扇区的若干个控制字节会被改动,以及硬盘分区表会被加入到第一扇区,而第二扇区可以放置硬盘上原来的 MBR 作为备份,其余扇区都原封不动地被拷贝到第一磁道的相应扇区上)。bootlace.com 是双重可执行文件格式:它可以在 DOS 下运行(作为 .com 可执行文件),也可以在 Linux 下运行(作为 ELF 可执行文件)。GRLDR.MBR 文件将来可以增大到 63 个扇区那么长,这是一个磁道长度的最大上限。但是 GRLDR 文件的开头部分却只能有 16 个扇区那么长,因为 NTLDR 只能装入这么长,它不能为我们直接装入全部的 GRLDR 文件。GRLDR.MBR 的源代码文件是 mbrstart.S。bootlace.com 的源代码文件是 bootlacestart.S。

  GRUB.EXE 是三重文件格式。它的结构比较复杂。首次看源代码的时候,可以先忽略它作为 DOS 设备驱动程序文件格式的那些代码,因为那可能比较难以理解。而作为 DOS 的 EXE 格式以及作为 LINUX 的 bzImage 格式,都是比较容易理解的,因为这方面的资料很容易找到。源代码文件是 dosstart.S。像 GRLDR 的情况那样,GRUB.EXE 也是由开头的启动代码以及 pre_stage2 这两部分构成的。

  pre_stage2 的源代码文件是 asm.S,它会调用其它 C 语言程序文件。这些 C 文件和 asm.S 一起编译生成 pre_stage2 文件。builtins.c 文件含有各种命令的代码,包括 map 命令。如果要为 GRUB 增添拷贝文件或者创建文件的命令,则需要修改 fsys_*.c 文件,它们是各种文件系统的驱动程序文件。


3、内存的使用

  在物理地址 0x800 到 0x17FF 这 4K,放置嵌入到 GRUB.EXE 命令行的那些命令。只有从 CONFIG.SYS 中用 device=grub.exe --config-file="GRUB_COMMANDS" 的方式,才可以嵌入接近 4K 的 GRUB 命令,其它方式都受具体环境的限制。比如,DOS 命令行不超过 127 个字符。GRUB.EXE 作为 Linux 内核格式,它也只能接受最多 512 字节的命令行。

  物理地址 2M 处放置备份的 640K 的 DOS 常规内存,以便 quit 命令可以恢复 DOS 的现场。
//==============转帖内容结束=====================//

[ 本帖最后由 月下刀客 于 2006-6-29 09:20 编辑 ]

本文由月下刀客 发布于Linuxsky 论坛,网址:http://bbs.linuxsky.org/thread-3587-1-1.html

TOP

发新话题