linux 0 11核心 硬碟驅動程式

2021-05-23 03:01:26 字數 1928 閱讀 7669

一、概述

首先要說明的是核心每次讀寫的資料量以乙個邏輯塊為單位,即1024b,而塊裝置控制器則是以扇區(512b)為單位。

對硬碟的讀寫操作是通過中斷處理程式進行的,使用讀寫請求項等待佇列來順序緩衝一次讀寫多個邏輯塊的操作。程序讀

硬碟上的乙個邏輯塊時向緩衝區管理程式提出申請,然後進入睡眠狀態。緩衝區管理程式檢查緩衝區以前是否已經讀取過

這塊資料,如有直接將對應的緩衝區塊頭指標返回給程序並喚醒它,否則,呼叫ll_rw_block()向相應的裝置驅動程式發出

乙個讀資料塊的操作請求。該函式建立乙個請求結構項,插入佇列,插入時採用電梯演算法(至今還沒讀懂電梯演算法)。如對應

裝置的請求項佇列空,則裝置不忙,立即向該裝置控制器發出讀資料命令。當裝置控制器將資料讀入到指定的緩衝塊中後,就

會發出中斷請求訊號,並呼叫相應的讀命令後處理函式,處理繼續讀扇區操作或者結束本次請求項的過程。(引自趙炯老師)

二、資料結構

塊裝置項

struct blk_dev_struct ;

塊裝置表

extern struct blk_dev_struct blk_dev[nr_blk_dev];//每種塊裝置都在表中占有一項,共7項

請求項struct request ;

請求項陣列

extern struct request request[nr_request];//共32項

請求項佇列由請求項陣列中的項構成,如圖

三、硬碟驅動程式

涉及的檔案:blk.h,hd.c,ll_rw_block.c

blk.h定義如上列出的資料結構,電梯演算法(竟然是用一巨集定義實現的),還有解鎖指定的緩衝塊,結束請求處理等extern inline型別

的函式(僅作為嵌入使用)。

hd.c是硬碟控制器驅動程式。在對硬碟控制器進行控制時,需要同時傳送引數(6b)和命令(1b)。按照這個步驟,將hd.c檔案中的幾乎所有函式串起來。

1.檢測控制器空閒狀態:讀主狀態暫存器,若busy_stat(位7)為0,表示空閒,若在規定時間內控制器一直忙,則超時出錯。該部分由

controller_ready函式實現:

static int controller_ready(void)

2.檢測驅動器就緒:判斷主狀態暫存器的ready_stat(位6)是否為1;

static int drive_busy(void)

3.輸出命令塊,向對應埠輸出引數和命令,hd_out函式實現。

static void hd_out(unsigned int drive,unsigned int nsect,unsigned int sect,

unsigned int head,unsigned int cyl,unsigned int cmd,

void (*intr_addr)(void))

4.等待中斷產生。命令執行後,由硬碟控制器產生中斷請求訊號或置控制器狀態為空閒,表明操作結束或請求扇區傳輸。hd.c中在中斷

處理過程中呼叫的函式有5個,分別是,void unexpected_hd_interrupt(void),static void bad_rw_intr(void),static void read_intr(void),static void write_intr(void),static void recal_intr(void)。

5.操作檢測結果:cpu再次讀主狀態暫存器,若位0為0,則表示命令執行成功,否則失敗,若失敗,還可以進一步查詢錯誤暫存器(hd_error)取錯誤碼。相關的函式是static int win_result(void)。

static int win_result(void)

整個流程由void do_hd_request(void)控制執行。

ll_rw_block.c程式主要用於執行底層塊裝置的讀寫操作,為快裝置建立裝置讀寫項,並插入到指定塊裝置請求佇列中。其呼叫關係如圖,

到檔案系統時再講。

Linux0,11 核心分析 硬碟篇

因為在保護模式下無法呼叫bios中斷,所以只好自己編寫 控制硬碟讀寫。對於硬體的控制,其實就是往對應的埠讀寫資料,硬碟也是如此。當硬碟控制器完成某項操作時,則會用中斷的方法提示cpu。我們所要做的,就是先根據需要往埠讀寫資料,然後設定相應的中斷呼叫函式。這樣就可以完成硬碟的讀寫工作。中斷呼叫函式的內...

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...