操作系统的实现(0)
前言
一直想著要多了解一下操作系統但是由于各種原因一直拖, 來英國這段時間發生了很多事, 眨眼半年過去了, 博客也沒更新幾篇, 之前看現在也沒什么心思看了. 這幾天一直在看操作系統, 想想看操作系統這一塊一直都是自己比較好奇但又不是很了解的一塊, 想著這里概念也挺多的, 就準備搞出這一系列, 也算是做做筆記, 方便以后復習整理.
計算機的啟動過程
關于這個部分我個人也是參考了這個計算機是如何啟動的這篇文章, 然后結合一些書籍談一下個人理解吧. 這一塊首先是寫在ROM芯片里面的程序BIOS(Basic Input/Output System), 正常情況下按下電源鍵之后, BIOS程序啟動, 他的任務按照執行順序主要是下面幾個 :
然后控制權限交給了被加載的引導扇區中的代碼, 這512字節也被稱之為MBR(master boot record). MBR也分三部分 :
分區表什么的這里不提, 具體可以看上面提到的那篇文章. 這一部分暫時只需要提這么多就足夠了. 那么如果要編寫操作系統, 就必須從引導扇區開始寫, 這一塊當時是用匯編代碼, 市面上大多數將編寫操作系統的書籍都無一例外地使用的匯編器nasm, 它所支持的匯編格式是Intel格式的匯編, 和AT&T匯編(gcc那一套)有一定的區別, 具體可以看我之前寫過的文章程序機器級表示(0), 另外這里還需要掌握一些nasm的基本語法, 這個我主要是參考Intel匯編-NASM這篇文章, 講的還是比較詳細的.
下面我從書中截取了一個引導扇區的源代碼, 可以感受一下 :
org 07c00h ; 告訴編譯器程序加載到7c00處;@接下來的三行用來初始化段寄存器mov ax, csmov ds, axmov es, axcall DispStr ; 調用顯示字符串例程jmp $ ; 無限循環;@該函數主要用于負責打印, 當前階段看不懂可以忽略. DispStr:mov ax, BootMessagemov bp, ax ; ES:BP = 串地址mov cx, 16 ; CX = 串長度mov ax, 01301h ; AH = 13, AL = 01hmov bx, 000ch ; 頁號為0(BH = 0) 黑底紅字(BL = 0Ch,高亮)mov dl, 0int 10h ; 10h 號中斷ret BootMessage: db "Hello, OS world!";@這里我感覺應該是 510 - ($ - $$ + 1) 才對 times 510-($-$$) db 0 ; 填充剩下的空間,使生成的二進制代碼恰好為512字節 dw 0xaa55 ; 結束標志所有前面加過@的注釋都是我寫的.
那么來講一下如何把這段代碼運行起來 :
工具很簡單 :
這里只需要即可, 需要注意的是第二行中制作出來的img格式的虛擬光盤之中并沒有文件系統, 所以不能直接被mount到linux上. 所以想使用mount掛載到linux上在進行復制是行不通的.
nasm xxx.asm -o boot dd if=boot of=fred.img bs=512 count=1 qemu fred.img一些疑問
從上述過程中了解到, MBR被加載到07C00位置是作為一種BIOS的默認行為, 既然這樣的話為什么我們需要顯示地聲明org 07c00h呢? 我嘗試著做了如下工作 :
這里可以肯定的是, 決定是否是引導扇區完全了07C00無關, 只要扇區末尾是0Xaa55即可. 那么為什么不加org 07coo就不行呢? 最終看完這篇文章org 0x7c00解疑我才算理解, 就是說這一行的作用在于表明所有數據的偏移量, 因為正常的操作系統中, 由于虛擬內存的存在(而不是物理內存), 每個程序看到的其實內存地址都是0, 所以編譯器并不需要為代碼中每個地址添加偏移量. 而這里是BIOS強行將這段代碼添加到了物理內存的07C00, 這時候如果不添加第一行, 編譯器并不知道這一點, 所以會出現輸出異常, 為了驗證我的理解, 我將07C00改成了07C01, 輸出果然變成了ello, OS world! ".
轉載于:https://www.cnblogs.com/nzhl/p/6108053.html
總結
以上是生活随笔為你收集整理的操作系统的实现(0)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: hdu 2602 Bone Collec
- 下一篇: hibernate3.2多表关联查询常见