讀書筆記《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。(圖一:文件系統數據結構)爲:

(圖二:引導程序數據結構)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章