Программирование режима ядра с использованием упрощенного c++?

Я собираюсь углубиться в землю ядра. Мой вопрос касается языка программирования. Я видел большинство учебников, которые будут написаны на C. I в настоящее время программа на C++ и сборка. Я также изучал C до C++, но я не использовал его много. Можно ли программировать в режиме ядра с помощью упрощенного C++без использования каких-либо продвинутых конструкций? В основном я пытаюсь избежать незначительных различий, которые существуют между двумя языками(как нет bool в C, отсутствие автоматического возвращения 0 от main, очень незначительные различия). Я не буду использовать шаблоны, классы и тому подобное. Так можно ли программа в режиме ядра, используя упрощенный C++ без каких-либо серьезных неприятностей?

4 ответов


даже если официально не поддерживается, вы можете использовать C++ как язык для разработки ядра Windows. Вы должны знать о следующих вещах:

  • необходимо определить оператор new и delete для сопоставления с ExAllocatePoolWithTag и ExFreePool.

  • старайтесь избегать виртуальных функций. Кажется невозможным контролировать местоположение vtable объекта, и это может иметь неожиданные результаты, если он находится в подкачиваемой части и вы вызываете код с помощью IRQL >= DISPATCH_LEVEL.

  • Если вам все еще нужно использовать таблицу виртуальных методов, чем блокировка .сегмент rdata перед его использованием на IRQL >= DISPATCH_LEVEL.

помимо этих ограничений, вы можете использовать C++ для разработки драйверов.


добавьте две ссылки, если вы хотите сделать C++ в WDK. Это одноразовая настройка.

The NT Insider: гостевая статья: C++ в драйвере NT

The NT Insider: Global Relief Effort - поддержка среды выполнения C++ для NT DDK

видели, что коды ядра используют много автоматических блокировок / смарт-указателей; хотя они делают код аккуратным, я чувствую, что у него есть кривая обучения для новичка, чтобы полностью понять, и если злоупотреблять, много кодов построения / уничтожения притормози.


Если вы пишете свой код тщательно, зная, что именно стоит за каждым определением, оператором, вызовом и т. д., Тогда не должно быть проблем с написанием кода ядра на C++. Документ Microsoft, упомянутый в комментариях выше, является хорошим чтением именно потому, что он описывает ситуации, в которых C++ не так прозрачен, как C, или не предоставляет подобных важных гарантий, и из этого вы знаете, чего следует избегать.


Microsoft написала руководство. В основном они говорят нам держаться подальше от всего, кроме использования расслабленных правил объявлений переменных c++...вздох. Что-нибудь еще, и ты сам по себе. В любом случае это не может быть так плохо, но вот несколько примеров того, что вам нужно помнить:

  • память, выделенная в выгружаемом пуле, может быть выгружена. Если вы попытаетесь получить к нему доступ, когда IRQL выше PASSIVE_LEVEL вы ввернуты (или, по крайней мере, вы будете каждый раз в в то время как ваш клиент жалуется на ваш драйвер BSODding их системы)! Проверьте свой драйвер на низкой системе памяти под нагрузкой!
  • невыгружаемый пул ограничен, вы, скорее всего, не можете выделить из него все свои потребности.
  • стек намного меньше, чем в пользовательском режиме ~12-24K.
  • все, что вы делаете, включая путь с плавающей запятой в ядре, должно быть защищено KeSaveFloatingPointState и KeRestoreFloatingPointState
  • исключения C++ : нет

Подробнее читайте в руководстве. Теперь, если вы можете убедиться, что сгенерированный код следует правилам, продолжайте использовать C++.