В чем преимущество c ++ при написании драйверов устройств?

Насколько я знаю, для написания драйверов устройств люди обычно используют c ++ или сборку? Выбор сборки для меня ясен. Но почему c ++? Я предполагаю, что это можно сделать на java (например) или на другом языке высокого уровня. Так почему же C ++ так распространен? Есть ли какая-то особенность языка программирования C ++, необходимая для написания драйверов?


person Narek    schedule 11.01.2011    source источник
comment
Это не C или «Ассемблер» - хотя, возможно, первый недостаток ;-) Я полагаю, что большинство драйверов, как правило, на C. Особенно, скажем, в ядре Linux.   -  person    schedule 11.01.2011
comment
Если задуматься, действительно ли имеет смысл запускать драйвер оборудования внутри виртуальной машины Java?   -  person David Rodríguez - dribeas    schedule 11.01.2011


Ответы (5)


Я бы сказал, что C гораздо чаще используется в качестве языка для драйверов устройств (по сравнению с C ++).

На это есть несколько причин:

  1. Большинство основных операционных систем написаны на комбинации C и ассемблера и предоставляют интерфейсы языка C для операционной системы.
  2. Написание драйвера устройства обычно включает в себя взаимодействие с устройством, которое включает в себя прямую манипуляцию с памятью регистров и тому подобное. 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, обычно не позволяют вам писать в какую-то случайную область памяти, подобную этой.

person zdan    schedule 11.01.2011
comment
Что вы имеете в виду, говоря о прямом манипулировании памятью, и как это делается в C ++? - person Narek; 11.01.2011
comment
@Narek, см. Мою правку для примера. - person zdan; 11.01.2011
comment
Нет причин использовать C, если у вас нет достаточно хорошего компилятора C ++. Можно по-прежнему ограничиться подходящим подмножеством, которое будет столь же эффективным, как лучший код C, но также обеспечит абстракции более высокого уровня. Кстати. есть еще компиляторы только для Си? Я думаю, что в большинстве случаев это компилятор C ++, который компилирует код C. - person Gene Bushuyev; 11.01.2011
comment
Спасибо за разъяснение. Я подозревал такой ответ, но проблема в том, что из литературы я знаю, что указателю можно присвоить 0, NULL или адрес объекта того же типа. Это неправильно? А по поводу вашего axample, как вы могли узнать, какой адрес с OS назначить тому регистру, который вам нужен? - person Narek; 11.01.2011
comment
@Gene, я согласен, нет причин не использовать C ++ (я написал драйверы устройств на C ++), я просто заметил, что большинство драйверов написано на C, а не на C ++. У меня нет реальных доказательств этого, но это мой опыт. - person zdan; 11.01.2011
comment
@Narek, вы обычно спрашиваете адрес у ОС. Фактически, ОС назначает блок памяти устройству, и вам нужно знать смещение в блоке, в котором находится ваш регистр. - person zdan; 11.01.2011
comment
А как насчет Спасибо за разъяснения. Я подозревал такой ответ, но проблема в том, что из литературы я знаю, что указателю можно присвоить 0, NULL или адрес объекта того же типа. Это неправильно? ? - person Narek; 11.01.2011
comment
@Narek: Да, вы назначаете NULL (т.е. 0) указатель. Обычно это означает, что я еще не назначил это, потому что я тоже еще не знаю, что это установить. Если вы это сделаете, вам нужно будет добавить проверки, прежде чем пытаться разыменовать указатель. - person zdan; 11.01.2011
comment
@zdan Нет, нет, я имею в виду, законно ли назначать число, отличное от 0 или NULL (что одно и то же!). - person Narek; 12.01.2011
comment
@Narek, компилятор позволит вам присвоить указателю любое значение. Вы обязаны убедиться, что он указывает на что-то действительное. - person zdan; 12.01.2011

Здесь есть хорошее обсуждение плюсов и минусов использования C ++ для драйверов устройств в Windows: C ++ для драйверов режима ядра: плюсы и минусы

Многие дискуссии между C ++ и C носят «религиозный характер» и являются вопросом личных предпочтений. В целом работа на более низком уровне дает вам лучший контроль над такими вещами, как память и производительность, но также может потребовать больше времени для дублирования средств, которые могут быть доступны на языках более высокого уровня. Принятие этих компромиссов и выбор правильного инструмента для решения правильной проблемы - это часть того, чем занимается разработка программного обеспечения.

