据我所知,为了编写设备驱动程序,人们通常使用c ++或汇编程序?装配的选择对我来说很清楚。但为什么是c ++?我想可以用java(例如)或其他高级语言来做。那么为什么c ++如此常见呢?是否有编写驱动程序所必需的C ++编程语言的特定功能?
答案 0 :(得分:4)
我想说C更常用作设备驱动程序的语言(通过C ++)。
这有几个原因:
修改 - 直接内存操作示例:
让我编造一些虚构的设备。假设它有一个寄存器,当你在其上写入某些值时,打开设备上的指示灯。该寄存器为32位宽。前31位表示发光有多亮,最低位表示开灯和熄灭。
当您将设备插入计算机时,操作系统会将该设备注册到特定的内存位置(假设在32位操作系统上为0x00FF00FF00)。为了打开灯,设备驱动程序将执行以下操作:
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这样的高级语言通常不会让你写入像这样的随机内存位置。
答案 1 :(得分:4)
对于在Windows中使用C ++设备驱动程序的优缺点进行了很好的讨论: C++ for Kernel Mode Drivers: Pros and Cons
很多C ++与C的讨论都是“宗教”和个人偏好的问题。通常,在较低级别工作可以更好地控制内存和性能等内容,但可能还需要更多时间来复制可能在更高级语言中使用的工具。做出这些权衡并为正确的问题选择合适的工具是软件开发的一部分。
没有根本原因可以使用Java来编写设备驱动程序。这更像是一个运行时支持语言,库以及在驱动程序内完成所需工作的问题(中断处理程序,I / O等)。表现也可能是一个问题。您需要开发大量的基础设施来实现这一目标。虽然Java不提供低级设施(例如指针),但可以用对本机函数的调用来替换它们。
答案 2 :(得分:1)
C ++可以生成非常高效的汇编代码并提供更高级别的构造,例如模板,RAII和OOP。对于现代程序而言,汇编速度太慢,无法手工编写,也没有提供现代程序员期望的许多东西,比如OOP,而Java编写设备驱动程序的速度要慢得多。
答案 3 :(得分:0)
我不知道为什么?以及它是否真的如此,但我猜,C ++效率与高抽象水平的结合使其成为需要性能并可从高级抽象中受益的任务的非常好的候选者。
答案 4 :(得分:0)
因为C ++是最后一种扩展良好的语言(除了C),它直接转换为机器代码而没有太多的复杂性。