linux中的c ++设备驱动程序开发

时间:2010-12-07 06:57:21

标签: c++ device-driver linux-device-driver

我想了解使用c ++ for Linux编写图形设备驱动程序和音频设备驱动程序的更多详细信息。 我是开发设备驱动程序的新手,请提供相同的开发/文档详细信息。

谢谢

-Pravin

6 个答案:

答案 0 :(得分:13)

迟到这个问题,克里斯·斯特拉顿已经回答了这个问题,但重要的是要纠正克里斯贝克在这里提出的一些与不熟悉C ++的人有共同误解的事情:

  • C ++不会创建隐式代码或数据,只是您要求的内容。即使是普通的C ++程序员,也不会有额外的代码或数据。我通过了解C ++背后的asm找到了它,但只是读了Scott Meyers的书就足够了。
  • 不仅C ++中的例外是可选的,它们的整个代码都可以在链接中被排除在外。这实际上是在RT应用程序中完成的。

这是为了解决此处发布的误解。但是要添加更多:

1)新手C ++程序员可能会胡说八道,但是一个新手C程序员试图通过自己实现多态性和继承在内核中一次又一次地完成而不会这样做,将会做更多低效率的无法解释的废话。

2)说,基本C ++中唯一可能创建的是虚拟指针,如果你需要它并指定“虚拟”,那么C程序员通常只是创建这样一个指针来操纵它自己添加查找表并因此而获得更难的线虫。和C ++一样,如果你不提“虚拟”那么你甚至不会得到这个指针。继承和封装当然完全没有开销。

3)如果你没有明确地要求特殊功能,C ++会创建与C相同数量的asm和内存,但是当传递函数指针时,是C ++更高效的常见情况。如果你使用C ++的仿函数,你可以内联指向函数。这在嵌入式应用程序中非常有用。

4)如果嵌入式RT使用C ++,为什么linux不能?仅仅因为神话,所以请仔细阅读此消息,并参考scott meyers或更好的asm本身。我在转学20年,并且在14年前转学时对C ++有同样的怀疑,但事实并没有证实任何这种不信任。

TL; DR - 编写效率非常高,在一般情况下,C ++中更高效的代码,研究,行业经验和书籍都很多。

答案 1 :(得分:8)

Linux内核设备驱动程序是用C语言而不是C ++编写的。

大多数设备驱动程序都是通过特殊的设备文件(/ dev / yourdevice0)访问的,可以在其上执行控制以及读写操作。

用户模式客户端程序和用户模式驱动程序打开设备文件,并将其用作与内核模式驱动程序通信的途径。可以想象,这些用户模式驱动程序可以用C ++或任何其他语言编写。

通常,最好的入门方法是拥有一个需要驱动程序的设备,并了解编写它所需的内容。通常,最好的方法是为相关设备或具有类似接口范例的设备找到现有驱动程序,然后通过修改它来开始,直到它适用于您的新设备或者也适用于新设备。

答案 2 :(得分:6)

由于内核中没有C ++运行时,您将很快遇到问题。我想你可以使C ++运行时在内核中运行,但它需要一些非常好的技能。比在C中编写驱动程序要多得多。

此外,您将被Linux内核开发人员立即放下。我的意思是真的放下。它们会让你如此糟糕,你永远无法从中恢复过来。有可能你会说“螺丝Linux和他们的精英混蛋”。

我不想听起来很消极,但与你从别人那里听到的声音相比,我是一个温和而合适的声音。

答案 3 :(得分:6)

Linux驱动程序是用C开发的。如果您想了解有关Linux驱动程序开发的更多信息,请阅读此免费电子书:http://lwn.net/Kernel/LDD3/
所有pdf章节的tarball也可用:http://lwn.net/images/pdf/LDD3/ldd3_pdf.tar.bz2

答案 4 :(得分:4)

C,而不是C ++是编写(内核模式)设备驱动程序的语言,其原因最终很简单:C ++是一种不适合用于编写驱动程序软件的语言。作为其副作用,内核模式中没有可用的c ++运行时。

至于为什么c ++不合适:至少有两个原因:

  • 所有操作系统上的设备驱动程序都需要严格的代码放置 - 某些代码需要位于不可分页的块中,不可分页的内存是有限的资源。 c ++生成了大量的隐式代码,隐含了它(a)审计是不可能的,(b)用必要的指令括起来保证放置。
  • 异常在c ++中变为非可选的。 c ++异常通常根据CPU异常实现,并且许多驱动程序代码在不能容忍(cpu)异常的级别执行(因此需要不可分页的代码块)。

我认为还有一些我忘记的方面,但是,ideomatic c ++违反了许多对驱动程序的限制。这就是C首选的原因。

答案 5 :(得分:0)

这是一篇过时的文章,但是我决定写一个答案,因为没有答案说明如何避免事与愿违。

简短答案:

答案是“是的,您可以”……付出了巨大的努力。我们就忽略Linus Trovald关于C ++的opinion

长答案:

我的建议是在真正需要时使用C ++编写它。 在内核中运行C ++的方式有很多陷阱。

我最近研究了这个主题,这是我的总结:

  • newdelete

    没有实现

    这是最容易克服的事情。

  • 内核上的堆栈大小小于8 kb(对于32位)和16kb(对于64位)。

    Opps ...不让堆栈溢出将是一个挑战。

  • 不允许关注

    • 全局非平凡变量(没有C ++运行时为您初始化它,使用singleton会更好)
    • STL(C ++的超级功能之一)
    • RTTI
    • 例外
  • 这是PIA,可让C ++读取内核标头。如果您喜欢挑战,请至少阅读C++ in the Linux kernel,然后再开始。不要忘记在将旧代码升级到新内核时,必须每次完成。

如果您想了解更深入的知识,请查看以下文章。

此外,korisk在github中有一个关于准系统内核模块的演示仓库。

结论

再次,我的真诚意见是,在您开始使用内核模块之前,一定要了解如何运行C ++。

第三次,在您开始之前了解在内核模块中运行C ++的努力!

相关问题