读书笔记《30天自制操作系统》day01

1. 计算机只知道01代码,计算机启动时从引导扇区开始执行,文件如下hellos.asm

(2013.04.07 自己用二进制代码构筑一个引导扇区,具体构成见下图二)

 

        
        DB	0xeb, 0x4e, 0x90, 0x48, 0x45, 0x4c, 0x4c, 0x4f
	DB	0x49, 0x50, 0x4c, 0x00, 0x02, 0x01, 0x01, 0x00
	DB	0x02, 0xe0, 0x00, 0x40, 0x0b, 0xf0, 0x09, 0x00
	DB	0x12, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00
	DB	0x40, 0x0b, 0x00, 0x00, 0x00, 0x00, 0x29, 0xff
	DB	0xff, 0xff, 0xff, 0x48, 0x45, 0x4c, 0x4c, 0x4f
	DB	0x2d, 0x4f, 0x53, 0x20, 0x20, 0x20, 0x46, 0x41
	DB	0x54, 0x31, 0x32, 0x20, 0x20, 0x20, 0x00, 0x00
	RESB	16 ;预留空间指令
	DB	0xb8, 0x00, 0x00, 0x8e, 0xd0, 0xbc, 0x00, 0x7c
	DB	0x8e, 0xd8, 0x8e, 0xc0, 0xbe, 0x74, 0x7c, 0x8a
	DB	0x04, 0x83, 0xc6, 0x01, 0x3c, 0x00, 0x74, 0x09
	DB	0xb4, 0x0e, 0xbb, 0x0f, 0x00, 0xcd, 0x10, 0xeb
	DB	0xee, 0xf4, 0xeb, 0xfd, 0x0a, 0x0a, 0x68, 0x65
	DB	0x6c, 0x6c, 0x6f, 0x2c, 0x20, 0x77, 0x6f, 0x72
	DB	0x6c, 0x64, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00
	RESB	368
	DB	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x55, 0xaa
	DB	0xf0, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00
	RESB	4600
	DB	0xf0, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00
	RESB	1469432

 

2. 使用nasm编译(80x86汇编编译器http://sourceforge.net/projects/nasm/),直接生成软盘映像

nasm -o helloos.img helloos.asm
 

3.使用bochs(80x86模拟器http://sourceforge.net/projects/bochs/)可虚拟运行,helloos.bxrc

romimage: file=$BXSHARE\BIOS-bochs-latest, address=0xf0000
megs: 16
vgaromimage: $BXSHARE\VGABIOS-lgpl-latest
floppya: 1_44=helloos.img, status=inserted
boot: a
log: bochsout.txt
parport1: enable=0
vga_update_interval: 300000
keyboard_serial_delay: 200
keyboard_paste_delay: 100000
floppy_command_delay: 50000
ips: 4000000
mouse: enabled=0
private_colormap: enabled=0
fullscreen: enabled=0
screenmode: name="sample"
i440fxsupport: enabled=0


4. helloos1.asm=helloos.asm

;FAT12格式文件系统头部分
		DB		0xeb, 0x4e, 0x90
		DB		"HELLOIPL"		
		DW		512		
		DB		1		
		DW		1		
		DB		2		
		DW		224	
		DW		2880	
		DB		0xf0	
		DW		9	
		DW		18	
		DW		2	
		DD		0	
		DD		2880	
		DB		0,0,0x29
		DD		0xffffffff
		DB		"HELLO-OS   "	
		DB		"FAT12   "	
		RESB	18			
;程序主体
		DB		0xb8, 0x00, 0x00, 0x8e, 0xd0, 0xbc, 0x00, 0x7c
		DB		0x8e, 0xd8, 0x8e, 0xc0, 0xbe, 0x74, 0x7c, 0x8a
		DB		0x04, 0x83, 0xc6, 0x01, 0x3c, 0x00, 0x74, 0x09
		DB		0xb4, 0x0e, 0xbb, 0x0f, 0x00, 0xcd, 0x10, 0xeb
		DB		0xee, 0xf4, 0xeb, 0xfd
;显示信息部分

		DB		0x0a, 0x0a	
		DB		"hello, world"
		DB		0x0a		
		DB		0
		;原书中使用下面指令,但这个在nasm中不通过,故使用times
		;RESB	0x1fe - $			
		;times 0x1fe - ($ - $$) DB 0
                times 510 - ($-$$) DB 0

		DB		0x55, 0xaa
;启动区外输出部分
		DB		0xf0, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00
		RESB	4600
		DB		0xf0, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00
		RESB	1469432


 

5. helloos2.asm=helloos1.asm

		
                ORG		0x7c00	;程序加载到内存的位置
		JMP		entry
		DB		0x90    ;模拟磁盘扇区
		DB		"HELLOIPL"		
		DW		512				
		DB		1				
		DW		1			
		DB		2			
		DW		224				
		DW		2880		
		DB		0xf0		
		DW		9			
		DW		18			
		DW		2			
		DD		0			
		DD		2880		
		DB		0,0,0x29	
		DD		0xffffffff		
		DB		"HELLO-OS   "	
		DB		"FAT12   "	
		RESB	18			


entry:
		MOV		AX,0			
		MOV		SS,AX
		MOV		SP,0x7c00
		MOV		DS,AX
		MOV		ES,AX

		MOV		SI,msg
putloop:
		MOV		AL,[SI]
		ADD		SI,1			
		CMP		AL,0    ;到字符串最后了
		JE		fin
		MOV		AH,0x0e	;AH=0ex,AL=显示字符		
		MOV		BX,15	;BH=0,BL=颜色代码		
		INT		0x10	;BIOS显示中断		
		JMP		putloop
fin:
		HLT			 ;停机指令			
		JMP		fin	 ;死循环		

msg:
		DB		0x0a, 0x0a		
		DB		"hello, world"
		DB		0x0a			
		DB		0

		;RESB	0x7dfe-$		
		;times   0x7dfe - ( $ - $$ ) DB 0
                times 510-($-$$) DB 0

		DB		0x55, 0xaa

		DB		0xf0, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00
		RESB	4600
		DB		0xf0, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00
		RESB	1469432

6. 寄存器
16位寄存器
AX:Accumulator,累加寄存器
BX:Base,基址寄存器
CX:Counter,计数寄存
DX:Data,数据寄存器
SP:StackPointer,栈指针寄存器
BP:BasePointer,基址指针寄存器
SI:SourceIndex,源变址寄存器
DI:DestintionIndex,目的变址寄存器

ES:ExtraSegment,附加段寄存器
CS:CodeSegment,代码段寄存器
SS:StackSement,栈段寄存器
DS:DataSegment,数据段寄存器
FS:
GS:

7. FAT12信息

FAT12是MS公司Dos所支持的文件系统之一,当软盘被标准格式化后:每个磁头80个磁道,每个磁道18个扇区,每个扇区512字节,所以标准软盘的容量为:2*80*18*512=1474560B=1440K=1.44M。(图一:文件系统数据结构)为:

(图二:引导程序数据结构)

你可能感兴趣的:(虚拟机-操作系统)