對於各種塊設備,內核使用了一張塊設備表blk_dev[]來進行管理。每種塊設備都在塊設備表中佔據一項。
塊設備表中每個塊設備項的數據結構爲:
// 塊設備處理結構。
struct blk_dev_struct {
void (*request_fn)(void); // 請求處理函數指針。
struct request * current_request; // 當前處理的請求結構。
}
// 下面是請求隊列中項的結構。其中如果字段dev = -1,則表示隊列中該項沒有被使用。
// 字段cmd可取常量 READ(0)或 WRITE(1)(定義在include/linux/fs.h中)。
// 其中,內核並沒有用到waiting指針,起而代之地內核使用了緩衝塊的等待隊列。因爲
// 等待一個緩衝塊與等待請求項完成是對等的。
struct request {
intdev; /* -1 if no request */ // 發請求的設備號。
intcmd; /* READ or WRITE */ // READ或WRITE命令。
int errors; //操作時產生的錯誤次數。
unsigned long sector; // 起始扇區。(1塊=2扇區)
unsigned long nr_sectors; // 讀/寫扇區數。
char * buffer; // 數據緩衝區。
struct task_struct * waiting; // 任務等待請求完成操作的地方(隊列)。
struct buffer_head * bh; // 緩衝區頭指針(include/linux/fs.h,68)。
struct request * next; // 指向下一請求項。
};