前两章主要是一些准备工作,扇区引导,环境配置
引导扇区
开机过程:
计算机电源被打开时,先进行加电自检(Power-On Self-Test;POST),这是BIOS的一个功能,针对硬件如CPU、主板、存储器进行检查,速度很快。
BIOS将磁盘的第一个扇区512字节(引导程序)载入内存,放到内存07c00处。
寻找启动盘,比如从软盘启动,就检查软盘的0面0磁道1扇区,如果发现以0xAA55结束,BIOS就认为这是一个引导扇区
引导扇区除了以0xAA55(这是一个结束标志)结束,还应该包含512字节的执行码(510吧?)
一旦BIOS发现引导扇区,就会将这512字节的内容装入到内存地址07c00h处,然后头转到这里,将控制权交给这段引导代码,计算机的控制就从BIOS转到了操作系统。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
   | 	org	07c00h			; 告诉编译器程序加载到7c00处 	mov	ax, cs 	mov	ds, ax 	mov	es, ax 	call	DispStr			; 调用显示字符串例程 	jmp	$			; 无限循环 $表示当前行被汇编之后的地址 DispStr: 	mov	ax, BootMessage ;NASM中,没有[]的被认为是地址,访问标签中的内容使用[] 	mov	bp, ax			; ES:BP = 字符串地址 	mov	cx, 16			; CX = 串长度 	mov	ax, 01301h		; AH = 13,  AL = 01h 	mov	bx, 000ch		; 页号为0(BH = 0) 黑底红字(BL = 0Ch,高亮) 	mov	dl, 0 	int	10h			; 10h 号中断 	ret BootMessage:		db	"Hello, OS world!" times 	510-($-$$)	db	0	; 填充剩下的空间,使生成的二进制代码恰好为512字节,$$ 表示一个section开始处被汇编后的地址,$-$$表示本行距离程序开始处的相对距离 dw 	0xaa55				; 结束标志
   | 
 
用NASM编译后,得到一个512字节的bin文件,用工具写入到第一个扇区上。
环境搭建
Bochs
ubuntu20.04安装bochs,
装bochs-2.6.9
1 2 3 4 5 6 7 8 9
   | $tar vxzf bochs-2.6.9.tar.gz
  $cd bochs-2.6.9
  $./configure --enable-debugger --with-sdl --enable-disasm  --enable-readline LIBS='-lX11'    
  $make
  $sudo make  install
   |