Можно ли написать драйверы Windows на Python?

Можно ли написать драйверы Windows на Python?


person Armageddon    schedule 11.06.2009    source источник
comment
всем спасибо за хорошие ответы :)   -  person Armageddon    schedule 11.06.2009


Ответы (7)


да. Вы не можете создать «классические» драйверы режима ядра. Однако, начиная с XP, Windows предлагает платформу драйверов пользовательского режима. Очевидно, они не могут делать все - любой драйвер, используемый для загрузки ОС, очевидно, должен работать в режиме ядра. Но с UMDF вам нужно только реализовать компоненты COM.

Помимо драйверов времени загрузки, вы также не можете написать драйверы UMDF, которые:

  • Обработка прерываний
  • Прямой доступ к оборудованию, например, прямой доступ к памяти (DMA)
  • иметь строгие временные петли
  • Используйте невыгружаемый пул или другие ресурсы, зарезервированные для режима ядра.
person MSalters    schedule 11.06.2009
comment
Я разработчик драйверов для Linux в своей компании, и теперь мы изучаем Python, чтобы сделать нашу платформу драйверов независимой. Предложено высшим руководством и делает это в наши дни. - person sandun dhammika; 01.08.2016
comment
@sandundhammika: Этого не случится, говоря простым языком. Драйверы не зависят от платформы, потому что ядро ​​диктует, что они должны делать, а разные платформы имеют совершенно разные ожидания. Таким образом, Windows ожидает, что драйверы UMDF будут взаимодействовать через COM, тогда как Linux даже не имеет COM. - person MSalters; 01.08.2016
comment
@MSalters Изначально проблема заключалась в распространении одного и того же бинарного драйвера для разных дистрибутивов. Сейчас мы поставляем нашу собственную двоичную версию C ++, но имена их библиотек зависят от платформы, поэтому даже тот же ABI ломается по именам библиотек. - person sandun dhammika; 01.08.2016
comment
@sandundhammika: Похоже, лучшим решением был бы установщик драйвера, написанный на Python, а сам драйвер все еще на C ++. Этого может быть достаточно, чтобы отметить желание вашего менеджера. - person MSalters; 01.08.2016

Окончательный ответ не обойдется без встраивания интерпретатора в ваш драйвер C / assembly. Если у кого-то нет доступной структуры, ответ - нет. Когда у вас есть интерпретатор и привязки, остальная логика может быть выполнена на Python.

Однако написание драйверов - одна из тех вещей, для которых C лучше всего подходит. Я предполагаю, что полученный код Python будет очень похож на код C и лишит смысла накладные расходы интерпретатора.

person Judge Maygarden    schedule 11.06.2009

Хороший способ понять, почему это практически невозможно, - это прочитать совет Microsoft об использовании C ++ в драйверах. Как производное от C, использование C ++ кажется простым. На практике все не так.

Например, вы должны решить для каждой функции (и действительно для каждой инструкции сборки), находится ли она в выгружаемой или невыгружаемой памяти. Это требует расширений для C, осторожного использования новых функций C ++ или, в данном случае, специального расширения для языка Python и виртуальной машины. Кроме того, вашей виртуальной машине, совместимой с драйверами, также придется иметь дело с различными IRQL - существует иерархия «уровней», которая ограничивает то, что вы можете и что не можете делать.

person MSalters    schedule 11.06.2009

Python работает на виртуальной машине, поэтому нет.

НО:

Вы можете написать компилятор, который переводит код Python на машинный язык. Как только вы это сделаете, вы сможете это сделать.

person Mark Lutton    schedule 11.06.2009
comment
или вы можете встроить интерпретатор Python в драйвер. Или уговорите Microsoft включить интерпретатор Python в ядро. Технически нет причин, по которым это нельзя было бы сделать. Windows просто в настоящее время не предлагает вам большой поддержки для этого. ;) - person jalf; 11.06.2009

Я не знаю ограничений для драйверов в Windows (схемы распределения памяти, динамическая загрузка библиотек и все такое), но вы можете встроить интерпретатор Python в свой драйвер, после чего вы можете делать все, что захотите. Не то чтобы я считаю это хорошей идеей :)

person David Cournapeau    schedule 11.06.2009
comment
получится толстый и медленный водитель :) - person Armageddon; 11.06.2009
comment
Я думал о том же. Тем не менее, Lua был бы гораздо предпочтительнее для этого ИМХО. - person Judge Maygarden; 11.06.2009
comment
Это было бы идеально для написания драйвера для модема со скоростью 300 бод. ;-) - person Nosredna; 11.06.2009
comment
@Judge Maygarden, я тоже не вижу написания драйверов на Lua. C или сборка имеет наибольший смысл. Если вы не сделаете это на языке, близком к металлу, я не понимаю, почему один интерпретируемый язык будет намного лучше другого. - person Nosredna; 11.06.2009
comment
Но знаете, что было бы круто? Язык, похожий на Python, но процедурный, как C. - person Nosredna; 11.06.2009

Никогда не говори никогда, но э ... нет

Возможно, вы сможете что-то вместе взломать, чтобы запускать части драйверов в пользовательском режиме на python. Но все, что связано с режимом ядра, может быть выполнено только на C или сборке.

person Mendelt    schedule 11.06.2009
comment
бух :( все равно спасибо :) я думаю, мне нужно выучить C или сборку ..;) - person Armageddon; 11.06.2009
comment
Как насчет интеграции интерпретатора (написанного на C) в драйвер и последующего выполнения скрипта Python, который также хранится в драйвере как данные? - person Judge Maygarden; 11.06.2009
comment
@Judge Maygarden: Это может работать в пользовательском режиме, но режим ядра очень ограничивает то, какие вызовы могут быть сделаны. Скорее всего, ваш интерпретатор там тоже не запустится. Разработка режима ядра - это своего рода черное искусство. - person Mendelt; 11.06.2009

Нет, они не могут. Драйверы Windows должны быть написаны на языке, который может

  1. Интерфейс с API на основе C
  2. Компилировать до машинного кода

Опять же, ничто не мешает вам написать компилятор, переводящий python в машинный код;)

person JaredPar    schedule 11.06.2009
comment
хм ... если бы я мог написать такой компилятор ... я бы действительно не стал писать драйвер на python: D - person Armageddon; 11.06.2009