问题标签 [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.
linux-device-driver - 查找设备基地址以通过 inb() 和 outb() 进行通信
我正在尝试使用 inb()、inw()、outb() 和 outw() 命令与磁盘驱动器通信,以便找到有关驱动器的特定信息。但是,要使用这些命令,我需要设备的正确 I/O 端口。当我拥有正确的 I/O 端口时,我可以很容易地找到我正在寻找的信息,但是,我不知道如何在 Linux 中找到设备 I/O 端口的基地址。
在 DOS 中,我可以使用 Hdat2 查找设备的基地址,但是,我试图在 Linux 中查找地址。有没有办法在 Linux 中找到哪个设备映射到哪个 I/O 端口?
/proc 中有一个名为 ioports 的文件,其中包含一些信息,但我不知道如何将这些信息与特定设备相关联。
任何帮助将不胜感激。谢谢!
network-programming - 使用带有 Linux 和两个 NIC 的标准 PC 构建网络设备原型
我愿意建立一个网络设备的原型。假设该设备透明地操纵以太网数据包。假设有两个网络接口卡,其中一个卡连接到外部支路(即eth0),另一个连接到内部支路(即eth1)。
在附图中的典型网络布局中,它将放置在路由器和 LAN 的交换机之间。
我的计划是编写一个在内核驱动程序级别挂钩的软件,并对传入和传出的数据包做任何我需要做的事情。
例如,一个“传出”数据包(位于 eth1)将被操纵并传递到另一个 NIC(eth0),然后应该将其传输到下一个希望
我的问题是:
- 这是可行的吗?
- 那些网卡将没有IP地址,这应该是一个问题吗?
提前感谢您的回答。
(不,市场上还没有这样的设备,所以请,“为什么要重新发明轮子”的答案风格无关紧要)
linux-kernel - tasklet 在用户空间应用中的优势
对下半部分有一些疑问。在这里,我只考虑小任务。另外,我只考虑非抢占式内核。
假设考虑一个以太网驱动程序,其中 rx 中断处理正在执行大约 10 个函数调用。(糟糕的编程:))
现在,从性能的角度来看,如果可以将 9 个函数调用移动到一个 tasklet 并且只需要在中断处理中调用 1 个,那么我真的可以在 tcp 读取应用程序中获得一些好的性能吗?
或者换句话说,当切换到用户空间应用程序时,所有调度的小任务的9个函数调用都会被调用,实际上用户空间应用程序只有在“所有已调度的任务”完成后才能获取数据包和数据完全的 ?正确的?
我知道通过设置 bottom half ,我们启用了所有中断 .. 但我怀疑依赖中断的应用程序是否真的通过在中断处理程序本身或下半部分中拥有整个 10 个函数来获得任何东西。
简而言之,通过使用 tasklet,我可以在用户空间应用程序中获得性能改进吗?
linux - 学习linux驱动
我现在正在学习编程驱动程序。
我正在从这本书中学习Linux设备驱动程序
但我有点缺乏实践。你能推荐一些我可以开始的简单项目吗?
或者一些新手可以理解的开源项目。
欢迎提供更多示例和教程。
感谢帮助。
c - 如何编写用户空间 linux 块设备驱动程序?
我想写一个linux块设备驱动程序。驱动程序不需要访问硬件,因此它可以在用户空间中。
首先,我尝试使用这个 Makefile构建一个示例块设备驱动程序:
然而,我得到了这些我不知道如何解决的错误。这是标准输出和标准错误:
对此的任何帮助将不胜感激。
谢谢, 安德烈亚斯
linux-device-driver - Linux System.map 中缺少函数名称和地址
我在 AT91SAM9263 板上进行嵌入式开发并遇到了一个奇怪的问题。它运行 debian Linux 内核 2.6.18.4,并与 arm-linux-gcc 3.4.6 交叉编译,并使用 uClibc-0.9.28 作为 C 库。我正在调试内核设备驱动程序,但 System.map 文件中没有出现特定功能。可以理解的是,因此我无法在其上设置断点。奇怪的是,如果我闯入它的调用函数,我就无法进入它——使用 gdb 的 nexti 命令执行它但跳过源代码。该函数是 atmel_rx_chars(struct uart_port *port)。它是在 atmel_serial.c 中声明的静态 void 函数,其示例出现在 [1] 中。同一文件中还有其他静态 void 函数 (atmel_tx_chars(struct uart_port *port), 例如)在同一个文件中声明并且实际上在 System.map 文件中被索引。根据 [2] “System.map 由 'nm vmlinux' 生成,并且不相关或无趣的符号被剔除。” 我尝试使用 nm(以及 objdump)来查看所有符号,但它仍然没有出现在输出中。但是,当我 grep atmel_rx_chars vmlinux 时,它会返回匹配项。我曾经认为自己是一个超级用户,但在这之后我真的很难过。任何建议将不胜感激。我曾经认为自己是一个超级用户,但在这之后我真的很难过。任何建议将不胜感激。我曾经认为自己是一个超级用户,但在这之后我真的很难过。任何建议将不胜感激。
谢谢,
杰斯
[1] http://lxr.free-electrons.com/source/drivers/serial/atmel_serial.c#L379
[2]http://www.faqs.org/docs/Linux-HOWTO/Kernel-HOWTO.html#systemmap
linux-kernel - ifconfig 数据包计数
如果我输入 ifconfig 我会得到 Tx 和 RX 的数据包……增加这个计数器的代码到底在哪里?它在网络驱动程序本身中吗?还是在内核中?
如果可能,请提供所用计数器变量的 lxr 链接。
谢谢 !
linux-kernel - 不带 -o 循环的安装
我为 linux 内核编写了一个虚拟(ram 磁盘)块设备驱动程序。加载驱动程序后,我可以将其视为 /dev/mybd。
我可以使用 dd 命令成功地将数据传输到其上,成功比较复制的数据。
问题是当我在其上创建 ext2/3 文件系统时,我必须在 mount 命令中使用 -o 循环选项。否则挂载失败,结果如下:
mount:fs 类型错误、选项错误、mybd 上的超级块错误、缺少代码页或帮助程序或其他错误
可能是什么问题呢?请帮忙。
谢谢。
linux-kernel - 更改中断描述符表
我正在使用 Linux 2.6.26 内核版本,并且正在尝试使用内核模块更改中断描述符表。我只是想在这里更改页面错误表条目。因此,我制作了原始 IDT 的副本并仅对缺页表条目进行更改。ISR 的目标是在调用原始页面错误处理程序之前打印出页面错误的信息。但是一旦我用 insmod 加载内核就会崩溃,即它专门用“loadIDTR”函数崩溃了。通过进一步调试,我发现如果我加载 IDTR 不更改任何条目,它可以正常工作。我没主意了。
我已经粘贴了下面的代码
c - 用户空间到内核空间和 sysfs 以及如何使用 sysfs 更改 igmpv3 pkt 中的一个保留值
我之前已经发布过查询,我正在重复同样的问题这是由主机发送的。
我想通过说这更像是从用户空间更改内核空间变量的通用问题来补充上述问题。
对此,一只 ctuffli 回答说:
从用户态程序的角度来看,您应该将驱动程序视为具有定义良好的接口的“黑匣子”,而不是带有您想要更改的变量的代码。使用这种心智模型,有四种方式(即接口)将控制信息传达给您应该考虑的驱动程序:
- 命令行选项。您可以将参数传递给在初始化期间可用的内核模块。
- IOCTL。这是将控制信息传递给驱动程序的传统方式,但这种机制使用起来比 sysfs 稍微麻烦一些。
- proc 进程信息伪文件系统。proc 在 /proc 目录中创建用户登陆程序可以读取和有时写入的文件。过去,此接口也被用于与驱动程序进行通信。尽管 proc 看起来与 sysfs 相似,但较新的驱动程序 (Linux 2.6) 应该使用 sysfs 代替,因为 proc 的目的是报告进程的状态。
- sysfs 是一个伪文件系统,用于导出有关驱动程序和设备的信息
根据您需要与驱动程序通信的时间(即初始化、运行时),您应该添加一个新的命令行选项或一个新的 sysfs 条目来更改驱动程序如何处理数据包中保留字段的值。
感谢 Ctuffli 的回答。我对 sysfs 没有任何了解。你能提供更多细节吗?我想将 igmpv3 pkt 的保留值之一更改为 0 或 1 或 2。这是我唯一需要更改的内容。你能给我更多关于这个特定问题的细节吗?