Нет фундаментальной причины, по которой вы не могли бы использовать Java для написания драйвера устройства. Это больше вопрос поддержки языка, библиотек и типа работы, которую необходимо выполнить внутри драйвера (обработчики прерываний, ввод-вывод и т. Д.), Во время выполнения. Производительность также может быть проблемой. Для этого вам потребуется разработать очень большую инфраструктуру. Хотя Java не предлагает средств низкого уровня (таких как указатели), их можно заменить вызовами собственной функции.

person Guy Sirton    schedule 11.01.2011
comment
+1 за ссылку - интересное чтение. - person ; 12.01.2011

C ++ может создавать очень эффективный ассемблерный код И предоставлять конструкции более высокого уровня, такие как шаблоны, RAII и ООП. Сборка слишком медленная, чтобы писать ее вручную для современных программ, и не дает многого, чего ожидают современные программисты, например ООП, в то время как Java будет НАМНОГО слишком медленной для написания драйвера устройства.

person Puppy    schedule 11.01.2011
comment
Если Java настолько медленная, то почему C ++ не побеждает Java вообще и навсегда? - person Narek; 11.01.2011
comment
@Narek: Спасибо JVM (виртуальная машина Java). - person Xavier V.; 11.01.2011
comment
@DeadMG: Java не так уж и медленна. Настоящая проблема заключается в том, что Java работает с виртуальной машиной, а не с базовым оборудованием. - person John Percival Hackworth; 11.01.2011
comment
Что ты имеешь в виду? Насколько я знаю, одна из причин того, что Java работает медленно, заключается в том, что она транслируется в байт-код, который выполняет JVM. Так почему благодаря JVM? - person Narek; 11.01.2011
comment
@Narek: Я отвечал на ваш вопрос: почему C ++ не побеждает Java вообще и навсегда? Я не говорил о скорости Java. - person Xavier V.; 11.01.2011
comment
@ Джон Персиваль Хакворт работает ли C ++ на оборудовании? Он работает на ОС, не так ли? - person Narek; 11.01.2011
comment
@Narek: Они даже отдаленно не то же самое. Даже затраты на запуск JVM превышают пределы производительности для большинства драйверов устройств. Нет такой вещи, как победить язык - у всех есть свои плюсы и минусы. Плюсы C ++ оказались настоящими профессионалами в управлении устройством. - person Puppy; 11.01.2011
comment
@Narek - в программировании нет универсального решения. С другой стороны, есть люди, которые могут ездить только на велосипеде, и те, кто может пилотировать самолет, вы не ожидаете, что первая категория автоматически перейдет во вторую, независимо от того, сколько преимуществ она может принести. - person Gene Bushuyev; 11.01.2011
comment
@Narek: Игнорируя .net, программа на C ++ компилируется на оборудование, на котором она работает. Существует уровень абстракции, обеспечиваемый ОС, с которой работает большинство программ, но для драйвера код работает непосредственно с оборудованием, чтобы обеспечить уровень абстракции. - person John Percival Hackworth; 11.01.2011
comment
@Narek - в выборе языка реализации много переменных. скорость выполнения всего одна, и сравнительно редко она на самом деле является самой важной. Некоторые говорят, что 90% времени разработчиков тратится на чтение кода, который уже существует. Для языков байт-кода требуется интерпретатор. скомпилированные - нет. некоторые языки определили семантику освобождения памяти (например, c ++, вы знаете, когда память будет освобождена, а java - нет) ... это просто лошади для курсов. Кстати: из-за динамической переоптимизации и JIT удивительно, что иногда языки байт-кода могут быть намного быстрее, чем, скажем, c ++ - person time4tea; 11.01.2011
comment
@ time4tea: Теоретически. Однако я ни разу не видел ни одного теста, который бы показал, что это происходит в действительности - в конце концов, вы должны заплатить стоимость повторной оптимизации, и это должно происходить в реальном времени во время работы программы, тогда как статическая оптимизация C ++ может занять несколько часов. во время компиляции. Каждый анализ производительности, который я когда-либо видел, показывает, что разумно оптимизированный код на обоих рассматриваемых языках делает C и C ++ более быстрыми, чем .NET или Java, примерно в 1,5 или более раз. - person Puppy; 12.01.2011

Я не знаю почему? и так ли это на самом деле, но я предполагаю, что сочетание эффективности и высокого уровня абстракции в C ++ делает его очень хорошим кандидатом для задач, требующих производительности и позволяющих извлечь выгоду из абстракций высокого уровня.

person Gene Bushuyev    schedule 11.01.2011

Потому что C ++ - последний широко распространенный язык (кроме C), который переводится непосредственно в машинный код без особых сложностей.

person Alexandre C.    schedule 11.01.2011