问题标签 [kernel-module]

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.

0 投票
4 回答
17638 浏览

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 代码以使用更现代的机制......

0 投票
2 回答
3173 浏览

linux - 编译包括非内核头文件的 linux 内核(2.6)模块

是否可以编译包含非内核定义的功能的 linux 内核(2.6)模块?

例如:


内核模块.h


生成文件

我编写并尝试编译的内核模块包含许多 openssl 包含文件中的功能。

上面介绍的标准 makefile 不允许包含在 linux 头文件之外。是否可以包含此功能,如果可以,请您指出正确的方向。

谢谢,迈克

0 投票
1 回答
2927 浏览

linux - 如何从 Linux 内核模式设置进程的亲和性?

如何在内核模块中设置进程的 CPU 亲和性?在用户模式下有一个 syscall sched_setaffinity,但我正在寻找内核模式等价物。

在 Linux 内核代码中,还有一个函数叫做sched_setaffinity. 它是从被调用的sys_sched_setaffinity函数中调用的system_call。从表面上看,这是我想要使用的功能。不过,它与系统调用同名的事实让我有点不安。

但众所周知,最好的办法就是尝试一下。所以我做了,我的模块编译了。但是,当我尝试加载模块时,它抱怨名称sched_setaffinity未定义。

0 投票
2 回答
130056 浏览

c - 在 Linux 内核模块中读/写文件

我知道所有关于为什么不应该从内核读取/写入文件的讨论,而是如何使用/procnetlink来做到这一点。无论如何,我想读/写。我还阅读了 让我发疯 - 你永远不应该在内核中做的事情

但是,问题是 2.6.30 不导出sys_read(). 而是包裹在SYSCALL_DEFINE3. 因此,如果我在我的模块中使用它,我会收到以下警告:

显然insmod无法加载模块,因为链接没有正确发生。

问题:

  • 如何在 2.6.22 之后在内核中读/写(其中sys_read()/sys_open()未导出)?
  • 一般来说,如何SYSCALL_DEFINEn()在内核中使用封装在宏中的系统调用?
0 投票
4 回答
9928 浏览

c - 我可以用模块替换 Linux 内核功能吗?

我进入内核工作是为了我的一些暑期研究。我们希望在特定的 RTT 计算中对 TCP 进行修改。我想做的是将 tcp_input.c 中的一个函数的分辨率替换为动态加载的内核模块提供的函数。我认为这将提高我们开发和分发修改的速度。

我感兴趣的函数被声明为静态,但是我已经用非静态函数重新编译了内核并由 EXPORT_SYMBOL 导出。这意味着该函数现在可供内核的其他模块/部分访问。我已经通过“cat /proc/kallsyms”验证了这一点。

现在我希望能够加载一个模块,该模块可以将符号地址从初始地址重写为动态加载的函数。同样,当模块要被卸载时,它会恢复原来的地址。这是一种可行的方法吗?大家有没有建议如何更好地实施?

谢谢!

与Linux 内核中的模块覆盖功能相同

编辑:
这是我最终的方法。
给定以下函数(我想覆盖它,而不是导出):

像这样修改:

这将预期的函数标识符重新定义为指向原始实现的函数指针(可以以类似方式调用)。EXPORT_SYMBOL() 使地址全局可访问,因此我们可以从模块(或其他内核位置)修改它。

现在您可以使用以下形式编写内核模块:

此模块用动态加载的版本替换原始实现。卸载后,将恢复原始引用(和实现)。在我的具体情况下,我为 TCP 中的 RTT 提供了一个新的估计器。通过使用一个模块,我可以进行小的调整并重新启动测试,而无需重新编译和重新启动内核。

0 投票
2 回答
8147 浏览

c - 在内核中更改文件权限

我正在编写内核模块(Linux 中的 C),我想更改其中其他文件的权限。任何解决方案?因为我在内核中,所以我不能使用 chmod syscall 并且......感谢您的帮助

这是我的 Makefile:

这是我的代码:

制作时会发出警告:

WARNING: "sys_chmod" [file] undefiened

并且在使用“sudo insmod”加载模块时会出现以下错误:

Unknown sybol in module

似乎这个错误尤其发生在内核模块中。任何的想法?再次感谢!

0 投票
2 回答
4599 浏览

linux - Linux Kernel Module Programmers Guide 中 chardev.c 示例的问题

我从 lkmpg 编译并运行chardev.c示例,写入设备时收到意外错误:

模块写入函数如下所示:

我没有收到无效操作的预期错误,并且错误打印到 /var/log/messages。

我可以毫无问题地从设备读取,收到预期的结果:

设备 /dev/chardev 是使用以下命令手动创建的:

这是怎么回事?

- 编辑 -

显然,当我 mknod 创建设备时,它最终具有以下权限:

一旦我这样做sudo chmod a+w /dev/chardev了,司机就会按预期工作。

但是,人们说这样做是不正确的。

什么是正确的行动方针,为什么?

0 投票
1 回答
15980 浏览

linux-kernel - Linux 内核模块:何时使用 try_module_get / module_put

我正在阅读 LKMPG(请参阅第 4.1.4 节。取消注册设备),我不清楚何时使用这些try_module_get / module_put功能。一些 LKMPG 示例使用它们,有些则没有。

更令人困惑的是,try_module_get在 2.6.24 源代码的 193 个文件中出现了 282 次,但在Linux Device Drivers (LDD3)Essential Linux Device Drivers中,它们甚至没有出现在一个代码示例中。

我想也许它们与旧register_chrdev接口相关联(在 2.6 中被 cdev 接口取代),但它们只一起出现在同一个文件中 8 次:

那么什么时候适合使用这些功能,它们是否与特定界面或一组环境的使用相关联?

编辑

我从 LKMPG 加载了sched.c示例并尝试了以下实验:

这让我相信内核现在自己做账,gets/puts可能已经过时了。任何人都可以验证这一点吗?

0 投票
4 回答
5831 浏览

linux-kernel - 从内核空间访问用户空间 - get_user_pages

我想将用户空间内存中的指针传递到内核模块中的函数中。我不想使用copy_from_user. 我读过我应该使用get_user_pages函数。

例如一页。

uaddr是用户空间中的地址。

  1. 这样做之后,我可以转换并传递uaddr给我的内核模块函数吗?或者也许我必须以struct pages某种方式使用这些?
  2. 为什么我必须使用向下/向上读取?
  3. 毕竟我必须使用SetPageDirty()page_cache_release()功能?
0 投票
2 回答
8276 浏览

linux - 如何使用 depmod 使一个 Linux 内核模块依赖于另一个外部模块?

我正在编写一个依赖于一个现有内核模块的内核模块。我正在从树中构建我的模块(作为外部模块)。

如何声明依赖项,以便 depmod 识别它?