Я собираюсь вникать в землю ядра. Мой вопрос связан с языком программирования. Я видел большинство учебников, которые должны быть написаны на C. В настоящее время я программирую на С++ и Assembly. Я также изучал C до С++, но я не использовал его много. Можно ли запрограммировать в режиме ядра с помощью упрощенного С++ без использования каких-либо продвинутых конструкций? В основном я стараюсь избегать незначительных различий, существующих между двумя языками (например, no bool
в C, без автоматического возврата 0 из main
, на самом деле незначительные различия). Я не буду использовать шаблоны, классы и т.п. Так можно ли программировать в режиме ядра с использованием упрощенного С++ без каких-либо серьезных неприятностей?
Программирование режима ядра с использованием упрощенного С++?
Ответ 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
- Исключения С++: Нет
Прочтите руководство для получения дополнительной информации. Теперь, если вы можете убедиться, что сгенерированный код соответствует правилам, используйте С++.