bios如何知道BPB的类型?

use*_*948 5 x86 assembly bootloader

如果我希望我的引导加载程序从usb棒启动,我必须包含一个BPB.usb棒在软盘模拟模式下运行.正如所看到这里,有许多不同版本的BPB.bios如何知道BPB的类型?GRUB 0.97似乎正在使用另一种BPB格式?

我可以从偏移量0xb稍微填充我的引导加载程序,然后它也可以工作.是否有标准/通用尺寸可供使用?我没有在USB上使用任何文件系统,只是原始的.

我想我需要BPB,因为bios尝试更新一些值,这会覆盖一些代码.由于每个BPB看起来有点不同,bios如何知道在哪里更新什么值?

Dav*_*zer 3

并非所有 BIOS 实现都关心您是否有 BPB。以 MBR 引导扇区开头的 BPB 的一般格式如下:

bits 16
org 0                   ; BIOS will load the MBR to this location.

    bootStart:
            jmp     _start
            nop
            osType      db  'MSDOS6.0'
            bpb
            bps         dw  512
            spc         db  8
            rs          dw  1
            fats        db  2
            re          dw  512
            ss          dw  0
            media       db  0xf8
            spfat       dw  0xc900
            spt         dw  0x3f00
            heads       dw  0x1000
            hidden      dw  0x3f00, 0
            ls          dw  0x5142,0x0600
            pdn         db  0x80
            cheads          db  0
            sig         db  0x29
            serialno    dw  0xce13, 0x4630
            label       db  'NO NAME'
            fattype     db  "FAT32"

    _start:
                                ; set up the registers
            mov     ax, 0x07c0
            mov     ds, ax
            mov     fs, ax
            mov     gs, ax
            mov     ax, 0x0700
            mov     es, ax
Run Code Online (Sandbox Code Playgroud)

这些字段总是在同一个地方。如果系统关心 BPB,那么它验证它的方式就是简单地解析它。

  • @user237948:您可以用零填充空格(不过您需要 JMP 来启动)。在 GRUB 代码中,它们使用 BPB 空间作为自己的变量。他们不关心 BIOS 可能会在那里放什么,无论如何,他们最终都会覆盖数据(如果使用软盘,他们会从 BIOS 本身检索驱动器几何结构)。在其中放置代表驱动器的合理值的一个原因是在如果您正在使用磁盘映像,您实际上可以使用安装软件来读取标头并从 BPB 条目决定磁盘映像配置。 (3认同)