2011-12-05 24 views
11

我即將鑽入內核土地。我的問題涉及編程語言。我看過大多數教程都是用C編寫的。我目前使用C++和Assembly進行編程。我在C++之前也學過C,但我沒有太多用處。是否有可能使用簡單的C++在內核模式下編程而不使用任何高級構造?基本上我試圖避免兩種語言之間存在的細微差別(例如C中沒有bool,沒有自動從main返回0,實際上有細微差別)。我不會使用模板,類和類似的東西。那麼,在沒有任何主要煩惱的情況下,可以使用簡單的C++在內核模式下進行編程?使用簡單的C++進行內核模式編程?

+0

你的意思是Windows內核開發或其他操作系統開發? –

+0

Windows內核開發,對不起 – devjeetroy

+0

如果您同意C是簡單化的C++ ... – sehe

回答

16

即使沒有官方支持,也可以使用C++作爲Windows內核開發的開發語言。 你應該知道下面的事情:

  • 必須定義new和delete運算符來映射到ExAllocatePoolWithTag函數ExFreePool。

  • 儘量避免虛擬功能。似乎無法控制對象的vtable的位置,如果它處於可分頁部分並且您的代碼是使用IRQL> = DISPATCH_LEVEL調用的,則可能會產生意想不到的結果。

  • 如果在IRQL> = DISPATCH_LEVEL上使用它之前仍然需要使用虛擬方法表而不是鎖定.rdata段。

除了這些限制,您可以使用C++進行驅動程序開發。

+0

爲vtable gotcha +1。我正要提到同樣的事情。 –

+0

謝謝!所以我看到有一些併發症。你會主張使用C還是使用C++?我有點困惑於此。 – devjeetroy

+1

使用C++作爲更好的C將會正常工作。編譯器生成代碼時會出現複雜情況 - 包括模板,vtable和默認構造函數以及標量刪除存根等。您無法控制C++編譯器決定將哪些部分放到您的可執行文件中,這意味着當需要它們的代碼不可以時,它們可以是可分頁的。這可能會導致一些嚴重的問題。如果你小心,你可以避免這一點。 – Stewart

2

如果你仔細編寫你的代碼,知道每個定義,運算符,調用等背後究竟是什麼,那麼在C++中編寫內核代碼應該沒有問題。上面評論中提到的Microsoft文檔是一個很好的解讀,因爲它描述了C++不像C那樣透明或者沒有提供類似重要保證的情況,並且你知道該怎麼避免。

2

Microsoft已編寫guide。基本上他們告訴我們除了使用C++放鬆的變量聲明規則之外,什麼都不要幹。別的,你自己。無論如何,它不可能是那麼糟糕,但這裏有一些你需要記住的例子:

  • 在分頁池中分配的內存可以分頁。如果你在IRQL高於PASSIVE_LEVEL時試圖訪問它,那麼你就會被搞砸了(或者至少當你的客戶抱怨你的驅動程序阻止他們的系統時,你會每隔一段時間)!在負載下的低內存系統上測試您的驅動程序!
  • 非分頁池是有限的,你很可能無法從中分配所有的需求。
  • 堆棧比用戶模式下小得多〜12-24K。你涉及內核浮點路徑
  • 事情,都必須通過KeSaveFloatingPointStateKeRestoreFloatingPointState
  • C++異常的保護:沒有

閱讀指南,瞭解更多。現在,如果您可以確保生成的代碼遵循規則,請繼續並使用C++。

+1

本指南有些過時。最大NonPaged池是物理RAM的一半,那麼多少內存會將所有代碼標記爲不可分頁消耗?其他的觀點是正確的。 – Christopher