可能重复:
C#驱动程序开发?
为什么我们使用C来开发设备驱动程序,而不是C#?
尽管从理论上讲可能可以做到,但在许多情况下,C语言更适合于该任务。一些原因是更严格地控制生成的机器代码以及在直接与硬件交互时更接近处理器通常更好。
面向对象的语言也倾向于反复分配和释放(通过垃圾回收)大量内存。但是,在中断处理程序中,您访问堆分配功能的能力受到严格限制。这是因为堆分配可能触发垃圾回收(昂贵),并且因为您必须避免并处理尝试同时分配中断代码和非中断代码的情况。如果没有对此代码、编译器输出以及管理代码的任何内容(VM或可能是本地编译并仅使用库)施加大量限制,您可能最终会遇到一些非常奇怪的错误。
管理语言必须由某人管理。这种管理可能依赖于一个运行良好的底层操作系统。这为许多(但不是所有)驱动程序使用托管代码产生了引导问题。
完全可以用C#编写设备驱动程序。如果您正在驱动串行设备(例如GPS设备),那么它可能很简单(尽管您将在更低层次上使用UART芯片或USB驱动程序,这可能是用C或汇编编写的),因为可以作为应用程序执行。如果您正在编写以太网卡(不用于网络引导),则理论上可能可以使用C#的某些部分,但您可能会严重依赖其他语言编写的库和/或使用操作系统的用户空间驱动程序功能。
C用于驱动程序,因为其输出相对可预测。如果您了解处理器的一些汇编语言,可以使用C编写一些代码,针对该处理器进行编译,并且可以相当准确地猜测其汇编代码的样子。您还将了解这些指令的确定性。它们中的任何一个都不会让您惊讶并触发垃圾回收器或调用析构函数(或finalize)。
因为C#是一种高级语言,它不能直接与处理器通信。C代码可以直接编译成处理器能理解的本地代码。
仅仅是为了补充Darin Dimitrov的回答。是的,C#程序无法在内核模式下运行。
但是为什么不能呢?
在Patrick Dussud的interview中,他描述了在Vista开发期间尝试将CLR包含在低级别*的情况。他们遇到的障碍是CLR依赖于操作系统安全库,而这个库又依赖于UI层。他们无法在Vista中解决这个问题。除了Singularity之外,我不知道还有其他任何努力。
*请注意,虽然“低级别”可能不足以让我们能够使用C#编写驱动程序,但至少是必要的。
C语言支持与其他外设的接口更多,因此C语言用于开发系统软件。唯一的问题是需要管理内存,这是开发人员的噩梦。但在C#中,内存管理可以轻松自动完成(C和C#之间有无数差异,请尝试谷歌搜索)。
说实话,那些擅长硬件或硬件接口的人,通常不是非常精通编程。他们倾向于使用像C这样的简单语言。否则,框架将会演变成允许在内核级别使用像C++甚至C#这样的语言。整个操作系统都可以用C++(ECOS)编写。所以,在我看来,这主要是传统。
现在,对于在驱动程序/内核等要求严格的代码中使用更复杂的语言,确实存在一些合理的争论。有可见性方面的问题。C#和C++编译器在幕后做了很多工作。一个无害的赋值语句可能隐藏了大量的代码(运算符重载、属性)。异常的代价可能不太明显。垃圾回收使对象/内存的生命周期不清楚。所有使编程更容易的功能,也是绞索。
然后是语言所需的生态系统。如果所需的功能引入了太多组件,仅仅大小就可能成为一个因素。如果语言中的基元倾向于沉重(为了有用的软件抽象),那么这将是驱动程序和内核可能不愿承担的负担。