这里以MBR启动扇区为例,写一个启动扇区(参考os-dev)
接下来几篇博客应该都是关于bootsector的
如果之后有时间的话,可能复现一个早期的linux
boot后的内存布局
可以看到,启动扇区会被放置在0x7c00-0x7e00
的位置,因此我们在汇编代码中,需要告诉机器,把代码放到0x7c00
的位置
[org 0x7c00]
后续加载硬盘也应该尽量加载到空闲的区域,不覆盖还需要使用的部分
主要内容
想要完成任何程序都需要先有调试的能力,对于这么底层的程序来说更是了
因此,想要完成一个启动扇区,首先要完成字符串打印到屏幕的工作
打印字符串就是最基本的调试能力
[org 0x7c00]
; use bios interrupt to show ascii
; 0x10 is about screen
; setting ah=0x0e means tele-type mode
; setting al="ascii will be type"
start:
mov bp, 0x8000
mov sp, 0x8000
mov bx, hello
call print_str
; just wait and do nothing
; so we could know program is here
jmp $
; param:bx
print_str:
mov ah, 0x0e
L1: cmp byte [bx], 0
je L2
mov al, [bx]
int 0x10
inc bx
jmp L1
L2: ret
hello db 'hello world!', 0ah, 0 ; str to print
times 510 - ($ - $$) db 0 ; filled with 0x00
dw 0xaa55 ; magic num of bootsecto
编译生成二进制,交给qemu,qemu会把文件的第一个扇区(512bytes)作为引导扇区引导操作系统
当然,我们这里的引导扇区只打印了hello world,然后死循环,仅仅测试一下字符串打印
别急,面包会有的,牛奶也会有的,操作系统也会有的,先一步步来吧!
nasm print_str.asm -f bin -o print_str.bin
qemu-system-i386 print_str.bin
hello world总会给人以希望,不是吗?
我发现了,在这个短视频时代,博客也不能太长,不然没人看
又给自己水博客找了个借口,真好啊