歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux基礎 >> Linux教程 >> Linux設備驅動結構梳理

Linux設備驅動結構梳理

日期:2017/2/28 16:05:14   编辑:Linux教程

最近為了學習Android底層設備驅動而把Linux底層設備驅動復習整理了一下。

Linux設備驅動程序是一個內核模塊,可以隨時添加到內核和隨時從內核中刪除。很自然,在模塊被他人使用時無法刪除,因而存在一個模塊被使用的計數器。

對比vxWorks/Linux/QNX/OSE等等系統的設備驅動程序,萬變不離其宗,任何系統的驅動層界面應該有如下根本的東西:

1、OS系統必定有某種設備鏈表,並有某種掛入函數能夠將一個新設備及其驅動程序掛入這個鏈表。

2、從OS往下看,設備必定會提供一套讀寫接口。

找到這兩者就摸清了這個OS體系的驅動脈絡,其他細節可以順籐摸瓜找出來。對應上述1,設備及驅動掛入函數往往類似dev_register(dev_num, dev_attr)和drv_register(dev_num, drv_funcs_pointer),Linux體系的字符設備的對應函數是cdev_add()。對應上述2,驅動軟件必須提供類似open/read/write/set/close之類函數,Linux把普通非網絡設備當文件看待,故這類函數接口和文件操作函數接口一致。

Linux有一個設備鏈表,這已經足夠,但是為了更好地觀察和管理設備及驅動而發展了統一設備模型,其核心數據結構是kobject和kset。

每一個設備對應一個kobject結構,設備被使用的計數器也在這個結構裡面。kset是一組相近設備集合的父節點結構,"a set of"在英文中是“一套”的意思,我猜測kset裡面的set就是這個“套”的意思。

一組相近設備集合中每個kobject的父指針都指向其kset,而kset有個指針指向這個設備集合的第一個kobject,這個kobject的next指針指向第二個kobject,類推,所有kobject被這樣的鏈表串接。

由於kset下屬這組設備類型近似,所以kset結構鏈接一個kobj_type結構,在這個type結構中統一描述了組內所有設備的type情況。單個kobject內的type信息可能被忽略。

由於kset管理一組kobject,故存在將kobject添加到kset的接口,以及對應的刪除接口,可能還有查詢接口。

若干相近的kset組成一個驅動子系統subsystem,比如多種輸入設備組成的輸入子系統。

通過kset/kobject/kobj_type/subsystem等,所有設備組成了一顆設備樹,這樣Linux系統可以方便地查看整個系統的設備的層次和從屬情況,可能還有分類統計情況。

進一步,Linux將這種樹形結構對應成一個虛擬的,也即內存中的文件目錄樹結構,即sysfs。其中大多數目錄都對應設備樹,其中最深一層子目錄對應一個設備,該目錄中的文件對應設備的屬性attr。另外sysfs還有設備的類視圖class目錄等,不過這些並非理解Linux設備驅動結構的關鍵。

Copyright © Linux教程網 All Rights Reserved