Программирование в режиме ядра с использованием упрощенного c ++? - PullRequest
11 голосов
/ 06 декабря 2011

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

Ответы [ 4 ]

18 голосов
/ 06 декабря 2011

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

  • вы ДОЛЖНЫ определить операторы new и delete для сопоставления с ExAllocatePoolWithTag и ExFreePool.

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

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

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

4 голосов
/ 13 сентября 2012

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

Инсайдер NT: Гостевая статья: C ++ в драйвере NT

Инсайдер NT: Глобальная помощь - C ++ RuntimeПоддержка NT DDK

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

3 голосов
/ 15 февраля 2012

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

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

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

3 голосов
/ 06 декабря 2011

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

...