2014年8月5日 星期二

sysfs裡的裝置和驅動

    離職後時間變得真多,整天游手好閒也不是辦法,剛好離職前有稍微碰到linux driver的部份,而且之後要找的工作也會是相關的性質,那就來研究一下吧!
    雖然自己的電腦就是用Fedora的作業系統,kernel也不算陌生,時間久了很多事情是會忘記的,而且kernel日新月異,變化之快,以前看過的現在可能又完全不一樣了!為了減輕我這個腦容量不高的人的負擔,用網誌當作紀錄似乎是個好方法。
    好吧!既然要認識linux的裝置和驅動,首先還是要先知道他們會出現在哪裡,答案就是/sys這個目錄裡面了,這個目錄其實還滿複雜的,大概的架構就像下圖,不過我省略了很多東西,沒關係,慢慢來吧!
  

    這張圖的所有方塊都是一個目錄, dev目錄下分為字元裝置和區塊裝置,這兩類的裝置都有自己的裝置編號,而且能夠以一個檔案的方式出現在/dev的目錄下,如此一來可以用對待一般檔案的方式對待他們(其實在linux的世界裡,幾乎大部分的動作都是在存取檔案,例如網路系統的socket),也就是說可以用open,read,write這些方式來開啟和讀寫。
    另外bus目錄下就算是linux裝置和驅動的主要架構,bus_type就是一般所知的PCI,USB,SCSI...這些匯流排,devices和drivers就是依附在這些bus下的裝置和驅動,那如果都不屬於這些bus的會放在哪?他們就會依附在linux的虛擬bus(platform_bus)下。
    除此之外,/sys裡面還有很多其他的目錄,例如devices目錄裡面放置了所有的裝置...等等。大部分這些目錄裡面會有一些檔案,又可以稱為屬性(driver code裡面是這樣宣告的),例如dev屬性紀錄了或區塊裝置的主要編號和次要標號,uevent屬性紀錄了當hotplug時需要傳給udev的一些資訊(有關hotplug的部份如果以後有時間在寫吧),當然我們也可以自己建立需要的屬性,可以透過這些屬性獲取資訊或設定裝置。
    如果想要了解的更仔細,直接打開/sys目錄會是一個好的開始,之後如果有機會遇到相關的情形也會順便拿出來看看。看完一些簡單的架構後,那就來實作一個簡單的字元裝置吧,透過這個裝置可以大致窺探一些細部的架構,以及了解他提供了哪些方法讓user space可以把他們當成一般的檔案對待。

沒有留言:

張貼留言