Linux塊裝置總結 六 塊裝置子系統初始化

2021-09-14 05:18:25 字數 1847 閱讀 9567

在上兩篇部落格中我們學習了塊裝置子系統資料組織結構,但是塊裝置子系統的總體上的初始化還沒有涉及到,本章就開始學習塊裝置子系統的一系列初始化。

塊裝置子系統簡而言之是linux中管理塊裝置的乙個子系統,是linux中乙個重要的子系統,沒有塊裝置子系統我們的硬碟,光碟機,usb在我們的linux 系統中都不可能感知,更別提熱插拔的usb了。

塊裝置主要的子系統的初始話是在genhd_device_init函式中下面就依照這個函式來進行解析:

static

int __init genhd_device_init

(void

)

以上函式看起來很容易,但是俗話說:麻雀雖小五臟俱全。如果仔細理解的話可能就不太容易理解了,下面先對於函式中各個變數做乙個簡短的說明。

struct class block_class;

主要使用類裝置的鍊錶結構,把gendisk結構放入block_class類的private->class_device->i_klist鍊錶下面便於尋找

struct kobj_map * bdev_map;

主要使用此雜湊表完成每個主裝置號下面維護著若干個鍊錶,每個鍊錶每個節點下註冊若干個塊次裝置號

struct kobject block_depr;

主要完成在/sys目錄下生成乙個block目錄

各個不同的簡略說明已經在注釋中有說明,下面對各個不同的呼叫進行一一說明。

說明此函式之前我們先看一下此函式前後的呼叫關係,主要有兩句c語言呼叫,如下:

block_class.dev_kobj = sysfs_dev_block_kobj;

error =

class_register

(&block_class)

;

其中block_class變數是乙個全域性變數,定義在genhd_device_init函式上面。sysfs_dev_block_kobj也是乙個全域性變數,其主要作用是在/sys/dev/驅動模型下面生成乙個block目錄,並在class_register呼叫之後完成block_class註冊。

我們再看一下block_class的作用,如下圖:

其主要作用是在block_class->p->class_device->i_klist下面鏈結各個通用磁碟,鏈結的通用磁碟指標在上圖有說明,不一一細說。然後在遍歷驅動的時候先根據主磁碟的裝置號查詢磁碟,找到主裝置號之後,然後根據次裝置號查詢磁碟分割槽。比較方便。

主要生成bdev_map全域性變數,bdev_map為塊裝置驅動的雜湊表,主要管理著塊裝置驅動註冊時候主裝置號和次裝置號的申請和釋放。

bdev_map雜湊表總共有255個鍊錶節點,每個鍊錶節點下面有若干個節點組成,塊裝置在註冊的時候用於查詢未使用的主次裝置號。

此函式原型如下:

int __init blk_dev_init

(void

)

其函式主要有如下功能:

1.建立乙個名為kblocked的工作佇列。

2.建立乙個快取池,主要是為了request_list申請和釋放使用的。

3.建立名為blkdev_queue的快取池,主要是為了request_queue建立乙個快取池。用於request_queue的申請和釋放。

主要建立bdev檔案系統。bdev檔案系統的作用已經在之前有所涉及,不在贅述。

Linux塊裝置驅動之記憶體模擬塊裝置

用記憶體代替塊裝置的總結,相對來簡單得多,對記憶體操作想必大家都很熟悉,直接分配一塊記憶體就可以直接讀寫操作了 參考 drivers block xd.c drivers block z2ram.c define ramblock size 1024 1024 乙個扇區是512位元組 static ...

Linux塊裝置驅動

塊裝置提供塊裝置提供裝置的訪問,裝置的訪問,可以隨機的以固定大小的塊傳輸資料,例如我們最為常見的磁碟裝置,當然塊裝置和字元裝置有較大差別,塊裝置有自己的驅動介面。簡單來說,核心決定乙個塊是固定的4096 位元組,當然該值可以隨著依賴檔案系統的變化而改變。塊裝置驅動採用register blkdev向...

HTML自學之旅(六) 塊

html body h4 塊元素block level element h4 p 大多數 html 元素被定義為塊級元素或內聯元素。br 塊級元素在瀏覽器顯示時,通常會以新行來開始 和結束 例子 h1,p,ul,table p h4 內聯元素inline element h4 p 內聯元素在顯示時通...