原因是前些天在楊老師的討論課上楊老師提出了這個問題:沒有作業系統的光板機器,要寫乙個helloworld怎麼辦?有乙個哥們提出了可以用bios的中斷寫,我也記得于淵的《自己動手寫作業系統》一書中提到過,但是忘了具體要怎麼辦。回到宿舍找到于淵的書,看到了如下的**,並按書上的方法實驗了一下,執行成功了。**如下:
做乙個簡單的說明,利用的原理就是bios的10號中斷,至於這個10號中斷怎麼用,可以參考網上手冊,還有好多的資料,主要說的是使用10號中斷前不同暫存器的含義,比如cx放的是顯示字元的長度,ax中是字串的起始位址等等。
完成以後用nasm 彙編器進行編譯 nasm -o boot.bin boot.asm
然後用dd命令放到乙個虛擬軟碟機的鏡象中去 dd if=boot.bin of=myimage.img
選乙個合適的虛擬機器,新建乙個機器,用這個虛擬光碟機啟動,就會在啟動介面上顯示「hello」 這幾個字元,但是此後就會進入死迴圈。
這個程式的實質是做了乙個512位元組的引導扇區,然後放到光碟機的第0扇區。在執行的時候什麼也不做,只列印乙個字串而已。
通過這個程式,我理解了bios中斷的含義,引導扇區的具體含義,對系統引導的第一步有了個大概的理解。但是同時有幾個疑問:
第一,是不是在作業系統中所有的最底層操作最後都要轉化成bios中斷來實現?如果是那樣的話,從應用程式到bios中斷,確實有乙個相當長的路要走。
這個問題我已經有答案了,答案是否。因為在linux中會用自己的中斷代替所有的bios中斷,因為bios中斷存在一些併發性以及效能方面的弱點,因此只能另寫了一套中斷放在記憶體中,所以我們平常看到應用程式中也是要走乙個相當長的由上向下的過程,只不過這個過程終點不是bios中斷,而是覆寫的新中斷,但起的作用是一樣的,只是功能更強了。
第二,如果不是從軟盤啟動,而是從硬碟啟動,這個過程是怎樣的?
現在這個問題我也有答案了,只是想先賣個關子,後面講到的時候會涉及的。
假如作業系統不用中斷,只用佇列
假如作業系統不用中斷,只用佇列 這個就要看下作業系統的定時器的實現 cmux最多支援80多個串列埠通道,作業系統對中斷bai訊號的處理實際是對硬體du中斷的一種模擬,cpu在zhiintr引腳上接到乙個中斷請dao求訊號,如果此時if 1,cpu就會在當前指令執行完以後開始響應外部的中斷請求,這時,...
自己寫作業系統 bootsector篇
其實博主本來想在寒假自己寫乙個oskernal的,高高興興的影印了本 乙個作業系統的實現 然後又去圖書館借來 30天自製作業系統 和 x86 x64體系探索程式設計 結果還是被自己的懶惰給打敗了。原本我感覺自制力還不錯的,好歹春節前也看了很多東西,但是過了乙個春節就懶散了。當然也有一部分原因是因為 ...
讀者寫者問題 作業系統
動機 共享資料的訪問 兩種型別使用者 讀者 不需要修改資料 寫者 讀取和修改資料 問題的約束 允許同一時間有多個讀者,但在任何時候只有乙個寫者 當沒有寫者是讀者才能訪問資料 當沒有讀者和寫者時,寫者才能訪問資料 在任何時候只有乙個執行緒能操作共享變數 多個併發程序的資料集共享 rcount 有多少個...