Linux對裝置的識別和初始化

2021-04-13 08:14:53 字數 1581 閱讀 1484

一。系統裝置初始化

二。pci裝置掃瞄和驅動載入

三。usb裝置掃瞄和驅動載入

一。[[anchor(nbe1)]]系統裝置初始化

系統對裝置模型的初始化見檔案drivers/base/init.c中的函式driver_init。

1。裝置模型的初始化

首先是進行device_subsys、bus_subsys、class_subsys以及firmware_subsys子系統的註冊。

完成子系統註冊後,接著對device子系統platform_bus物件,以及bus子系統platform_bus_type物件進行註冊。

最後完成system_subsys子系統的註冊、class子系統中cpu_sysdev_class和memory_sysdev_class物件的註冊。

2。使用do_initcalls呼叫各個裝置模組

核心引數initcall_start和initcall_end是在鏈結時進行合併的函式指標列表,見檔案arch/i386/kernel/vmlinux.lds.s中的.initcall.init節定義。

可以看到,引數initcalls在檔案include/a**-generic/vmlinux.lds.h中的定義,和核心編譯時的初始化定義檔案include/linux/init.h中對函式指標的處理是一致的。在這裡我們只介紹pci裝置和usb裝置的掃瞄和載入。

二。[[anchor(nbe2)]]pci裝置掃瞄和驅動載入

drivers/pci/probe.c:postcore_initcall(pcibus_class_init); _define_initcall("2",fn,2)

drivers/pci/pci-driver.c:postcore_initcall(pci_driver_init); _define_initcall("2",fn,2)

arch/i386/pci/init.c:arch_initcall(pci_access_init); _define_initcall("3",fn,3)

arch/i386/pci/legacy.c:subsys_initcall(pci_legacy_init); _define_initcall("4",fn,4)

arch/i386/pci/irq.c:subsys_initcall(pcibios_irq_init); _define_initcall("4",fn,4)

arch/i386/pci/common.c:subsys_initcall(pcibios_init); _define_initcall("4",fn,4)

arch/i386/pci/i386.c:fs_initcall(pcibios_assign_resources); _define_initcall("5",fn,5)

drivers/pci/proc.c:_initcall(pci_proc_init); _define_initcall("6",fn,6)

drivers/pci/pci-sysfs.c:late_initcall(pci_sysfs_init); _define_initcall("7",fn,7)

三。[[anchor(nbe3)]]usb裝置掃瞄和驅動載入

初始化 鍵盤裝置

1 bool initinput hwnd hwnd 216 第二步 建立裝置,滑鼠,鍵盤等。17 res pinput createdevice 18 guid syskeyboard,裝置的guid,這裡使用定義好的 19 pkeyboard,裝置指標 20null 21if succeeded...

linux 裝置驅動之模組的初始化和退出

include 模組的初始化和退出檔案 include init 和 exit 資料段 模組安裝函式 static int init drive test init void 模組解除安裝函式 static void exit drive test exit void module init dri...

linux板級裝置的初始化過程

出處 start kernel setup arch command line mdesc setup machine machine arch type list lookup machine type nr return struct machine desc.核心在啟動的時候就是最先執行sta...