当前位置: 首页 > Linux

写一个bootloader(翻译)

时间:2023-04-06 22:24:40 Linux

环境首先需要安装NASM汇编器和QEMU来模拟一个虚拟机。使用QEMU很好,因为我们不必担心不小心编写错误的操作系统代码和搞砸硬件;)。在win10上的wsl或Ubuntu上,您可以使用此命令安装它们(之前可以使用sudoapt-getupdate更新软件源):sudoapt-getinstallnasmqemu在Mac上,您可以使用homebrew:brewinstallnasminOnwin10、还需要安装XServer,这样QEMU才能从WSL打开一个窗口。HelloWorld的引导加载程序我们将编写一个不需要我们处理文件系统的软盘引导加载程序,这有助于使事情尽可能简单。当您按下电源按钮时,计算机会从存储在主板上的闪存中加载BIOS。BIOS对硬件进行初始化和自检,然后将媒体设备(即CDROM或软盘)的前512个字节加载到内存中。如果最后两个字节等于0xAA55,则BIOS将跳转到位置0x7C00,有效地将控制权转移到引导加载程序。此时CPU运行在16位模式下,这意味着只有16位寄存器可用。此外,由于BIOS仅加载前512个字节,这意味着我们的引导加载代码必须保持在该限制之下,否则我们将遇到未初始化的内存!让我们将HelpWorldWorld打印到屏幕上。为此,我们将使用“在TTY模式下写入字符”BIOS中断调用和加载字符串字节指令LoBSB将地址DS:SI处的字节加载到AL。以下是:第16位;告诉NASM这是16位codeorg0x7c00;告诉NASM在偏移量0x7c00boot开始输出内容:movsi,hello;将si寄存器指向hello标签内存位置movah,0x0e;0x0e表示“在TTY模式下写入字符”。循环:lodsb或al,al;是al==0吗?停止;if(al==0)跳转到haltlabelint0x10;运行BIOS中断0x10-视频服务jmp.loophalt:cli;清除中断标志hlt;停止执行hello:db"Helloworld!",0times510-($-$$)db0;用zeroesdw0xaa55填充剩余的510个字节;magicbootloadermagic-标记这个512字节扇区可启动!您可以使用nasm编译它(将其保存为boot1.asm)nasm-fbinboot1.asm-oboot1.bin如果我们运行hexdumpboot1.bin我们可以看到NASM创建了一些代码,填充了一些零,然后替换了最后两个单词部分设置为幻数。000000010BEB47CAC0EC008047410CDF7EBF4EBF4FA000001065486C6C206F6F776C776C722164000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000来0000000000来州。在win10上,还应该设置环境变量SETDISPLAY=:0(这实际上指定了XServer的地址)。你值得拥有这样的东西!原文链接