2015-03-31 36 views
1

我是開發Linux驅動程序的新手。如何使用linux設備模型和/ sys文件系統?

傳統,如果我想創建字符設備,我只需要實現readwriteioctl功能,並通過register_chrdev_region相應Major device ID註冊。然後使用mknod創建該設備文件Major device ID。然後在用戶空間中調用readwriteopen然後通過內核調用相應的函數。

但是現在我正在學習Linux device modelsys filesystem,它在內核2.6中加入。如果可能的話,我告訴,不要使用/dev filesystem,因爲現在的Linux具有良好的設備型號處理設備和driver.This搞糊塗了,所以我會總結一下我的困惑到一些問題:

  1. 怎麼辦我在/ sys中創建一個char設備?更具體地說,我如何創建一個空設備,就像/dev/null一樣?
  2. 如何從用戶空間調用我的char設備驅動函數?
  3. 我聽說udev是基於sys filesystem/dev中創建設備文件。爲什麼?由於我被告知「如果可能,請勿使用/dev filesystem」,爲什麼udev使用/sys/dev中創建文件?
  4. sys中的文件是否有任何概念如char device fileblock device
  5. /devopenwrite從用戶空間將最終映射到由我定義的file operation structure功能,那麼哪些功能會被當我打開或寫入文件/ssy叫什麼名字?

回答

4

沒有內文您的關於/dev的聲明尚不清楚。無論如何:

  1. 你不能在sysfs上創建char設備。 sysfs的主要目的是導出信息並允許用戶調整單個值(例如,在/sys/下導航以獲得一些示例)。字符設備通常會做很複雜的事情。 (2),寫(2),ioctl(2)(看看你的驅動程序的開放,讀,寫,ioctl,...以及如何打開,讀,寫,ioctl,...)這些命令的手冊頁)

  2. 當設備出現時,內核在/ sys下創建一個目錄。例如,看看ls /sys/bus/usb/devices/。所有這些目錄都是在USB設備出現時創建的。您可以嘗試插拔USB設備。 udev關注sysfs以檢測新設備,並根據sysfs的信息在/dev下創建設備。當駕駛員以某種方式撥打device_add()時,會發生這種情況。這些功能通常由其他寄存器功能調用,例如:device_createdevice_register或來自其他子系統的其他功能。

  3. sysfs的思想是提供有關設備和驅動程序加載的信息。所以你可以更改設備,總線和驅動程序選項。或者手動將設備附加到模塊

  4. 實際上,在sysfs屬性後面有一組file_operation,其中open,read和write由內核管理,而不是由驅動程序管理。爲了創建一個sysfs屬性,你必須提供一對功能顯示存儲來讀/寫驅動程序的東西。然後內核將請求路由到您的正確屬性

+0

你提到的第三項是我所關心的。你是什​​麼意思「設備出現時」?在我調用'register_chrdev_region''cdev_init'和'cdev_add'後,我可以從'cat/proc/devices'獲得信息,但似乎'/ sys'中沒有任何事情發生。我無法在'/ sys/dev/char'中找到我的設備的任何信息。 – demonguy 2015-04-01 09:21:39

+0

我在第3點改進了我的答案。無論如何,當您執行'device_create()'時,如果您不這樣做,請執行此操作:)以下是一個來自網絡的隨機示例http://www.opensourceforu.com/2011/04/character-device-files-creation-operations/ – Federico 2015-04-01 13:06:39

+0

謝謝,這正是我想要的! – demonguy 2015-04-02 03:32:52

0

免費提供的書Linux Device Drivers詳細解釋它。

+0

我正在閱讀那本書! – demonguy 2015-03-31 14:54:43

+0

@demonguy繼續閱讀! – 2015-03-31 15:05:24

+0

但我無法理解。在/ dev中,來自用戶空間的所有調用最終將調用file_operation結構中的函數。但在/ sys中,似乎有數千種從用戶空間到內核空間的映射。我無法理解作者是如何設計它的。其實我不想只記住那些東西,我只想知道爲什麼 – demonguy 2015-03-31 15:09:56

相關問題