《oranges一個作業系統的實現》閱讀筆記三
阿新 • • 發佈:2019-02-17
第三章工具的使用
1.如何除錯超過一個扇區的程式?
在這裡總結以下從第一章到第四章,書上所用各種工具的意義。 1)第一章直接用軟盤,用bochs載入軟盤,程式寫到軟盤的第一個扇區,bochs相當於一個實體機器,從軟盤第一個扇區讀取程式到0x7c00h,並跳轉到此處執行。(具體開機流程可以參考第一篇筆記) 2)第二章用軟盤的映象檔案充當虛擬的軟盤,並沒有突破引導扇區一個扇區容量的限制 3)第三章由於引導扇區512位元組的限制,限制了實驗程式的大小,而又暫時不想進入引導扇區載入其他程式進記憶體比如Loader的步驟,所以就暫時利用freedos這個作業系統,bochs通過利用freedos.img的第一個扇區當做引導扇區,先把CPU控制權交給freedos,freedos格式化我們實驗程式寫入的b.img為dos檔案系統格式,我們將自己的實驗程式拷貝到b.img(就是向檔案系統中拷貝個檔案)中,然後在freedos通過指令載入執行我們的實驗程式,利用了dos的檔案系統2. 為什麼用COM,ELF檔案?
3.什麼時候使用匯編語言什麼時候用C語言?
4.boot, loader, kernel都實現了什麼?
Boot是引導扇區程式碼,受限於512位元組大小限制,負責根據FAT12檔案系統找到Loader所在軟盤扇區位置,並將它載入到記憶體,將CPU控制權交給Loader。實現的是MBR程式的功能。但是使用了FAT12檔案系統這個現有的功能並未自己實現。 Loader是負責載入kernel進記憶體,並且進入保護模式,然後將kernel根據ELF program資訊將kernel載入不同的段,並且實現了分頁,最後將CPU控制權交給Kernel。所以Loader實現了程式載入器的功能。 Kernel就是我們的核心,作業系統的核心,程序管理,記憶體管理,磁碟管理等的實現處。5.既然需要用到FAT12檔案系統還需要自己定義引導盤的盤頭資訊嗎?
這個問題的意思是既然我們需要將自己的軟盤格式化為FAT12格式,我們還需要定義下圖的FAT盤頭資訊嗎? 其實不需要了,因為反正我們都要將整個軟盤格式化成FAT12,因為我們沒有自己的檔案系統,格式化的時候,引導扇區就已經被寫入了上圖定義的那些資料了。可以看到前面62個位元組就是所謂的軟盤BP頭資訊,所以boot.asm其實沒有必須定義這些資料,所以將 BS_OEMNameDB 'ForrestY'; OEM String, 必須 8 個位元組
改成Off_BS_OEMNAME equ 3,其他資訊一樣的處理,這樣變數定義變成了常量,可以節省62個位元組的記憶體,這對於引導扇區512位元組可是很珍貴的,相應的使用語句 addbx, [BPB_BytsPerSec]需要變成addbx, [Off_BPB_BytsPerSec+7c00h],因為編譯器不會再幫我們計算偏移地址了,經測試程式可以正常執行。