Microsoft выпустила на Github код, который позволяет разработчикам писать драйверы Windows на Rust, что является ключевым шагом на пути к обеспечению безопасного программирования для операционной системы. Технический директор Azure Марк Руссинович разместил ссылку на X с комментарием: «Усердно работаем над разработкой драйверов Windows на Rust».
Эта работа насчитывает много лет. В июле 2019 года Microsoft Research сообщила, что хочет «устранить целый класс уязвимостей до того, как они возникнут», высказалась за безопасный для памяти язык и заявила, что «одним из наиболее многообещающих новых языков системного программирования, отвечающих этим требованиям, является язык программирования Rust, первоначально изобретенный Mozilla».
Компания продвигает Rust не только из-за безопасности памяти, но и из-за безопасности гонок данных, гарантируя, что «два или более потоков не смогут получить асинхронный доступ к участку памяти».
В 2022 году Руссинович объявил: «Пришло время прекратить любые новые проекты на C/C++ и использовать Rust, когда вам нужно использовать язык, не относящийся к GC. В целях безопасности и надежности индустрия должна объявить эти языки устаревшими». GC или языки со сборкой мусора, такие как C# и Java, подходят для коммерческих приложений, но не для базового системного кода.
Хотя Windows в основном написана на C и C++. «По различным техническим и историческим причинам большая часть кода пользовательского режима теперь написана на C++, но большая часть кода ядра по-прежнему написана на языке C». В 2018 году Рэймонд Чен, инженер-программист Microsoft, долгое время занимающийся разработкой программного обеспечения, заявил, что хотя с тех пор и появилась Windows 11, операционная система не переписывалась при разработке новых версий. Набор инструментов для драйверов Windows, используемый производителями оборудования для работы своих устройств в Windows, по-прежнему остается набором инструментов C/C++.
Согласно примечаниям к выпуску нового набора драйверов на основе Rust, он предназначен для поддержки драйверов WDM (модель драйвера Windows) и WDF (фреймворк драйверов Windows). Драйверы WDM относятся к более низкому уровню и тесно привязаны к операционной системе, тогда как драйверы WDF взаимодействуют с системой через библиотеки платформы. Исходный репозиторий ориентирован на WDK.
В описании добавлено: «Проект все еще находится на ранней стадии разработки и пока не рекомендуется для коммерческого использования. Microsoft поощряет эксперименты и отзывы, отмечая, что разработчики могут искать отзывы на дискуссионном форуме GitHub в репозитории».
Первым вопросом является то, как обрабатывать исключения. Один разработчик сказал: «Структурированная обработка исключений является неотъемлемой частью разработки Windows для ядра Windows (и операционной системы в целом) и является реальным препятствием на пути реализации Rust для разработки ядра Windows. В Rust нет исключений, он предпочитает использовать результирующие переменные для сообщения об устранимых ошибках, а в случае неисправимых ошибок он завершает работу с аварийным сбоем. В коде ядра такой сбой нежелателен, поскольку он приведет к сбою системы в целом».
Разработчик Джонни Шоу цитирует LinuxTorvalds в ядре Linux (которое также использует Rust): «Поскольку код ядра отличается от случайных системных инструментов пользовательского пространства. Исчерпание памяти не должно вызывать прерывание работы. Оно должно вызывать только возврат ошибки». Торвальдс считает это «фундаментальной проблемой».
Ранний код в новом репозитории Microsoft включает следующие комментарии:
//FIXME:Должна ли эта функция запускать проверку ошибок черезKeBugCheckEx?
Эта проблема показывает, что внедрение Rust в базовый код Windows не так просто, как добавление привязок языка Rust к WDKAPI. Однако первоначальная реакция в целом была положительной. Проблемы безопасности памяти составляют большую часть проблем безопасности и стабильности Windows, поэтому внедрение Rust является жизнеспособным решением.