Orange S 一個操作系統的實現——筆記1

 

一、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,

簡單說,計算機啓動是這樣一個過程。

  1. 通電
  2. 讀取ROM裏面的BIOS,用來檢查硬件
  3. 硬件檢查通過
  4. BIOS根據指定的順序,檢查引導設備的第一個扇區(即主引導記錄),加載在內存地址 0x7C00
  5. 主引導記錄把操作權交給操作系統

所以,主引導記錄就是引導"操作系統"進入內存的一段小程序,大小不超過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、跳轉,進入保護模式。

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