Babystep1

来自osdev
跳到导航 跳到搜索


本文的语气或风格 可能无法反映整个wiki使用的百科全书式语气。 有关建议,请参阅 Wikipedia's article on tone

难度等级
Difficulty 1.png
初学者


第一步: 你的首个引导扇区

Tutorial

上一个下一个
Babystep2

你的首个引导扇区。

代码

以下代码是从磁盘启动代码的最小可行示例。

; boot.asm
hang:
    jmp hang

    times 512-($-$$) db 0

CPU在实际模式下启动,BIOS 在地址0000:7c00处加载此代码。 "times 512-($-$$) db 0" 是NASM的写法表示用零填充512个字节, partcopy(译者注:下面参考中的一个工具软件) 会需要 (十六进制200 = 十进制512)字节的数据。 更改它,partcopy会失败。

最后经常还会有引导签名 (0xAA55)。 某些BIOS的旧版本会对此进行了查找,以识别磁盘上的引导扇区。 如今好像已经没有必要了,除非你是在旧版BIOS或QEMU中运行代码。 如果需要,最后一行需要替换为 (或其它某些版本):

; boot.asm
hang:
    jmp hang

    times 510-($-$$) db 0 ; 2 bytes less now
    db 0x55
    db 0xAA

启动后,光标在空白屏幕上愉快地闪烁,磁盘的电机将关闭,你现在可以按Ctrl-Alt-Del重新启动。 这是因为 interrupts中断 仍在产生。

尝试清除中断标志:

;boot.asm
     cli
 hang:
     jmp hang

     times 510-($-$$) db 0
     db 0x55
     db 0xAA

这次你会注意到磁盘电机没有关闭,并且无法使用Ctrl-Alt-Del重新启动。(译者注:因为增加了CLI指令,禁止了中断执行)

删除循环并仅用零填充扇区通常会导致BIOS在启动时抛出错误。 在大多数机器上,它会显示 “Operating System Not Found”(找不到操作系统)。

创建磁盘映像

代码需要在 NASM 汇编器中进行编译,并使用partcopy、dd或debug命令复制到软盘 (基本已经淘汰了) 、磁盘或u盘中。 然后你只需让电脑从那个磁盘启动。

有关更详细的描述,请参见 Bootable Disk 可启动磁盘 页面。

Windows

nasmw boot.asm -f bin -o boot.bin
partcopy boot.bin 0 200 -f0 
OR
debug boot.bin
-W 100 0 0 1
-Q

Unix

nasm boot.asm -f bin -o boot.bin
dd if=boot.bin of=/dev/fd0

要写入硬盘或u盘,请使用

nasm boot.asm -f bin -o boot.bin
dd if=boot.bin of=/dev/sda

根据你的配置需求,将 “sda” 替换为sdb,sdc等内容。

在QEMU中运行binary二进制文件

如果您没有带有软盘驱动器的旧机器,则可以使用QEMU来模拟一台 (请注意下面代码中的 “fda”)。

qemu-system-i386 -fda boot.bin

但是建议完全忘记软盘,而将专注在USB存储盘上。 另外,如果你害怕在开发计算机上测试代码 (这确实是明智的), 可以使用QEMU (注意下面代码中的 “hda”)。

qemu-system-i386 -hda boot.bin

使用QEMU monitor监控命令将Ctrl-Alt-Del操作发送到虚拟机:

sendkey ctrl-alt-delete

由于虚拟机已经变得如此之快,你可能需要减慢仿真速度到1%,才能注意到发生了重新启动。

参考文献

  • 第一手的指令集参考: [1]
  • 更易于阅读的版本: [2]
  • NASM 汇编包括指令集文档: [3]
  • Partcopy-下载pcopy02.zip (新链接): [4]
  • 按中断数字(译者注:已无法打开): [5]
  • 兰德尔·海德 (Randall Hyde) 对PC的了解: [6]
  • QEMU [7]