查看“Babystep1”的源代码
←
Babystep1
跳到导航
跳到搜索
因为以下原因,您没有权限编辑本页:
您请求的操作仅限属于该用户组的用户执行:
用户
您可以查看和复制此页面的源代码。
__NOTOC__ {{Tone}} {{Rating|1}} {{Infobox Tutorial | name=第一步: 你的首个引导扇区 | next=[[Babystep2]] }} === 你的首个引导扇区。=== ==代码== 以下代码是从磁盘启动代码的最小可行示例。 <syntaxhighlight lang="asm"> ; boot.asm hang: jmp hang times 512-($-$$) db 0 </syntaxhighlight> CPU在实际模式下启动,[[BIOS]] 在地址0000:7c00处加载此代码。 "times 512-($-$$) db 0" 是NASM的写法表示用零填充512个字节, partcopy(译者注:下面参考中的一个工具软件) 会需要 (十六进制200 = 十进制512)字节的数据。 更改它,partcopy会失败。 最后经常还会有引导签名 (0xAA55)。 某些BIOS的旧版本会对此进行了查找,以识别磁盘上的引导扇区。 如今好像已经没有必要了,除非你是在旧版BIOS或QEMU中运行代码。 如果需要,最后一行需要替换为 (或其它某些版本): <source lang="asm"> ; boot.asm hang: jmp hang times 510-($-$$) db 0 ; 2 bytes less now db 0x55 db 0xAA </source> 启动后,光标在空白屏幕上愉快地闪烁,磁盘的电机将关闭,你现在可以按Ctrl-Alt-Del重新启动。 这是因为 [[interrupts|interrupts中断]] 仍在产生。 尝试清除中断标志: <source lang="asm"> ;boot.asm cli hang: jmp hang times 510-($-$$) db 0 db 0x55 db 0xAA </source> 这次你会注意到磁盘电机没有关闭,并且无法使用Ctrl-Alt-Del重新启动。(译者注:因为增加了CLI指令,禁止了中断执行) 删除循环并仅用零填充扇区通常会导致BIOS在启动时抛出错误。 在大多数机器上,它会显示 “Operating System Not Found”(找不到操作系统)。 ==创建磁盘映像== 代码需要在 [[NASM]] 汇编器中进行编译,并使用partcopy、dd或debug命令复制到软盘 (基本已经淘汰了) 、磁盘或u盘中。 然后你只需让电脑从那个磁盘启动。 有关更详细的描述,请参见 [[Bootable Disk|Bootable Disk 可启动磁盘]] 页面。 ===Windows=== <source lang="bash"> nasmw boot.asm -f bin -o boot.bin partcopy boot.bin 0 200 -f0 OR debug boot.bin -W 100 0 0 1 -Q</source> ===Unix=== <source lang="bash"> nasm boot.asm -f bin -o boot.bin dd if=boot.bin of=/dev/fd0 </source> 要写入硬盘或u盘,请使用 <source lang="bash"> nasm boot.asm -f bin -o boot.bin dd if=boot.bin of=/dev/sda </source> 根据你的配置需求,将 “sda” 替换为sdb,sdc等内容。 ==在QEMU中运行binary二进制文件== 如果您没有带有软盘驱动器的旧机器,则可以使用QEMU来模拟一台 (请注意下面代码中的 “'''f'''da”)。 <source lang="bash"> qemu-system-i386 -fda boot.bin </source> 但是建议完全忘记软盘,而将专注在USB存储盘上。 另外,如果你害怕在开发计算机上测试代码 (这确实是明智的), 可以使用QEMU (注意下面代码中的 “'''h'''da”)。 <source lang="bash"> qemu-system-i386 -hda boot.bin </source> 使用QEMU monitor监控命令将Ctrl-Alt-Del操作发送到虚拟机: <source lang="bash"> sendkey ctrl-alt-delete </source> 由于虚拟机已经变得如此之快,你可能需要减慢仿真速度到1%,才能注意到发生了重新启动。 == 参考文献 == * 第一手的指令集参考: [http://www.intel.com/design/pentiumII/documentation.htm] * 更易于阅读的版本: [http://www.baldwin.cx/386htm/toc.htm] * NASM 汇编包括指令集文档: [http://sourceforge.net/projects/nasm] * Partcopy-下载pcopy02.zip (新链接): [http://www.osdever.net/downloads.php] * 按中断数字(译者注:已无法打开): [http://www.osdever.net/downloads.php] * 兰德尔·海德 (Randall Hyde) 对PC的了解: [http://webster.cs.ucr.edu/] * QEMU [https://www.qemu.org] [[Category:Babystep]] [[Category:Bootloaders]]
本页使用的模板:
模板:Eq
(
查看源代码
)
模板:Eq1
(
查看源代码
)
模板:If
(
查看源代码
)
模板:Infobox Tutorial
(
查看源代码
)
模板:NoteBox
(
查看源代码
)
模板:Rating
(
查看源代码
)
模板:Show1
(
查看源代码
)
模板:Tone
(
查看源代码
)
返回至“
Babystep1
”。
导航菜单
个人工具
登录
命名空间
页面
讨论
变体
已展开
已折叠
查看
阅读
查看源代码
查看历史
更多
已展开
已折叠
搜索
导航
首页
最近更改
随机页面
MediaWiki帮助
工具
链入页面
相关更改
特殊页面
页面信息