“Babystep1”的版本间差异
(创建页面,内容为“__NOTOC__ {{Tone}} {{Rating|1}} {{Infobox Tutorial | name=第一步: 你的首个引导扇区 | next=Babystep2 }} === 你的首个引导扇区。=== ==代码== 以下代码是从磁盘启动代码的最小可行示例。 <source lang="asm"> ; boot.asm hang: jmp hang times 512-($-$$) db 0 </source> CPU在实际模式下启动,BIOS 在地址0000:7c00处加载此代码。 "times 512-($-$$) db 0" 是NASM的写法表示用零填充512个字…”) |
|||
(未显示同一用户的1个中间版本) | |||
第14行: | 第14行: | ||
以下代码是从磁盘启动代码的最小可行示例。 | 以下代码是从磁盘启动代码的最小可行示例。 | ||
< | <syntaxhighlight lang="asm"> | ||
; boot.asm | ; boot.asm | ||
hang: | hang: | ||
第20行: | 第20行: | ||
times 512-($-$$) db 0 | times 512-($-$$) db 0 | ||
</ | </syntaxhighlight> | ||
CPU在实际模式下启动,[[BIOS]] 在地址0000:7c00处加载此代码。 "times 512-($-$$) db 0" 是NASM的写法表示用零填充512个字节, partcopy(译者注:下面参考中的一个工具软件) 会需要 (十六进制200 = 十进制512)字节的数据。 更改它,partcopy会失败。 | CPU在实际模式下启动,[[BIOS]] 在地址0000:7c00处加载此代码。 "times 512-($-$$) db 0" 是NASM的写法表示用零填充512个字节, partcopy(译者注:下面参考中的一个工具软件) 会需要 (十六进制200 = 十进制512)字节的数据。 更改它,partcopy会失败。 | ||
最后经常还会有引导签名 (0xAA55)。 某些BIOS的旧版本会对此进行了查找,以识别磁盘上的引导扇区。 | 最后经常还会有引导签名 (0xAA55)。 某些BIOS的旧版本会对此进行了查找,以识别磁盘上的引导扇区。 如今好像已经没有必要了,除非你是在旧版BIOS或QEMU中运行代码。 如果需要,最后一行需要替换为 (或其它某些版本): | ||
<source lang="asm"> | <source lang="asm"> | ||
; boot.asm | ; boot.asm | ||
第77行: | 第77行: | ||
==在QEMU中运行binary二进制文件== | ==在QEMU中运行binary二进制文件== | ||
如果您没有带有软盘驱动器的旧机器,则可以使用QEMU来模拟一台 (请注意下面代码中的 “'''f''' da”)。 | 如果您没有带有软盘驱动器的旧机器,则可以使用QEMU来模拟一台 (请注意下面代码中的 “'''f'''da”)。 | ||
<source lang="bash"> | <source lang="bash"> | ||
第83行: | 第83行: | ||
</source> | </source> | ||
但是建议完全忘记软盘,而将专注在USB存储盘上。 另外,如果你害怕在开发计算机上测试代码 (这确实是明智的), 可以使用QEMU (注意下面代码中的 “'''h'''da”)。 | |||
<source lang="bash"> | <source lang="bash"> |
2021年12月24日 (五) 06:44的最新版本
本文的语气或风格 可能无法反映整个wiki使用的百科全书式语气。 有关建议,请参阅 Wikipedia's article on tone |
难度等级 |
---|
初学者 |
第一步: 你的首个引导扇区 | |
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%,才能注意到发生了重新启动。