Подтвердить что ты не робот

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

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

4b9b3361

Ответ 1

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

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

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

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

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

Ответ 2

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

NT Insider: Guest Article: С++ в драйвере NT

NT Insider: Глобальная помощь - С++ Runtime Поддержка NT DDK

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

Ответ 3

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

Ответ 4

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

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

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