linux内核杂记(14)-Linux kernel release 5.x(1)
運行的硬件
雖然最初是為32位x86的pc(386或更高)開發的,但今天Linux也(至少)運行在康柏Alpha AXP、Sun SPARC和UltraSPARC、摩托羅拉68000、PowerPC、PowerPC64、ARM、日立SuperH、Cell、IBM S/390、MIPS、惠普PA-RISC、英特爾IA-64、DEC VAX、AMD x86-64 Xtensa和ARC架構上。
Linux很容易移植到大多數通用的32或64位架構上,只要它們有一個分頁內存管理單元(PMMU)和一個GNU C編譯器(gcc)的端口(GNU編譯器集合的一部分,gcc)。Linux也被移植到許多沒有PMMU的體系結構中,盡管功能顯然有些受限。Linux也被移植到自身。現在,您可以將內核作為用戶空間應用程序運行—這稱為UserMode Linux (UML)。
內核對設備驅動程序的支持
內核提供了各種各樣的接口來支持設備驅動程序的開發。
驅動程序綁定
驅動綁定是將一個設備與一個可以控制它的設備驅動關聯起來的過程。總線驅動程序通常會處理這個問題,因為有總線特定的結構來表示設備和驅動程序。使用通用的設備和設備驅動程序結構,大多數綁定都可以使用公共代碼進行。
總線Bus
總線類型結構包含了系統中該總線類型上的所有設備的列表。當為一個設備調用device_register時,它被插入到這個列表的末尾。總線對象還包含該總線類型的所有驅動程序的列表。當驅動程序被調用driver_register時,它被插入到這個列表的末尾。這是觸發驅動綁定的兩個事件。
device_register
當一個新設備被添加時,總線的驅動程序列表將被迭代以找到一個支持它的驅動程序。為了確定這一點,設備的設備ID必須與驅動程序支持的設備ID之一匹配。比較IDs的格式和語義是特定于總線的。與其嘗試推導復雜的狀態機和匹配算法,不如由總線驅動提供一個回調來比較設備和驅動的id。如果找到匹配,總線返回1,否則0。
int match(struct device * dev, struct device_driver * drv);如果找到匹配,設備的驅動字段被設置為驅動,驅動的探測回調被調用。這給了驅動程序一個機會來驗證它是否真的支持硬件,以及它是否處于工作狀態。
設備類
探測成功完成后,設備被注冊到它所屬的類中。設備驅動程序屬于且僅屬于一個類,它在驅動程序的devclass字段中設置。調用devclass_add_device來枚舉類中的設備,并實際將其注冊到類中,這是通過類的register_dev回調發生的。
設備
當一個驅動程序連接到一個設備時,該設備被插入到驅動程序的設備列表中。
sysfs
符號鏈接是在總線的“devices”目錄中創建的,它指向物理層次結構中的設備目錄。
在驅動的“devices”目錄中創建一個符號鏈接,它在物理層次結構中指向設備的目錄。
在類的目錄中創建設備的目錄。在該目錄中創建一個符號鏈接,指向設備在sysfs樹中的物理位置。
符號鏈接可以在設備的物理目錄中創建到類目錄或類的頂級目錄(盡管這還沒有完成)。也可以創建一個指向它的驅動程序目錄。
driver_register
當添加新的驅動程序時,這個過程幾乎是相同的。遍歷總線的設備列表以找到匹配項。已經有驅動程序的設備會被跳過。遍歷所有設備,以便將盡可能多的設備綁定到驅動程序。
刪除
當一個設備被移除時,它的引用計數最終將變為0。當它這樣做時,驅動程序的remove回調被調用。它從驅動程序的設備列表中刪除,并且驅動程序的引用計數減少。兩者之間的所有符號鏈接都被移除。
當一個驅動被移除時,它所支持的設備列表就會被遍歷,并且驅動的移除回調函數會為每一個設備調用。設備從列表中移除,符號鏈接也被移除。
總結
以上是生活随笔為你收集整理的linux内核杂记(14)-Linux kernel release 5.x(1)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Error running ‘Tomca
- 下一篇: linux内核杂记(15)-系统调用(2