部分内容来源于《一个60位操作系统的设计与实现》
此博客仅记录学习过程。
一、BIOS 引导原理
BIOS自检结束后会根据启动选项设置选择启动设备,即检测软盘的第0磁头-第0磁道-第1扇区,是否以数值0x55
和0xAA
两字节作为结尾,如果是,BIOS认为这是引导扇区,并复制扇区数据至内存地址0x7C00
处,随后执行这段程序。
鉴于引导扇区仅有512B, Boot 引导程序的作用仅仅是将引导加载程序 Loader 装载到内存中(硬件向软件移交控制权)
二、写一个 Boot 引导程序
打开编辑器:
$ vim boot.asm
写入以下内容:
org 0x7c00
BaseOfStack equ 0x7c00
Label_Start:
mov ax, cs
mov ds, ax
mov es, ax
mov ss, ax
mov sp, BaseOfStack
;======= clear screen
mov ax, 0600h
mov bx, 0700h
mov cx, 0
mov dx, 0184fh
int 10h
;======= set focus
mov ax, 0200h
mov bx, 0000h
mov dx, 0000h
int 10h
;======= display on screen : Start Booting......
mov ax, 1301h
mov bx, 000fh
mov dx, 0000h
mov cx, 10
push ax
mov ax, ds
mov es, ax
pop ax
mov bp, StartBootMessage
int 10h
;======= reset floppy
xor ah, ah
xor dl, dl
int 13h
jmp $
StartBootMessage: db "Start Boot"
;======= fill zero until whole sector
times 510 - ($ - $$) db 0
dw 0xaa55
三、创建虚拟软盘镜像文件
使用 bximage 工具创建虚拟镜像:
- 输入
1
,创建镜像 - 输入
fd
,创建软盘镜像 - 选择默认
1.44M
- 输入
boot.img
,命名镜像
四、编译 .asm
文件
$ nasm boot.asm -o boot.bin
五、写入数据至镜像
$ dd if=boot.bin of=boot.img bs=512 count=1 conv=notrunc
六、在 Win10 中运行虚拟机
双击 Disk & Boot 设置启动项
选择镜像并如图设置:
镜像可在快速访问中的 linux 中找到
六、开机测试
运行结果如图: