写一个引导程序(boot loader)(翻译)

环境

首先,你需要安装NASM汇编器和QEMU来模拟一个虚拟机。用QEMU很好,因为我们不用担心有时候不小心写了烂的OS代码而把硬件给搞坏了;) 。在win 10的wsl或Ubuntu上你可以用这个命令来安装它们(之前可以用sudo apt-get update更新一下软件源):

sudo apt-get install nasm qemu

在Mac上你可以使用homebrew:

brew install nasm

在win 10上,你还要安装X Server,这样QEMU就可以从WSL中打开一个窗口。

Hello World的Bootloader

我们将编写一个软盘引导加载程序,它不需要我们处理文件系统,这有助于使事情尽可能简单。
图片描述
当你按下电源键时候,计算机从存储在主板上的闪存加载BIOS。BIOS对硬件进行初始化和自测试,然后将第一个512字节从媒体设备(即CDROM或软盘)加载到存储器中。如果最后两个字节等于0xAA55,那么BIOS将跳转到位置0x7C00,有效地将控制转移到引导加载程序。
此时CPU以16位模式运行,这意味着只有16位寄存器可用。此外,由于BIOS只加载前512个字节,这意味着我们的引导加载代码必须保持在该限制之下,否则我们将击中未初始化的内存!

让我们把Help World World打印到屏幕上。要做到这一点,我们将使用“TTY模式下的写入字符”BIOS中断调用和加载字符串字节指令LoBSB,将地址DS:SI中的字节加载到AL中。下面是:

bits 16 ; tell NASM this is 16 bit code
org 0x7c00 ; tell NASM to start outputting stuff at offset 0x7c00
boot:
    mov si,hello ; point si register to hello label memory location
    mov ah,0x0e ; 0x0e means 'Write Character in TTY mode'
.loop:
    lodsb
    or al,al ; is al == 0 ?
    jz halt  ; if (al == 0) jump to halt label
    int 0x10 ; runs BIOS interrupt 0x10 - Video Services
    jmp .loop
halt:
    cli ; clear interrupt flag
    hlt ; halt execution
hello: db "Hello world!",0

times 510 - ($-$$) db 0 ; pad remaining 510 bytes with zeroes
dw 0xaa55 ; magic bootloader magic - marks this 512 byte sector bootable!

你可以使用nasm来编译它(把它保存为boot1.asm

nasm -f bin boot1.asm -o boot1.bin

如果我们运行hexdump boot1.bin,我们可以看到NASM创建了一些代码,填充了一些零点,然后将最后两个字节设置为幻数。

0000000 10be b47c ac0e c008 0474 10cd f7eb f4fa
0000010 6548 6c6c 206f 6f77 6c72 2164 0000 0000
0000020 0000 0000 0000 0000 0000 0000 0000 0000
*
00001f0 0000 0000 0000 0000 0000 0000 0000 aa55
0000200

现在我们可以运行这个东西!你可以告诉QEMU使用qemu-system-x86_64 -fda boot1.bin引导软盘。在win 10上,你之前还应该设置环境变量SET DISPLAY=:0(这个其实是指定了X Server的地址)。
你应该得到这样的东西!
图片描述

原文链接


Salamander
上帝在我很小的时候送给我了两个苹果,一个红苹果,一个蓝苹果。红苹果代表疯狂,蓝苹果代表思考
6.7k 声望
407 粉丝
0 条评论
推荐阅读
Java AtomicInteger类使用
这个问题发生的原因是++counter不是一个原子性操作。当要对一个变量进行计算的时候,CPU需要先从内存中将该变量的值读取到高速缓存中,再去计算,计算完毕后再将变量同步到主内存中。这在多线程环境中就会遇到问...

pigLoveRabbit2阅读 2.3k

工具篇:iTerm与Zsh
iTerm2支持许多的主题配色,可以自己定义,也可以参考网上现成的主题配色。我个人比较喜欢draculatheme配色。支持item,vim,phpstorm , 下方存在主题官网路径,按照教程安装即可。

super白4阅读 4.7k

麒麟操作系统 (kylinos) 从入门到精通 - 常用软件安装 - 第三篇 常用软件安装(windows下的习惯)
本篇内容大部分从应用商店进行安装,部分通过官网下载,少部分通过命令行安装。1.原生应用1.1钉钉1.2飞书1.3 蓝信1.4 腾讯文档1.5 金山文档1.6 搜狗输入法(拼音)1.7 五笔输入法1.8 libreoffice官方也带了WPS,...

码上世界3阅读 7.3k评论 17

封面图
深入剖析容器网络和 iptables
Docker 能为我们提供很强大和灵活的网络能力,很大程度上要归功于与 iptables 的结合。在使用时,你可能没有太关注到 iptables 的作用,这是因为 Docker 已经帮我们自动完成了相关的配置。

张晋涛3阅读 1.2k

封面图
Metasploit实现木马生成、捆绑及免杀
在一次渗透测试的过程中,避免不了使用到社会工程学的方式来诱骗对方运行我们的木马或者点击我们准备好的恶意链接。木马的捆绑在社会工程学中是我们经常使用的手段,而为了躲避杀毒软件的查杀,我们又不得不对木...

白风之下1阅读 9k

麒麟操作系统 (kylinos) 从入门到精通 - 办公环境 - 第十三篇 字体安装与windows字体的利用
正常情况下,系统下的wps或libreoffice用到的字体都已默认安装。但有时候一些ttf字体或者microsoft office下一些字体需要安装。我们可以在安装好office、acrobat之后,将C:\windows\Fonts文件夹中的字体(我是win...

码上世界2阅读 3.7k

封面图
麒麟操作系统 (kylinos) 从入门到精通 - 影音娱乐- 第三十篇 利用PKS观看电视台(IPTV)直播
类别:笔记本型号:中国长城 UF712硬件平台:飞腾处理器(ArmV8 指令集)系统:银河麒麟操作系统 V10 SP1(2203) 关键词:信创,麒麟系统,linux,PKS,银河麒麟,飞腾,arm64,arm,湖南卫视,中央电视台,电视直播,iptv

码上世界1阅读 3.7k

封面图
6.7k 声望
407 粉丝
宣传栏