2016-11-10 113 views
8

我正在寫驅動程序來控制一些自定義硬件。Linux驅動程序:ioctl或sysfs?

在過去的日子裏(即15年前),我用ioctls來做這件事,但現在我正在挖掘sysfs作爲一種可能的選擇。

  • 據我所知,讀寫控制不完全棄用,但sysfs中優選(?)
  • 我需要通過一個sysfs的條目讀/寫集同時即值。我讀過這樣的說法並不理想,但可以接受(?)
  • 驅動程序需要'mutex'保護,以便一次只能有一個應用程序寫入。 (我確實有一些只讀的'info'條目,我希望隨時都可以訪問這些條目)。

鑑於上述情況,最佳的處理方式是什麼 - ioctl或sysfs?

如果是sysfs,那我該如何實現獨佔訪問?

如果是sysfs,那麼如果驅動程序沒有讀/寫/ ioctl fops,它是否需要打開/釋放?

(這是一個「私人」的驅動程序,所以我不關心大規模;)!,但想通如果新方法更適用話,我還不如去抓住他們)

感謝。

回答

8

我會盡力至少部分回答你的問題。歡迎發表評論我要問我擴大(或縮小!)

  • 首先,這幾天讀寫控制不再被視爲過時了,因爲人們還沒有找到他們所解決的問題更好的解決方案。儘管如此,人們希望更有紀律的定義ioctl接口,並且如果可能的話真實地表達他們將讀寫ioctl數字編碼的內容。 ioctls和sysfs有不同的優勢。
  • sysfs主要用於將設備的特定屬性暴露給用戶空間,特別是向控制檯或shell腳本上的用戶顯示,並讓這些屬性或設備配置發生變化。單個sysfs文件通常映射到單個屬性,並且通常可讀(和/或可寫)爲簡單的文本字符串。例如,它可能會暴露設備的當前電源管理狀態(例如「關閉」),並讓您使用「cat」shell命令編寫新的電源管理狀態。
  • sysfs確實沒有綁定到一個打開/釋放會話(你不應該實現這些來使用它),所以它可能只適合全局屬性。如果用戶只希望一次在設備上執行單一操作,但不會執行問題(因此可能不太適合您的「同時使用的數據集」,除非您將它們全部編碼爲一弦)。是的,你想要保護你的任何驅動程序數據,你將從你的sysfs處理程序使用互斥體訪問,可能每個邏輯數據集有一個互斥量(或多個邏輯集)。
  • ioctl更適合在用戶空間和驅動程序之間傳遞二進制信息,並且需要C程序或類似的程序才能使用它。自定義ioctls非常適合在內核中編寫最小驅動程序,並將邏輯放入匹配的用戶空間程序中。與sysfs不同,它不需要額外的邏輯來解釋文本字符串 - 它可以直接從用戶進程內存中讀取和寫入數據 - 這意味着不需要的代碼,但也有更多的機會不徹底檢查數據。
+0

感謝您的意見邁克爾。我認爲你對這種權衡的看法與我的感覺相符, – ColH

+0

也許你可以「接受」答案,那麼如果這對你來說似乎是合理的?謝謝。 – michaeljt