linux設備模型,如何實現/dev/xxx/xxx?

linux input設備模型會在dev下創建input directory,然後才在dev/input下面創建設備節點,那麼請問一下input這個folder是通過什麼方式創建的?

ls -l dev

drwxr-xr-x root root 2010-01-01 00:00 input

ls -l dev/input

crw-rw---- root input 13, 64 2010-01-01 00:00 event0

crw-rw---- root input 13, 65 2010-01-01 00:00 event1

crw-rw---- root input 13, 74 2010-01-01 00:00 event10

crw-rw---- root input 13, 75 2010-01-01 00:00 event11

crw-rw---- root input 13, 76 2010-01-01 00:00 event12

crw-rw---- root input 13, 77 2010-01-01 00:00 event13

crw-rw---- root input 13, 78 2010-01-01 00:00 event14

crw-rw---- root input 13, 79 2010-01-01 00:00 event15

crw-rw---- root input 13, 80 2010-01-01 00:00 event16

然而我的問題是:我要自己實現一個類似dev/input/xxx這種設備模型,我是用如下的方式創建創建一個class,申請一個char主設備號MAJOR

然後如果創建設備,那麼調用如下code,會創建主設備號為MAJOR,此設備號為0-255的一類設備,但是我使用這種方式,創建出的設備全部是dev/xxx,而不是dev/xxx/xxx


關於設備模型,看這裡:linux內核中,對於字元設備/塊設備/匯流排/設備/驅動等概念,如何正確理解? - in nek 的回答

整個/dev目錄的內容,都和內核沒有關係,你在任何地方都可以通過mkdir創建目錄,然後在裡面用mknod創建設備節點。

這個目錄,在不少嵌入式系統中是手工創建的,但在大型系統中(比如一般的發行版),基本上都是用udev來創建的,udev通過uevent系統來提供服務,uevent通過kobject子系統提供功能。

內核中,很多對外的資源,都會創建kobject對象,這種對象會通過/sys文件系統暴露到用戶態,其中一個關鍵的功能是這些對象發生變化(比如創建或者刪除)的時候,一個時間會發送到uevent隊列中,uevent隊列可以通過sysfs來訪問,也可以全局性地通過netlink來接收。udev進程就是等待在這個通道上,發現有新的對象建立了,然後看看是否是新設備在內核中創建,如果是,就通過mknod為這個設備在/dev目錄下創建一個節點,udev按什麼convension創建節點,你就要自己研究udev的資料了。

回到你的問題,如果你要創建一個input設備,你應該去看看devm_input_allocate_device()這個函數怎麼用的,直接註冊一個字元設備,並不能完成所有輸入設備需要完成的註冊。


udev rules.


/dev目錄下的設備節點不是由內核創建出來的,常見的創建方式有以下幾種:

  • init.rc中配置要創建的設備節點,init啟動時進行創建。如:android的init.rc
  • 將設備節點文件打包到根文件系統中,嵌入式linux比較常見的做法。只能創建主設備號已知的節點,如tty、sda等。
  • udevd(android是vold)根據內核驅動產生的uevent進行創建。sysfs目錄的文件變化時,會產生uevent,uevent中會包含設備主次設備號、變化類型、子系統等信息,udevd根據這些信息生成/刪除設備節點。

  • 使用命令mknod進行創建。動態申請主設備號的情況下,可先通過/proc/device查詢分配的主設備號。

在本問題中,device_create函數是用來在sysfs中創建文件的,因此雖然在函數sensor_attr_devnode中指定了設備文件名"sensor/%s",但是只會影響到sysfs,而不會對/dev目錄產生影響。你需要查看系統中的udevd(android是vold)的實現方式,通過修改其實現或者配置文件來達到你想要的結果。


你算是找對人了

菜鳥飛了這麼久,可以露臉露臉了

看了上面的回答,不能算錯,但是都沒有回答到點子上。

答主想實現那樣的設備文件,有個非常粗暴簡單的方法,就是調用設置設備名API的時候,採用形如"myclass/dev1"來配置,即可生成設備文件"/dev/myclass/dev1"。

這裡引出了最新內核採用的設備模型基礎。當前4.x內核,只要是通過device_add等API來創建設備,只要該device包含dev_t屬性(即含設備號),則會調用devtmpfs來創建設備文件:"/dev/myclass/dev1"。

手機碼字太麻煩!


推薦閱讀:

OS boot 的時候為什麼要 enable A20?
計算機行業領先的公司大多在美國,Linux為什麼卻是芬蘭人發明的?
為何 Linux 的系統 API 相比 Win32 到處是縮寫?有何優劣? 造成兩者差別的原因是什麼?
「系統程序員」的技能棧有哪些?
文件系統設計中的 Sectorsize有什麼用?

TAG:Linux | ArchLinux | Linux開發 | Linux內核 | Linux入門 |