簡體   English   中英

c++ linux設備驅動開發

[英]c++ device driver development in linux

我想獲得更多關於使用 c++ for Linux box 編寫圖形設備驅動程序和音頻設備驅動程序的詳細信息。 我是開發設備驅動程序的新手,請提供相同的開發/文檔詳細信息。

謝謝

-普拉文

遲到了這個頁面,問題本身已由 Chris Stratton 回答,但重要的是要糾正 Chris Becke 放在這里的一些事情,這些事情對於不熟悉 C++ 的人來說是常見的誤解:

  • C++ 不會創建隱式代碼或數據,只是根據您的要求創建。 即使對於普通的 C++ 程序員,也不會有額外的代碼或數據。 我通過了解 C++ 背后的 asm 發現了這一點,但只要閱讀 Scott Meyers 的書籍就足夠了。
  • 異常不僅在 C++ 中是可選的,而且它們的整個代碼都可以在鏈接中排除在大多數工具的鏈接中。 這實際上是在 RT 應用程序中完成的。

這是為了解決此處發布的誤解。 但是,要添加更多:

1) 新手 C++ 程序員可能會胡說八道,但是新手 C 程序員試圖在內核中一次又一次地實現多態性和繼承,只是不這么稱呼它,會做更多低效的不可調試的廢話。

2) 話雖如此,在基本 C++ 中唯一可以創建的東西是一個虛擬指針,如果你需要它並指定“虛擬”,然后 C 程序員通常也只是創建這樣一個指針,自己操作它添加查找表並獲得很多由於它,更難的錯誤。 與 C++ 中的往常一樣,如果您不提及“虛擬”,那么您甚至都不會得到這個指針。 繼承和封裝當然完全沒有開銷。

3) 如果您不明確請求特殊功能,C++ 會創建與 C 相同數量的 asm 和內存,但通常情況下 C++ 更高效- 傳遞函數指針時。 如果您使用 C++ 的仿函數,您可以內聯指向的函數。 這在嵌入式應用程序中非常有用。

4) 如果嵌入式 RT 使用 C++,為什么 linux 不使用? 只是因為神話,所以請仔細閱讀此消息,並參考 scott meyers 或更好的是 asm 本身。 我在 RT 工作了 20 年,並且在 14 年前切換時對 C++ 有同樣的懷疑,但事實並不能證實任何這種不信任。

TL;DR - 在 C++ 中編寫高效且在常見情況下更高效的代碼非常容易,關於這個主題的研究、大量行業經驗和書籍比比皆是。

Linux 內核設備驅動程序是用 C 而不是 C++ 編寫的。

大多數設備驅動程序是通過一個特殊的設備文件 (/dev/yourdevice0) 訪問的,在該文件上可以執行控制以及讀寫操作。

用戶模式客戶端程序和用戶模式驅動程序打開設備文件並將其用作與內核模式驅動程序對話的途徑。 可以想象,這些用戶模式驅動程序可以用 C++ 或任何其他語言編寫。

通常,最好的入門方法是擁有一個需要驅動程序的設備,並了解編寫它所需的內容。 通常最好的方法是為相關設備或具有類似接口范例的設備找到現有的驅動程序,然后從修改它開始,直到它適用於您的新設備或同樣適用。

由於內核中沒有 C++ 運行時,因此您很快就會遇到問題。 我想你可以讓 C++ 運行時在內核中運行,但這需要一些非常好的技能。 比用 C 編寫驅動程序要高得多。

此外,您會立即被 Linux 內核開發人員放下。 我的意思是真的放下了。 他們會把你燒得很厲害,你永遠無法從中恢復過來。 您可能會說“Screw Linux and their elitist bastards”。

我不想聽起來消極,但與你從其他人那里聽到的相比,我是一個溫和而合適的聲音。

Linux 驅動是用 C 開發的。如果你想了解更多關於 Linux 驅動開發的知識,你應該閱讀這本免費的電子書:http: //lwn.net/Kernel/LDD3/
所有 pdf 章節的 tarball 也可用:http: //lwn.net/images/pdf/LDD3/ldd3_pdf.tar.bz2

C,而不是 C++ 是編寫(內核模式)設備驅動程序的語言,最終原因很簡單:C++ 是一種不適合用於編寫驅動程序軟件的語言。 這樣做的副作用是,內核模式下沒有可用的 c++ 運行時。

至於為什么c++不合適:至少有兩個原因:

  • 所有操作系統上的設備驅動程序都需要嚴格的代碼放置——一些代碼需要位於不可分頁的塊中,並且不可分頁的內存是有限的資源。 c++ 生成大量隱式代碼,隱式它不可能 (a) 審計和 (b) 用必要的指令括起來以保證放置。
  • 異常在 C++ 中已成為非可選。 c++ 異常通常是根據 CPU 異常來實現的,並且很多驅動程序代碼在 (cpu) 異常不能容忍的級別上執行(因此需要不可分頁的代碼塊)。

我認為我忘記了其他一些方面,但是,ideomatic c++ 違反了對驅動程序的許多限制。 這就是為什么首選 C 的原因。

這是一篇舊帖子,但我決定寫一個答案,因為沒有答案解釋如何做到這一點而不會適得其反。

簡短的回答:

答案是“是的,你可以”……付出巨大的努力 讓我們忽略 Linus Trovald 對 C++ 的看法

長答案:

我的建議是在你真正需要的時候用 C++ 編寫它。 在內核中運行 C++ 的方式有很多陷阱。

我最近研究了這個主題,這是我的總結:

  • 沒有實現newdelete

    這是最容易克服的事情。

  • 內核上的堆棧大小小於 8 kb(對於 32 位)和 16 kb(對於 64 位)。

    哎呀......不讓堆棧溢出將是具有挑戰性的。

  • 不允許跟隨

  • 讓 C++ 讀取內核頭文件是 PIA。 如果您喜歡挑戰,請在出發前至少閱讀Linux 內核中的 C++ 不要忘記每次將舊代碼升級到新內核時都必須這樣做。

如果您想了解更深入的知識,請查看以下文章。

korisk 在github中也有一個用於准系統內核模塊的演示 repo。

結論

再次,我真誠的意見,在你去之前評估在內核模塊中運行 C++ 的努力。

第三次,最好在你去之前評估在內核模塊中運行 C++ 的努力!

不幸的是,當前的 Linux 頭文件在 C++ 中不可編譯,因為它們使用new作為變量名、聲明falsetrue並且還有一些其他問題。

您可以在 Linux 模塊中使用 C++,但如果不包含 Linux 頭文件,它就毫無用處。 所以你不能遠離最簡單的 hello-world 模塊。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM