问题标签 [linux-device-driver]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c - Linux设备驱动程序中的静态函数?
linux代码中设备驱动程序中的大多数函数定义被定义为静态是否有原因?是否有一个原因?
有人告诉我这是为了范围界定和防止命名空间污染,谁能详细解释一下为什么在这种情况下使用静态定义?
linux - Linux 设备驱动程序不安全的 FXSAVE/FXRSTOR 错误——任何先例?
有一个令人讨厌的问题暂时难住了我公司的一些工程师试图对其进行调试。
C++ 程序通常在具有 MPI 的多核计算机集群上运行。
它会运行很长时间——也许是几天——然后突然失败。
大多数从事它的工程师已经消除了程序本身存在错误的任何合理可能性,因此他们开始将责任归咎于可能的硬件问题,但我怀疑 Linux 内核模块或设备中一定存在软件问题司机。
值得怀疑的是,内核模块或设备驱动程序为了进行一些浮点计算,正在以在 SMP 系统上不安全的方式执行 FXSAVE/FXRSTOR。它可以像对需要可重入的内核例程中的静态缓冲区执行 FXSAVE 一样简单。这将创建一个竞争条件错误,该错误很少会破坏线程的浮点上下文。
在应用程序级别,似乎正在发生的事情是 MXCSR 的一个或多个位(它是 FXSAVE/FXRSTOR 上下文的一部分)突然更改,但没有应用程序代码来更改它。
多年前我在 Windows 上遇到过类似的情况,最终证明是视频驱动程序中的一个错误,因此当应用程序代码被操作系统抢占时,该线程上下文中的一些 MXCSR 位被破坏。
我不是 Linux 内核黑客或设备驱动程序开发方面的专家,但我了解到重入规则已经发生了很大变化;在非 SMP 和 SMP(多核)系统之间;内核版本之间;等等因此出现竞争条件错误的可能性似乎是合理的。
所以我的问题是:是否有任何已知的 Linux 驱动程序(或内核)错误符合该描述?
如果他们有类似的症状,我可以引用的任何先例都会有所帮助。在这一点上,很多相关人员(恕我直言)浪费时间思考“好吧,我的代码中没有错误,所以它一定是坏硬件。” 我想让他们超越这一点,并寻找更有可能成为真正原因的东西。
linux - 在 Linux 设备驱动程序中使用浮点的编码约定是什么?
这与 这个问题有关。
我不是 Linux 设备驱动程序或内核模块方面的专家,但我一直在阅读 Rubini & Corbet 的“Linux 设备驱动程序”[O'Reilly] 和一些在线资源,但我一直无法找到关于这个具体问题的任何事情。
何时允许内核或驱动程序模块使用浮点寄存器?
如果是这样,谁负责保存和恢复其内容?
(假设 x86-64 架构)
如果我理解正确,每当 KM 运行时,它都在使用已从某个应用程序线程抢占的硬件上下文(或硬件线程或寄存器集——无论您想调用什么)。如果您在 c 中编写 KM,编译器将正确确保通用寄存器正确保存和恢复(就像在应用程序中一样),但浮点寄存器不会自动发生这种情况。就此而言,许多 KM 甚至不能假设处理器具有任何浮点能力。
我猜想使用浮点的KM必须小心保存和恢复浮点状态是否正确?是否有这样做的标准内核函数?
是否在任何地方都说明了此编码约定?
对于非 SMP 驱动程序,它们是否不同?
对于较旧的非抢占式内核和较新的抢占式内核,它们是否不同?
c++ - 在 Ubuntu Eee 上编译内核需要什么?
我正在尝试按照教程在 Linux 中创建自定义 USB 驱动程序,我希望使用 g++ 在我的 Eee PC 上使用 Ubuntu Eee 开发这个东西。不幸的是,要遵循本教程,我需要 linux/module.h 头文件。据我了解,我需要编译内核才能使其正常工作。我以前从未编译过内核,我找到的所有说明都是针对桌面 Ubuntu 的。
我在我的 Eee 上这样做,因为如果我能做到这一点并在课堂项目中使用它,我将在课堂上获得额外的学分。
我正在关注的教程在这里:http ://www.linuxjournal.com/article/7353 和这里:http ://www.linuxjournal.com/article/4786
linux - 如何为 i2c 设备编写新的 Linux 驱动程序?
我有一个带有一些 i2c 控制功能的 USB 设备,我想添加一个用户空间 API 来处理这些位。如何将 i2c 支持添加到设备的现有驱动程序?
linux - 内核模块的内存使用情况
在尝试估计内核模块(通常是设备驱动程序)消耗的内存量时,我尝试使用size实用程序,它给出了 .ko(.bss、.data、.text 等)的静态内存区域的大小。所以我期望这些值的总和与插入模块后立即由lsmod命令给出的输出完全相等。
init() 函数中没有执行动态内存分配(kmalloc 或 vmalloc)以确保它不会导致差异。那么为什么会出现不匹配?
奇怪的是,大多数时候发现不匹配是固定的!!
命令输出如下所示
大小 chardev.ko
lsmod
linux - ioctl 返回 -1 并将 errno 设置为 EPERM
我有一个调用ioctl()的 C 程序,但它返回 -1 并且errno设置为EPERM。但我已将该文件的模式更改为“777”。
你能告诉我为什么ioctl()仍然返回 -1 并将errno设置为EPERM吗?
c - open() 返回“没有这样的设备”错误,但是有这样的设备(linux)
我正在尝试使用一个有点旧的 DAQ,并且不得不跳过一些圈来获得一个旧的(大约 2004 年)设备驱动程序来编译它(DTI-DT340 Linux-DAQ-PCI)。
我已经到了可以编译的地步,我可以加载内核模块,它找到卡,我可以使用 mknod 创建字符设备。
但是当我尝试打开这些设备时,我似乎无法打开这些设备并不断收到errno 19 (ENODEV) 'No such device'
但是 mknod 对制作它没有任何抱怨,而且它就在那里:
有什么我忽略的事情吗?打开失败的原因可能是什么?
这是我用来加载驱动程序和制作设备的脚本。
一些附加信息:
回答: printk 确认 -ENODEV 是从 open() 内部抛出的。遵循旧式
(已弃用),if(!pdev)
以 true 结束,并返回 -ENODEV。
我越来越近了——我想我必须完成并更新 pci 代码以使用更现代的机制......
linux - Linux socket编程调试?
我有一个这样的功能:
它用于使用 netlink 从内核空间接收消息。但是当我运行它时,结果总是显示“从内核接收答案时超时”的消息,从源代码中,这是由于“选择”方法总是返回“0”的原因。不知道原因,谁能给我一些建议,谢谢。
c++ - 用于单元测试的“Echo”设备
我目前正在为测试硬件通信端口的程序编写一些 CPPunit 测试(是的,我正在为测试应用程序编写单元测试;-))。我正在测试的一个类基本上是设备文件描述符的包装器;我对文件描述符进行调用 read()
。Linux 上是否有设备文件/驱动程序,如果您访问它,当您从中读取时,您会读回您写的内容(如 FIFO 队列设备)? 如果我有这个设备文件,那么在我的包装器中替换实际的设备文件会非常简单,并且可以很容易地模拟现实世界硬件上可能发生的“环回”场景。write()
write()
read()
本质上,我正在寻找的是一种假设的"/dev/echo"
设备。
例如:设备的行为如下: