Linux裝置驅動子系統的構建過程

2021-06-02 23:23:43 字數 3568 閱讀 8317

前面即便文章講述了基本的資料結構和操作函式,這篇文章將從系統啟動開始簡述整個驅動子系統的構建過程。

從系統加電開始,首先是一系列初始化過程,這些過程一般由組合語言**完成,在成功初始化一些必要的裝置之後,程式會執行第乙個c函式start_kernel。為了找個驅動子系統的構建過程,需要沿著start_kernel的函式呼叫順序差下去,start_kernel()-->rest_init(),在rest_init中啟動了乙個核心執行緒,該執行緒執行函式kernel_init。從kernel_init一路差下去,我們又要經過do_basic_setup,終於發現了driver_init()這個目標。?

void__init driver_init(void)

這就是整個驅動子系統構建的初始過程,當然在這個過程之中只是構建乙個大的框架,並沒有什麼真正的裝置可以執行。接下來我們挨個看看這些函式。

1、devtmpfs_init()

這一部主要是構建乙個臨時的/dev檔案系統,主要是vfs的內容,此處不述。

2、devices_init()?

int__init devices_init(void)

這裡建立了三個kobject和乙個kset,其中devices_kset和dev_kobj是兩個頂級節點,在sysfs檔案系統中(一般是目錄/sys)尤其對應的兩個目錄:/sys/devices和/sys/dev,而sysfs_dev_block_kobj和sysfs_dev_char_kobj則是dev_kobj的兩個子節點,對應於目錄/sys/dev/char和/sys/dev/char。

3、buses_init()?

int__init buses_init(void)

這裡建立了乙個kset--bus_kset,這也是乙個頂級節點,對應於目錄/sys/bus。

4、classes_init?

int__init classes_init(void)

這裡建立了乙個kset--class_kset,這也是乙個頂級節點,對應於目錄/sys/class。

5、firmware_init?

int__init firmware_init(void)

這裡建立了乙個kobject--firmware_kobj,這也是乙個頂級節點,對應於目錄/sys/firmware。

6、hypervisor_init?

int__init hypervisor_init(void)

這裡建立了乙個kobject--hypervisor_kobj,這也是乙個頂級節點,對應於目錄/sys/firmware。

以此為界限,下面的幾個函式不再是簡單建立幾個頂級節點這麼簡單。

7、platform_bus_init?

int__init platform_bus_init(void)

在2.6版本的核心中引入了一種虛擬的匯流排型別--platform bus。它並不對應真實的匯流排。在該函式中,首先呼叫乙個函式early_platform_cleanup(),我猜是對啟動過程中的資料進行清理,然後會註冊乙個名為「platform」的裝置,這個裝置會作為所有platform裝置的父節點。在struct device中有乙個parent成員就是會了完成這種父子關係的構建。

除了註冊乙個名為「platform」的裝置之外,還會註冊乙個同樣名稱的匯流排,所有的platform裝置都被當作掛載到這個匯流排上。

8、system_bus_init?

int__init system_bus_init(void)

這裡建立了乙個名為system的kset,其父節點為在devices_init中建立的devices_kset。在此kset中是一些和cpu、中斷控制器、時鐘之類的裝置。

9、cpu_dev_init?

int__init cpu_dev_init(void)

這裡註冊了乙個名為"cpu"的類,其父節點在system_bus_init中註冊的system_kset。其對應的目錄為/sys/devices/system/cpu,其中包含cpu相關的屬性。

10、memory_dev_init?

int__init memory_dev_init(void)

err = memory_probe_init();

if(!ret)

ret = err;

err = memory_fail_init();

if(!ret)

ret = err;

err = block_size_init();

if(!ret)

ret = err;

out:

if(ret)

printk(kern_err"%s() failed: %d\n", __func__, ret);

returnret;

}

這裡註冊了乙個名為"memory"的類,其父節點在system_bus_init中註冊的system_kset。其對應的目錄為/sys/devices/system/memory,其中包含記憶體相關的屬性,如塊大小等。

linux驅動子系統 裝置樹

1 首先編譯階段需要編譯出 dtb 2 假設用uboot啟動,把 dtb載入到ram中,並把相應的位址傳遞給linux 3 linux啟動後依次呼叫setup machine fdt unflatten device tree和of platform populate完成裝置的註冊 此時所有的裝置都...

linux裝置驅動 輸入子系統

輸入裝置都能用輸入子系統來寫,比如說按鍵 觸控螢幕 滑鼠等,但是有的輸入裝置不止用到了輸入子系統,比如說usb輸入裝置,他們還用到了usb子系統。我們以最簡單的按鍵 直接接到cpu上 為例介紹一下輸入子系統。輸入子系統將硬體相關的 與軟體相關的 分開寫,目的是為了以後編寫修改 簡便。軟體部分系統已經...

Linux裝置驅動之 input子系統

什麼是input input子系統處理輸入事務,任何輸入裝置的驅動程式都可以通過input輸入子系統提供的介面註冊到核心,利用子系統提供的功能來與使用者空間互動。輸入裝置一般包括鍵盤,滑鼠,觸控螢幕等,在核心中都是以輸入裝置出現的。下面分析input輸入子系統的結構,以及功能實現。linux中inp...