【问题标题】:How to Write GRUB stage1.S in NASM?如何在 NASM 中编写 GRUB stage1.S?
【发布时间】:2012-12-26 23:27:05
【问题描述】:

我正在尝试使用 NASM 和 gcc 编写多阶段引导加载程序。 为此,我指的是 grub 引导加载程序源代码。

我已经写了一个 stage1 加载器,但是卡在了覆盖分区上 MBR 表。

在 grub stage1.S 中,他们使用这样的代码来跳过分区表:

. = _start + STAGE1_PARTEND
.word   STAGE1_SIGNATURE

如何在 NASM 中做到这一点?

使用次数会覆盖分区表。

所以请帮帮我。

【问题讨论】:

    标签: gcc assembly operating-system nasm bootloader


    【解决方案1】:

    为 赋值。被视为与 .org 指令相同
    (请参阅this page)。

    因此,您粘贴的代码将current origin 更改为_start + STAGE1_PARTEND 并在其中放置一个值为STAGE1_SIGNATURE 的单词。

    因此,在 NASM 代码中,您应该能够执行以下操作:

    fill: times _start+STAGE1_PARTEND-$ db 0
    dw    STAGE1_SIGNATURE
                         ; .word is 16 bits on x86 (regardless of .code16 / .code64)
    

    另请参阅 NASM 手册中的 this example,它展示了如何以这种方式填充 BIOS 引导扇区,以替代 MASM 样式的 org 或 GAS 样式的 . = new_position,实际上在平面二进制文件中寻找和填充填充输出文件。

    【讨论】:

    • 但是使用 times _start+STAGE1_PARTEND-$ db 0 会覆盖我在 MBR 中的分区表条目。这就是我想要避免的。好的,那么正如你所说的'。类似于 nasm 中的 'org'。那么我可以将它用作 [org _start+STAGE1_PARTEND]
    • @Dnyanesh: GAS 中的.org 也会有效地用零填充当前位置和目标位置之间的空间。 NASM 中的org 指令的行为方式与 GAS 中的不同,因此不应用作直接替代。事实上,NASM 手册包含一个创建 MBR 的具体示例,他们说 times 是正确使用的指令:nasm.us/doc/nasmdo12.html#section-12.1.3
    • 那么如何避免在 MBR 中过度写入分区表呢?我可以做的一件事是将stage1写入MBR最多446字节,那么我怎样才能在MBR末尾写入0xAA55?
    • times 不会覆盖该部分中的现有数据。这个想法是以一种简单的方式填充到目标位置(_start+STAGE1_PARTEND)。如果您已经在目标位置,则不需要填充。否则它将用零填充剩余空间,就像您粘贴的 GAS 代码一样。
    【解决方案2】:
    times STAGE1_PARTEND-($-_start) db 0
    dw STAGE1_SIGNATURE
    

    【讨论】:

      【解决方案3】:

      是的,Nasm 将只接受一个“org”指令。 Nasm 相当于“。”是“$”,但我认为这对你也没有帮助。我手头没有 GRUB 代码,否则我会看。分区表“从何而来”?如果它是从磁盘读取的,则可能已经存在签名(?)。也许您可以在覆盖分区表之前简单地“停止” Nasm 代码并保留现有的签名? Nasm 几乎可以“做任何你想做的事”,但这可能是个例外。它不会像(G)一样“移动”(跳过)并在一个新的地方组装更多,就像在这里所做的那样——至少不容易。我可能需要下载 GRUB 代码来找出解决方法。可能像...

      ; stage1 code
      ; possible padding here?
      %incbin "partition_table.bin"
      dw (SIG) ; if not part of the .bin code?
      

      ……什么的。

      【讨论】:

        猜你喜欢
        • 2021-11-14
        • 1970-01-01
        • 2011-02-21
        • 2011-02-21
        • 2014-05-12
        • 1970-01-01
        • 2011-10-14
        • 2023-03-09
        • 1970-01-01
        相关资源
        最近更新 更多