ldd隨筆(1)-linux設備模型

一下只是個人學習后的理解,可能有很多不對的地方。

要學習linux的設備驅動模型,首先必須要知道kobject和kset的概念,下面是kobject在2.6.38的源碼中的實現。

struct kobject {const char      *name;      //名稱,可能在sysfs中創建對應的目錄struct list_head    entry;    //標準鏈表,用于被kset連接起來struct kobject      *parent; //指向父kobject的指針struct kset     *kset;         //指向所屬的kset的指針struct kobj_type    *ktype; //包含的kobj_type, 用指向不同的ktype來表示不同的objectstruct sysfs_dirent *sd;      //在sysfs中創建目錄時用到的結構struct kref     kref;           //引用計數unsigned int state_initialized:1;unsigned int state_in_sysfs:1;unsigned int state_add_uevent_sent:1;unsigned int state_remove_uevent_sent:1;unsigned int uevent_suppress:1;
};

kobject里面比較重要的一個是kobj_type結構的指針:

struct kobj_type {void (*release)(struct kobject *kobj);  //當此kobj被完全釋放(引用為0)時調用const struct sysfs_ops *sysfs_ops;  //與sysfs相關的操作struct attribute **default_attrs;  //代表了一系列屬性。const struct kobj_ns_type_operations *(*child_ns_type)(struct kobject *kobj);const void *(*namespace)(struct kobject *kobj);
};

kobject中的ktype指向不同的kobj_type可以代表著不同的類型,以及所執行的不同操作。kobject可能在sysfs中表現為一個目錄,而它指向的kobj_type中包含的一系列struct attribute則代表著這個目錄下的文件。每一個屬性對應了一個文件,可以設置它的讀寫權限,名稱(文件名)還有就是當讀或者寫這些文件時,調用的show和store函數。可以利用這些屬性文件,進行信息的展示和配置的修改等。

kobject只是代表著某個結點,并不能構成特定的結構,所以還存在一個kset,使得它們可以構成一個樹狀結構。kset的實現如下:

struct kset {struct list_head list;  //鏈表頭,用以將下層的kobject串起來spinlock_t list_lock;  //鏈表的鎖,只能串行操作struct kobject kobj;  //kset包含一個kobjectconst struct kset_uevent_ops *uevent_ops;  //為了支持熱插拔所提供的結構
};

kset里面包含了一個kobject,而不止是一個指針。所以可以把kset看成是一個kobject的擴展,所有對kobject的操作,都適用與kset(操作其中的kobject,但是內核為kobject和kset分別提供了一套類似的操作)。如果用C++表述,kobject就是一個基類,而kset是它的派生類。kset可以通過它的list包含住很多子kobject,而這些子kobject又可以通過parent和kset指針指向它的父kobject(kset);并且kset也是(包含了)一個kobject,所以它還可以被其它的kset當做子kobject。這樣就構成了一個樹狀結構,其中kobject是葉子結點,而kset是非葉子結點或者根結點,正好和目錄與文件的關系類似。目錄本身是一個文件,但是它可以包含其它文件或目錄,同時又被其它目錄含(根目錄除外)。所以sysfs中的文件結構通常對應了內核中的kobject結構。每一個目錄代表一個kobject(或者kset),而此目錄里面的子目錄又代表了這個kobject下面的子kobject,目錄里的文件代表了kobject的一系列屬性。

而kset_uevent_ops(對應老版內核中的hotplug,熱插拔)指向了一組操作,包括過濾,熱插拔等,當往一個kset中添加新的kobject時,便會觸發這些操作,首先會調用filter表示是否過濾這個事件,然后在調用熱插拔處理函數來向環境變量里添加值,從而達到通知用戶空間的目的。假如次kset沒有設置這個uevent_ops指針,便會往它的父kobject迭代查找,直到找到為止(若到根kobject都沒有,就忽略)。再進行調用。

kobject通常不單獨使用,而是嵌入到其他結構,代表就是pci core和usb core,它們是內核提供的,利用kobject來構造的樹狀結構驅動框架。

