因為在保護模式下無法呼叫bios中斷,所以只好自己編寫**控制硬碟讀寫。
對於硬體的控制,其實就是往對應的埠讀寫資料,硬碟也是如此。當硬碟控制器完成某項操作時,則會用中斷的方法提示cpu。我們所要做的,就是先根據需要往埠讀寫資料,然後設定相應的中斷呼叫函式。這樣就可以完成硬碟的讀寫工作。
中斷呼叫函式的內容主要是在硬碟控制器完成任務後做一些檢查、善後的工作,但會根據不同的硬碟操作而有所不同。而硬碟控制器完成工作後都會觸發同一中斷。linux中運用了很不錯的思想,就是在硬碟中斷中呼叫乙個函式指標。在交給硬碟一項任務時,同時設定這個函式指標。這個任務所產生的中斷就會呼叫對應的函式。這樣我們就可以針對不同的任務寫不同的中斷函式了。
下面分析一下linux0.11中的控制硬碟**。
linux中用塊裝置表blk_dev[nr_blk_dev]將塊裝置(struct blk_dev_struct)組織起來,每個塊裝置有兩項內容,乙個函式指標,只想塊裝置對應的操作函式。另乙個是請求內容(struct request)指標。所有的請求結構都放在請求陣列中(request[nr_request]),不區分裝置。而請求裝置相同的請求則穿在同乙個鍊錶中,由塊裝置的第二個指標指向對應的煉表頭。有新請求產生時,用電梯演算法插入對應的鍊錶。
硬碟的引數是從bios的參數列中讀入的,linux在實模式下將需要的bios引數放在乙個固定位置,而在硬碟初始化時將它讀出。
其他的大都非常簡單明瞭,不用多做解釋。
讀硬碟分割槽表的那部分**我還沒有完全搞懂,這牽涉到了緩衝區結構的控制。
關於緩衝區的問題還有很多,比如在緩衝區上等待(sleep),喚醒程序,以及更新標誌等等。
os是個整體,許多內容都會相互牽連,只有慢慢抽絲撥繭,一層層學習。
當然不考慮硬碟分割槽表和緩衝區控制,我們還是可以寫個很簡單的硬碟控制驅動,希望多動手嘗試一下。
Linux 0 11 核心筆記
1 任務0的堆疊問題 一直不明白schedule.c裡的task union的stack和user stack是什麼關係,head.s裡就設定了esp指向user stack,卻一直沒有用到task union,直到看到init task才明白,從進入保護模式到跳轉進使用者態都是用的user sta...
Linux0 11核心筆記( )
c語言 彙編知識 嵌入式彙編 x86處理器和程式設計的相關知識和 unix作業系統設計 linus在最初開發linux作業系統時參考了minix作業系統 作業系統 設計與實現 一種基於訊息傳遞在核心各模組之間進行通訊 資訊交換 重要的五個支柱 unix作業系統 分時作業系統 minix作業系統 gn...
linux 0 11核心 硬碟驅動程式
一 概述 首先要說明的是核心每次讀寫的資料量以乙個邏輯塊為單位,即1024b,而塊裝置控制器則是以扇區 512b 為單位。對硬碟的讀寫操作是通過中斷處理程式進行的,使用讀寫請求項等待佇列來順序緩衝一次讀寫多個邏輯塊的操作。程序讀 硬碟上的乙個邏輯塊時向緩衝區管理程式提出申請,然後進入睡眠狀態。緩衝區...