linux内核杂记(14)-Linux kernel release 5.x(1)
運(yùn)行的硬件
雖然最初是為32位x86的pc(386或更高)開(kāi)發(fā)的,但今天Linux也(至少)運(yùn)行在康柏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架構(gòu)上。
Linux很容易移植到大多數(shù)通用的32或64位架構(gòu)上,只要它們有一個(gè)分頁(yè)內(nèi)存管理單元(PMMU)和一個(gè)GNU C編譯器(gcc)的端口(GNU編譯器集合的一部分,gcc)。Linux也被移植到許多沒(méi)有PMMU的體系結(jié)構(gòu)中,盡管功能顯然有些受限。Linux也被移植到自身。現(xiàn)在,您可以將內(nèi)核作為用戶空間應(yīng)用程序運(yùn)行—這稱為UserMode Linux (UML)。
內(nèi)核對(duì)設(shè)備驅(qū)動(dòng)程序的支持
內(nèi)核提供了各種各樣的接口來(lái)支持設(shè)備驅(qū)動(dòng)程序的開(kāi)發(fā)。
驅(qū)動(dòng)程序綁定
驅(qū)動(dòng)綁定是將一個(gè)設(shè)備與一個(gè)可以控制它的設(shè)備驅(qū)動(dòng)關(guān)聯(lián)起來(lái)的過(guò)程。總線驅(qū)動(dòng)程序通常會(huì)處理這個(gè)問(wèn)題,因?yàn)橛锌偩€特定的結(jié)構(gòu)來(lái)表示設(shè)備和驅(qū)動(dòng)程序。使用通用的設(shè)備和設(shè)備驅(qū)動(dòng)程序結(jié)構(gòu),大多數(shù)綁定都可以使用公共代碼進(jìn)行。
總線Bus
總線類(lèi)型結(jié)構(gòu)包含了系統(tǒng)中該總線類(lèi)型上的所有設(shè)備的列表。當(dāng)為一個(gè)設(shè)備調(diào)用device_register時(shí),它被插入到這個(gè)列表的末尾。總線對(duì)象還包含該總線類(lèi)型的所有驅(qū)動(dòng)程序的列表。當(dāng)驅(qū)動(dòng)程序被調(diào)用driver_register時(shí),它被插入到這個(gè)列表的末尾。這是觸發(fā)驅(qū)動(dòng)綁定的兩個(gè)事件。
device_register
當(dāng)一個(gè)新設(shè)備被添加時(shí),總線的驅(qū)動(dòng)程序列表將被迭代以找到一個(gè)支持它的驅(qū)動(dòng)程序。為了確定這一點(diǎn),設(shè)備的設(shè)備ID必須與驅(qū)動(dòng)程序支持的設(shè)備ID之一匹配。比較IDs的格式和語(yǔ)義是特定于總線的。與其嘗試推導(dǎo)復(fù)雜的狀態(tài)機(jī)和匹配算法,不如由總線驅(qū)動(dòng)提供一個(gè)回調(diào)來(lái)比較設(shè)備和驅(qū)動(dòng)的id。如果找到匹配,總線返回1,否則0。
int match(struct device * dev, struct device_driver * drv);如果找到匹配,設(shè)備的驅(qū)動(dòng)字段被設(shè)置為驅(qū)動(dòng),驅(qū)動(dòng)的探測(cè)回調(diào)被調(diào)用。這給了驅(qū)動(dòng)程序一個(gè)機(jī)會(huì)來(lái)驗(yàn)證它是否真的支持硬件,以及它是否處于工作狀態(tài)。
設(shè)備類(lèi)
探測(cè)成功完成后,設(shè)備被注冊(cè)到它所屬的類(lèi)中。設(shè)備驅(qū)動(dòng)程序?qū)儆谇覂H屬于一個(gè)類(lèi),它在驅(qū)動(dòng)程序的devclass字段中設(shè)置。調(diào)用devclass_add_device來(lái)枚舉類(lèi)中的設(shè)備,并實(shí)際將其注冊(cè)到類(lèi)中,這是通過(guò)類(lèi)的register_dev回調(diào)發(fā)生的。
設(shè)備
當(dāng)一個(gè)驅(qū)動(dòng)程序連接到一個(gè)設(shè)備時(shí),該設(shè)備被插入到驅(qū)動(dòng)程序的設(shè)備列表中。
sysfs
符號(hào)鏈接是在總線的“devices”目錄中創(chuàng)建的,它指向物理層次結(jié)構(gòu)中的設(shè)備目錄。
在驅(qū)動(dòng)的“devices”目錄中創(chuàng)建一個(gè)符號(hào)鏈接,它在物理層次結(jié)構(gòu)中指向設(shè)備的目錄。
在類(lèi)的目錄中創(chuàng)建設(shè)備的目錄。在該目錄中創(chuàng)建一個(gè)符號(hào)鏈接,指向設(shè)備在sysfs樹(shù)中的物理位置。
符號(hào)鏈接可以在設(shè)備的物理目錄中創(chuàng)建到類(lèi)目錄或類(lèi)的頂級(jí)目錄(盡管這還沒(méi)有完成)。也可以創(chuàng)建一個(gè)指向它的驅(qū)動(dòng)程序目錄。
driver_register
當(dāng)添加新的驅(qū)動(dòng)程序時(shí),這個(gè)過(guò)程幾乎是相同的。遍歷總線的設(shè)備列表以找到匹配項(xiàng)。已經(jīng)有驅(qū)動(dòng)程序的設(shè)備會(huì)被跳過(guò)。遍歷所有設(shè)備,以便將盡可能多的設(shè)備綁定到驅(qū)動(dòng)程序。
刪除
當(dāng)一個(gè)設(shè)備被移除時(shí),它的引用計(jì)數(shù)最終將變?yōu)?。當(dāng)它這樣做時(shí),驅(qū)動(dòng)程序的remove回調(diào)被調(diào)用。它從驅(qū)動(dòng)程序的設(shè)備列表中刪除,并且驅(qū)動(dòng)程序的引用計(jì)數(shù)減少。兩者之間的所有符號(hào)鏈接都被移除。
當(dāng)一個(gè)驅(qū)動(dòng)被移除時(shí),它所支持的設(shè)備列表就會(huì)被遍歷,并且驅(qū)動(dòng)的移除回調(diào)函數(shù)會(huì)為每一個(gè)設(shè)備調(diào)用。設(shè)備從列表中移除,符號(hào)鏈接也被移除。
總結(jié)
以上是生活随笔為你收集整理的linux内核杂记(14)-Linux kernel release 5.x(1)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: Error running ‘Tomca
- 下一篇: 解决SVN提交和更新代码冲突?