linux內核利用以上的框架,包裝出了三個概念,那就是總線,設備,和驅動。總線可以看成是樹狀結構中的非葉子結點(包括根結點),設備和驅動可以看成其中的葉子結點;當有設備插入,便可利用上面uevent_ops的機制,添加環境變量,然后調用udev(hotplug)來判斷插入設備的類型,然后根據類型查找modules.***map表,找到合適的驅動程序,加載其入內核;當驅動程序加載到內核的時候,同樣會想總線注冊,也會激活uevent_ops的操作,這時系統會對設備和驅動進行匹配,若匹配正確,就會調用驅動程序里的probe函數。當設備取下時,系統會調用驅動程序的remove函數。這樣就可以支持熱插拔。

linux內核還提供了usb和pci等總線的抽象,它們是在bus,device和driver之上進行進一步的包裝。內核已經把總線和設備的部分完成了,驅動作者只需要關注驅動程序的實現即可。例如,linux內核提供的usb core已經完成了usb的大部分工作,包括總線驅動,以及usb框架,還有設備的識別和初始化等,以及設備和驅動之間進行通信的urb方式,甚至還包含了大部分設備的驅動程序,但是有的設備驅動內核并沒有。我們會在windows經常看到一種情況,某個設備被識別了,但是沒有驅動程序而不能被使用,其中識別出設備就是內核所完成的,而這樣的驅動往往就必須由設備提供者自己實現了。總之在內核抽象出一套驅動框架之上,驅動作者可以免去很多的工作。

轉載于:https://www.cnblogs.com/xien7/archive/2013/02/03/2890577.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/274366.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/274366.shtml
英文地址,請注明出處:http://en.pswp.cn/news/274366.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

插圖 引用 同一行兩個插圖_提出食物主題中的插圖

插圖 引用 同一行兩個插圖I have a page in my portfolio, which is about search functionality. I wanted that page to feel fun and engaging, to convey a positive vibe, so I decided to add illustrations to it.我的投資組合中有一個頁面與搜索功能有關。 我希望該頁面…

Hadoop的SequenceFile讀寫實例

1 SequenceFile可以處理hdfs上大量小文件,它可以作為大量小文件的容器。HDFS和MapReduce是針對大文件優化的,所以通過SequenceFile類型將小文件包裝起來可以獲得更高效的存儲和處理。存儲2 在SequenceFile中的鍵和值并不一定是Writable類型&#xff…

臉部細微表情識別_您可以僅使用面部表情來控制字體嗎?

臉部細微表情識別原型 (The prototype) Facetype is the name of Adam’s interactive project, in which the emotions detected from a person’s facial gestures control a variable font. To each detected emotion corresponds a specific typeface, which keeps transfo…

ssky-keygen + ssh-copy-id 無密碼登陸遠程LINUX主機

