一、起源
僅devfs,導(dǎo)致開發(fā)不方便以及一些功能難以支持:
-
熱插拔
-
不支持一些針對所有設(shè)備的統(tǒng)一操作(如電源管理)
-
不能自動mknod
-
用戶查看不了設(shè)備信息
-
設(shè)備信息硬編碼,導(dǎo)致驅(qū)動代碼通用性差,即沒有分離設(shè)備和驅(qū)動
二、新方案
uevent機(jī)制:sysfs + uevent + udevd(上層app)
2.1 sysfs: 一種用內(nèi)存模擬的文件系統(tǒng),系統(tǒng)啟動時mount到/sys目錄
sysfs用途:(類似于windows的設(shè)備管理器)
-
建立系統(tǒng)中總線、驅(qū)動、設(shè)備三者之間的橋梁
-
向用戶空間展示內(nèi)核中各種設(shè)備的拓?fù)鋱D
-
提供給用戶空間對設(shè)備獲取信息和操作的接口,部分取代ioctl功能
sysfs在內(nèi)核中的組成要素 | 在用戶空間/sys下的顯示 |
---|---|
內(nèi)核對象(kobject) | 目錄 |
對象屬性(attribute) | 文件 |
對象關(guān)系(relationship) | 鏈接(Symbolic Link) |
四個基本結(jié)構(gòu)
類型 | 所包含的內(nèi)容 | 內(nèi)核數(shù)據(jù)結(jié)構(gòu) | 對應(yīng)/sys項(xiàng) |
---|---|---|---|
設(shè)備(Devices) | 設(shè)備是此模型中最基本的類型,以設(shè)備本身的連接按層次組織 | struct device | /sys/devices/?/?/.../ |
驅(qū)動(Drivers) | 在一個系統(tǒng)中安裝多個相同設(shè)備,只需要一份驅(qū)動程序的支持 | struct device_driver | /sys/bus/pci/drivers/?/ |
總線(Bus) | 在整個總線級別對此總線上連接的所有設(shè)備進(jìn)行管理 | struct bus_type | /sys/bus/?/ |
類別(Classes) | 這是按照功能進(jìn)行分類組織的設(shè)備層次樹;如 USB 接口和 PS/2 接口的鼠標(biāo)都是輸入設(shè)備,都會出現(xiàn)在/sys/class/input/下 | struct class | /sys/class/?/ |
目錄組織結(jié)構(gòu):文章來源:http://www.zghlxwxcb.cn/news/detail-560820.html
/sys下的子目錄 | 所包含的內(nèi)容 |
---|---|
/sys/devices | 這是內(nèi)核對系統(tǒng)中所有設(shè)備的分層次表達(dá)模型,也是/sys文件系統(tǒng)管理設(shè)備的最重要的目錄結(jié)構(gòu); |
/sys/dev | 這個目錄下維護(hù)一個按字符設(shè)備和塊設(shè)備的主次號碼(major:minor)鏈接到真實(shí)的設(shè)備(/sys/devices下)的符號鏈接文件; |
/sys/bus | 這是內(nèi)核設(shè)備按總線類型分層放置的目錄結(jié)構(gòu), devices 中的所有設(shè)備都是連接于某種總線之下,在這里的每一種具體總線之下可以找到每一個具體設(shè)備的符號鏈接,它也是構(gòu)成 Linux 統(tǒng)一設(shè)備模型的一部分; |
/sys/class | 這是按照設(shè)備功能分類的設(shè)備模型,如系統(tǒng)所有輸入設(shè)備都會出現(xiàn)在/sys/class/input 之下,而不論它們是以何種總線連接到系統(tǒng)。它也是構(gòu)成 Linux 統(tǒng)一設(shè)備模型的一部分; |
/sys/kernel | 這里是內(nèi)核所有可調(diào)整參數(shù)的位置,目前只有 uevent_helper, kexec_loaded, mm, 和新式的slab 分配器等幾項(xiàng)較新的設(shè)計(jì)在使用它,其它內(nèi)核可調(diào)整參數(shù)仍然位于sysctl(/proc/sys/kernel) 接口中; |
/sys/module | 這里有系統(tǒng)中所有模塊的信息,不論這些模塊是以內(nèi)聯(lián)(inlined)方式編譯到內(nèi)核映像文件(vmlinuz)中還是編譯為外部模塊(ko文件),都可能會出現(xiàn)在/sys/module 中 |
/sys/power | 這里是系統(tǒng)中電源選項(xiàng),這個目錄下有幾個屬性文件可以用于控制整個機(jī)器的電源狀態(tài),如可以向其中寫入控制命令讓機(jī)器關(guān)機(jī)、重啟等。 |
2.2 uevent
文章來源地址http://www.zghlxwxcb.cn/news/detail-560820.html
三、代碼中自動mknod
struct class *class_create(struct module *owner, const char *name); /* * 功能:在/sys/class生成一個目錄,目錄名由name指定 * 參數(shù): struct module *owner - THIS_MODULE const char *name - 目錄名 * 返回值 成功:class指針 ? 失?。篘ULL */ /* 輔助接口:可以定義一個struct class 的指針變量cls來接受返回值,然后通過IS_ERR(cls)判斷是否失?。?IS_ERR(cls);成功----------------->0 IS_ERR(cls);失敗----------------->非0 PTR_ERR(cls);來獲得失敗的返回錯誤碼; */
void class_destroy(struct class *cls) /* * 功能:刪除class_create生成目錄 * 參數(shù): struct class *cls - class指針 * 返回值 */
struct device *device_create(struct class *class, struct device *parent, ? ? dev_t devt, void *drvdata, const char *fmt, ...) /* * 功能:在/sys/class目錄下class_create生成目錄再生成一個子目錄與該設(shè)備相對應(yīng),發(fā)uevent讓應(yīng)用程序udevd創(chuàng)建設(shè)備文件 * 參數(shù): struct class *class - class指針 struct device *parent - 父對象,一般NULL dev_t devt - 設(shè)備號 void *drvdata - 驅(qū)動私有數(shù)據(jù),一般NULL const char *fmt - 字符串的格式 ... - 不定參數(shù) * 返回值 成功:device指針 失?。篘ULL */
void device_destroy(struct class *class, dev_t devt) /* * 功能:刪除device_create生成目錄 * 參數(shù): struct class *class - class指針 dev_t devt - 設(shè)備號 * 返回值 */
到了這里,關(guān)于嵌入式內(nèi)核及驅(qū)動開發(fā)高級的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!