Насколько я знаю, для написания драйверов устройств люди обычно используют c ++ или сборку? Выбор сборки для меня ясен. Но почему c ++? Я предполагаю, что это можно сделать на java (например) или на другом языке высокого уровня. Так почему же C ++ так распространен? Есть ли какая-то особенность языка программирования C ++, необходимая для написания драйверов?
В чем преимущество c ++ при написании драйверов устройств?
Ответы (5)
Я бы сказал, что C гораздо чаще используется в качестве языка для драйверов устройств (по сравнению с C ++).
На это есть несколько причин:
- Большинство основных операционных систем написаны на комбинации C и ассемблера и предоставляют интерфейсы языка C для операционной системы.
- Написание драйвера устройства обычно включает в себя взаимодействие с устройством, которое включает в себя прямую манипуляцию с памятью регистров и тому подобное. C и C ++ позволяют делать это изначально.
Изменить - Пример прямого действия с памятью:
Позвольте мне придумать какой-нибудь выдуманный прием. Скажем, у него есть регистр, который, когда вы записываете в него определенные значения, загорается на устройстве. Этот регистр имеет ширину 32 бита. Верхний 31 бит говорит о том, насколько ярким должен быть свет, младший бит включает и выключает его.
Когда вы подключаете устройство к компьютеру, операционная система назначает этому регистру определенную ячейку памяти (скажем, 0x00FF00FF00 в 32-битной ОС). Чтобы включить свет, драйвер устройства сделает что-то вроде этого:
int* lightRegister = 0x00FF00FF00; // You would normally ask the OS for this address, not hardcode it.
int brightnessValue = 256; // Only Even numbers, the low bit must be zero.
*lightRegister = brightnessValue | 1; //Turn it on.
*lightRegister = 0; // Turn it off.
Языки более высокого уровня, такие как Java, обычно не позволяют вам писать в какую-то случайную область памяти, подобную этой.
Здесь есть хорошее обсуждение плюсов и минусов использования C ++ для драйверов устройств в Windows: C ++ для драйверов режима ядра: плюсы и минусы
Многие дискуссии между C ++ и C носят «религиозный характер» и являются вопросом личных предпочтений. В целом работа на более низком уровне дает вам лучший контроль над такими вещами, как память и производительность, но также может потребовать больше времени для дублирования средств, которые могут быть доступны на языках более высокого уровня. Принятие этих компромиссов и выбор правильного инструмента для решения правильной проблемы - это часть того, чем занимается разработка программного обеспечения.
Нет фундаментальной причины, по которой вы не могли бы использовать Java для написания драйвера устройства. Это больше вопрос поддержки языка, библиотек и типа работы, которую необходимо выполнить внутри драйвера (обработчики прерываний, ввод-вывод и т. Д.), Во время выполнения. Производительность также может быть проблемой. Для этого вам потребуется разработать очень большую инфраструктуру. Хотя Java не предлагает средств низкого уровня (таких как указатели), их можно заменить вызовами собственной функции.
C ++ может создавать очень эффективный ассемблерный код И предоставлять конструкции более высокого уровня, такие как шаблоны, RAII и ООП. Сборка слишком медленная, чтобы писать ее вручную для современных программ, и не дает многого, чего ожидают современные программисты, например ООП, в то время как Java будет НАМНОГО слишком медленной для написания драйвера устройства.
Я не знаю почему? и так ли это на самом деле, но я предполагаю, что сочетание эффективности и высокого уровня абстракции в C ++ делает его очень хорошим кандидатом для задач, требующих производительности и позволяющих извлечь выгоду из абстракций высокого уровня.
Потому что C ++ - последний широко распространенный язык (кроме C), который переводится непосредственно в машинный код без особых сложностей.