使用下例中ssky-keygen和ssh-copy-id,僅需通過3個步驟的簡單設置而無需輸入密碼就能登錄遠程Linux主機。 ssh-keygen 創建公鑰和密鑰。 ssh-copy-id 把本地主機的公鑰復制到遠程主機的authorized_keys文件上。ssh-copy-id 也會給遠程主機的用戶主目錄(ho…

uva10891Game of sum

題意:經典的取石子游戲是這樣的:有一堆石子,A、B兩個人輪流取,每次取一顆,只能從邊上取,每個石子有相應的價值,A、B兩人都想使得自己的價值最多,兩個人足夠聰明,問最后價值分別是多少 本題則是可…

用戶體驗設計師能為seo做_用戶體驗設計師可以從產品設計歷史中學到什么

用戶體驗設計師能為seo做Many things have changed from tool design in the prehistoric era to today’s digital product design. However, we can see surprisingly many similarities. Especially when it comes down to one particular aspect: usability.從史前時代的工…

函數指針

顧名思義,指針函數即返回指針的函數。其一般定義形式如下: 類型名 *函數名(函數參數表列); 其中,后綴運算符括號“()”表示這是一個函數,其前綴運算符星號“*”表示此函數為指針型函數,其函數值為指針,即它…

orton效果_如何使圖片發光:Orton效果

orton效果Have you ever seen an impossibly dream-like landscape photo? One with a slow burning, glowing sunset. That’s really the best way to describe it, the image looks as if it’s glowing. You might be thinking, “wow, I wish I was that good and could …

UVA10785 The Mad Numerologist

雖然是sorting的壓軸,但是比起前面真心水題。這個專題結合前面string的很多,排序相對簡單了,qsort基本解決。 題目: The Mad Numerologist Numerology is a science that is used by many people to find out a mans personality,…

蘋果人機交互指南_蘋果人機界面設計指南的10個見解

蘋果人機交互指南重點 (Top highlight)I’ve been developing an IOS app for the past few months and have been constantly referring to Apple’s Human Interface Design Guidelines. I would consider it a must-read for any aspiring or current UI/UX designer.在過去…

也來學學插件式開發

上一家公司有用到插件式開發來做一個工具箱,類似于QQ電腦管家,有很多工具列表,點一下工具下載后就可以開始使用了。可惜在那家公司待的時候有點短,沒有好好研究一下。現在有空,自己在網上找了些資料,也來試…

同態加法_我對同態的想法

同態加法Early February, I uploaded this shot onto Dribbble. Nothing fancy –– just two screens experimenting with “2月初,我將這張照片上傳到Dribbble。 沒什么幻想–只有兩個屏幕在嘗試“ Neumorphism,” or soft UI. Little did I know that this post…

php內核探索

引自:http://www.nowamagic.net/librarys/veda/detail/1285 SAPI:Server Application Programming Interface 服務器端應用編程端口。研究過PHP架構的同學應該知道這個東東的重要性,它提供了一個接口,使得PHP可以和其他應用進行交互數據。 本…

hp-ux鎖定用戶密碼_UX設計101:用戶研究-入門需要了解的一切

hp-ux鎖定用戶密碼這是什么? (What is this?) This session is part of a learning curriculum that I designed to incrementally skill up and empower a team of Designers and Researchers whose skillset and ways of working needed to evolve to keep up wi…

等比數列前N項和的公式推導

設等比數列的前n項和為S(n), 等比數列的第一項為a1,比值為q。 (1)S(n) a1 a1 * q a1 * q ^ 2 .... a1 * q ^ (n - 1);(2)S(n1) a1 a1 * q a1 * q ^ 2 .... a1 * q ^ (n - 1) a1 * q ^ n;由(2&am…

extjs6 引入ux_關于UX以及如何擺脫UX的6種常見誤解

extjs6 引入uxDo you ever browse social media, internet, or talk to colleagues and hear them say something UX related you disagree with so much that you just want to lecture them on the spot?您是否曾經瀏覽過社交媒體,互聯網或與同事交談&#xff0c…

Cocos2D-HTML5開源2D游戲引擎

http://www.programmer.com.cn/12198/ Cocos2D-HTML5是基于HTML5規范集的Cocos2D引擎的分支,于2012年5月發布。Cocos2D-HTML5的作者林順將在本文中介紹Cocos2D-HTML5的框架、API、跨平臺能力以及強大的性能。Cocos2D-HTML5是Cocos2D系列引擎隨著互聯網技術演進而產生…

illustrator下載_Illustrator筆工具練習

illustrator下載Adobe Illustrator is a fantastic vector creation tool and you can create a lot of things without ever using the Pen Tool. However, if you want to use Illustrator at its full potential, I personally believe that you need to master and become …

怎么更好練習數位板_如何設計更好的儀表板

怎么更好練習數位板重點 (Top highlight)Dashboard noun \?dash-?b?rd\ A screen on the front of a usually horse-drawn vehicle to intercept water, mud, or snow.儀表盤 名詞\ ?dash-?b?rd \\通常在馬拉的車輛前部的屏幕,用來攔截水,泥或雪。…

學習正則表達式

deerchao的blog Be and aware of who you are. 正則表達式30分鐘入門教程 來園子之前寫的一篇正則表達式教程,部分翻譯自codeproject的The 30 Minute Regex Tutorial。 由于評論里有過長的URL,所以本頁排版比較混亂,推薦你到原處查看,看完了如果有問題,再到這里來提…