Replies: 3 comments 3 replies
|
尝试 hexdump 更多扇区的内容,发现细节的1-3分区信息存放在 0x420, 0x4a0, 0x520 0x200 存放的 EFI PART 包含了 Disk identifier (GUID): 8C4079BD-C55B-466F-B8B3-3D3E9CA5B3E7 |
这个信息和我们最终生成的 harddrive.img 在偏移 0x4400 处的二进制代码是一致的 ./cookbook/recipes/bootloader/target/x86_64-unknown-redox/stage/boot/bootloader.bios |
|
查看 ./cookbook/recipes/bootloader/target/x86_64-unknown-redox/build/build/x86-unknown-none/bootloader-live.bin.lst 文件,可知 0xB400 偏移处,是处理 ELF 格式的可执行文件,也就是说 Stage 2 代码已经具有了加载并执行 ELF 的能力。 考虑到 Stage 1 已经可以支持 vga 的输出,我们可以把 arceos bin 文件放到 Stage 2 中去执行,编译时的基地址改为 0xC000
print_char调用了 int 0x10 的中断。此中断提供了各种视频服务,要求BIOS在tty模式下用白色显示一个字符。要显示的字符应在AL寄存器中。 如果需要在 stage 2 阶段输出,可以使用 int 0x10,而可以不需要去驱动 vga_buffer 0xB8000 |
Uh oh!
There was an error while loading. Please reload this page.
MBR(512字节) = Bootloader(Stage 1=446字节) + MBR分区表(16x4=64字节) + MBR签名(55 AA=2字节)
MBR 简介
硬盘的主引导记录(MBR)中的前446字节是位于扇区0的部分,称为MBR代码区域。它主要负责以下功能:
引导加载程序(Bootloader):MBR代码区域包含一个小型的引导加载程序,通常是GRUB或其他引导加载程序。这个引导加载程序负责后续的引导过程,它会从硬盘上加载更大的引导加载程序(如Stage 2)或操作系统的启动器。
分区表:MBR的剩余部分用于存储分区表,分区表描述了硬盘上的分区结构。MBR支持最多4个主分区或3个主分区和1个扩展分区。分区表的条目包括分区的起始位置、大小和活动状态(是否可引导)等信息。
签名:MBR的最后两个字节(即511和512字节)存储了一个特殊的签名,被称为"MBR签名"或"引导扇区标识"。这个签名用于检测MBR的有效性,并告诉BIOS这是一个可以引导的MBR。
总之,硬盘的MBR的前446字节包含了引导加载程序(Bootloader)、分区表和MBR签名。这些信息与BIOS引导过程密切相关,它们协同工作来启动操作系统并加载相应的分区。
Stage 1 和 Stage 2
在引导过程中,"Stage 1"和"Stage 2"通常与传统BIOS引导(使用MBR分区表)相关联。
Stage 1: 在传统BIOS引导中,"Stage 1"是指引导加载程序(如GRUB)的第一阶段。它位于硬盘的主引导记录(Master Boot Record - MBR)中的前446字节,负责从硬盘上的特定位置加载并执行"Stage 2"。
Stage 2: "Stage 2"是指引导加载程序的第二阶段。它位于硬盘上的特定位置,通常是在MBR之后的扩展分区或操作系统的启动分区中。"Stage 2"负责加载操作系统内核、初始化系统环境,并将控制权转交给操作系统。
需要注意的是,UEFI引导方式(使用GPT分区表)不再使用"Stage 1"和"Stage 2"的概念。UEFI采用了不同的机制,其中引导管理器和EFI system partition负责加载和启动操作系统。所以,在UEFI引导中,没有直接对应于"Stage 1"和"Stage 2"的概念。
举例
以 livedisk.iso 的第一个扇区(512字节)为例:
主引导记录(MBR)从 446字节=0x1BE 开始,分区表占64字节(如上在【】内),有4个表项,每个分区表项共占据16个字节。
以下是每个分区表项的具体内容和字节偏移:
因此,每个分区表项共占据16个字节 = 1 + (1+2) + 1 + (1+2) + 4 + 4。
根据每个分区表项的16字节含义,结合上述提供的分区表内容,解释如下:
第一个分区表项(偏移地址0x1BE至0x1CD):
第二个分区表项(偏移地址0x1CE至0x1DD)到第四个分区表项(偏移地址0x1EE至0x1FD):
这些分区表项都为全零,表示没有其他有效的主分区或逻辑分区。
上面的分析,和 gdisk 显示出的分区1的信息,起始34,结束2047,似乎对不上,谁能帮忙来分析一下?
All reactions