Программирование режима ядра с использованием упрощенного 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++.