系统引导
思考
平时我们所用的操作系统比如windows,linux等,它们是如何从按下电源按钮到呈现在我们眼前有文字,有图片的界面呢?
概念
- 硬件刚通电时就会在0xfffffff0处执行bios代码,然后完成一系列自检过程,接着把第一个识别的块设备(软盘,硬盘,U盘等)的第一扇区加载到0x7c00处,然后执行0x7c00的代码
- 只有第一扇区后面是以0x55,0xaa结尾才意味着这个是引导扇区
编译环境
- ubuntu 15.10 x86-64
- nasm,gcc,as
- bochs
引导程序
;表示汇编器从偏移地址0x7c00开始编译程序,这样,bios把这个扇区的代码copy到内存0x7c00处时可以完美执行
org 0x7c00
;显存段地址
mov ax,0xb800
mov es,ax
;00000010b字符属性
mov al,00000010b
mov si,msg
mov di,0
show:
mov bl,[si]
;字节0就代表着结束
cmp bl,0
je end
;低字节存储字符,高字节字符属性
mov es:[di],bl
mov es:[di+1],al
;字符串指针向后
inc si
add di,2
;循环
jmp show
end:
jmp $
;为什么加个0呢,我们想下平时我们编程的时候String s ="galis",字符串"galis"实际上也不止5位
;它是以'\0'结尾的,'\0'在内存表示就是0,意味着字符串结束。
msg: db "Hello,This is galis os!!",0
;$是当前偏移地址(0x7c**) $$是该段开始地址,因为前面第一行org 0x7c00,所以这里应该代表0x7c00
times 510-($-$$) db 0
;第一扇区最后两个字节必须时0x55 0xaa
dw 0xaa55
汇编工具
我自己用tmux+vim搭建了一个用起来还行的nasm汇编工具,左侧code,中间展示lst文件,右上角二进制文件
右下角编译过程信息输出,定义了F8为编译
F12启动bochs执行代码