一、bochs環境搭建
在搭建bochs過程中遇到問題:
bochsrc:13: 'keyboard_mapping' is deprecated - use 'keyboard' option instead.
配置文件中keyboard_mapping改爲:keyboard: keymap=/usr/share/bochs/keymaps/x11-pc-us.map
二、boot.asm
org 07c00h
mov ax, cs
mov ds, ax
mov es, ax
call DispStr
jmp $
DispStr:
mov ax, BootMessage
mov bp, ax
mov cx, 16
mov ax, 01301h
mov bx, 000ch
mov dl, 0
int 10h
ret
BootMessage db "Hello, OS world!"
times 510-($-$$) db 0;
dw 0xaa55
這裏有個問題,爲什麼是0x7c00H?,後來查詢得知:主引導記錄(Master boot record,縮寫爲MBR)會存入內存地址0x7C00,
簡單說,計算機啓動是這樣一個過程。
- 通電
- 讀取ROM裏面的BIOS,用來檢查硬件
- 硬件檢查通過
- BIOS根據指定的順序,檢查引導設備的第一個扇區(即主引導記錄),加載在內存地址 0x7C00
- 主引導記錄把操作權交給操作系統
所以,主引導記錄就是引導"操作系統"進入內存的一段小程序,大小不超過1個扇區(512字節)。
0x7C00這個地址來自Intel的第一代個人電腦芯片8088,以後的CPU爲了保持兼容,一直使用這個地址。
1981年8月,IBM公司最早的個人電腦IBM PC 5150上市,就用了這個芯片。
當時,搭配的操作系統是86-DOS。這個操作系統需要的內存最少是32KB。我們知道,內存地址從0x0000開始編號,32KB的內存就是0x0000~0x7FFF
。
8088芯片本身需要佔用0x0000~0x03FF
,用來保存各種中斷處理程序的儲存位置。(主引導記錄本身就是中斷信號INT 19h的處理程序。)所以,內存只剩下0x0400~0x7FFF
可以使用。
爲了把儘量多的連續內存留給操作系統,主引導記錄就被放到了內存地址的尾部。由於一個扇區是512字節,主引導記錄本身也會產生數據,需要另外留出512字節保存。所以,它的預留位置就變成了:
0x7FFF - 512 - 512 + 1 = 0x7C00
0x7C00就是這樣來的。
計算機啓動後,32KB內存的使用情況如下。
+--------------------- 0x0 | Interrupts vectors +--------------------- 0x400 | BIOS data area +--------------------- 0x5?? | OS load area +--------------------- 0x7C00 | Boot sector +--------------------- 0x7E00 | Boot data/stack +--------------------- 0x7FFF | (not used) +--------------------- (...)
三、關於調試
如果要進入調試功能,必須將bochs拷貝爲bochsdbg。在源文件中將編譯好的bochs拷貝出來
sudo cp bochs /usr/bin/bochsdbg
隨後直接調用bochsdbg來運行鏡像即可。
四、GDT
全局描述表(GDT Global Descriptor Table):在保護模式下一個重要的數據結構。
https://blog.csdn.net/Six_666A/article/details/80634972
https://www.cnblogs.com/bajdcc/p/8972946.html
https://blog.csdn.net/lindorx/article/details/89410113
五、進入保護模式的主要步驟
1、準備GDT;
2、用lgdt加載gdtr;
3、打開A20;
4、置cr0的PE位;
5、跳轉,進入保護模式。