问题标签 [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.
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 内核(2.6)模块
是否可以编译包含非内核定义的功能的 linux 内核(2.6)模块?
例如:
内核模块.h
生成文件
我编写并尝试编译的内核模块包含许多 openssl 包含文件中的功能。
上面介绍的标准 makefile 不允许包含在 linux 头文件之外。是否可以包含此功能,如果可以,请您指出正确的方向。
谢谢,迈克
linux - 如何从 Linux 内核模式设置进程的亲和性?
如何在内核模块中设置进程的 CPU 亲和性?在用户模式下有一个 syscall sched_setaffinity
,但我正在寻找内核模式等价物。
在 Linux 内核代码中,还有一个函数叫做sched_setaffinity
. 它是从被调用的sys_sched_setaffinity
函数中调用的system_call
。从表面上看,这是我想要使用的功能。不过,它与系统调用同名的事实让我有点不安。
但众所周知,最好的办法就是尝试一下。所以我做了,我的模块编译了。但是,当我尝试加载模块时,它抱怨名称sched_setaffinity
未定义。
c - 在 Linux 内核模块中读/写文件
我知道所有关于为什么不应该从内核读取/写入文件的讨论,而是如何使用/proc或netlink来做到这一点。无论如何,我想读/写。我还阅读了 让我发疯 - 你永远不应该在内核中做的事情。
但是,问题是 2.6.30 不导出sys_read()
. 而是包裹在SYSCALL_DEFINE3
. 因此,如果我在我的模块中使用它,我会收到以下警告:
显然insmod
无法加载模块,因为链接没有正确发生。
问题:
- 如何在 2.6.22 之后在内核中读/写(其中
sys_read()
/sys_open()
未导出)? - 一般来说,如何
SYSCALL_DEFINEn()
在内核中使用封装在宏中的系统调用?
c - 我可以用模块替换 Linux 内核功能吗?
我进入内核工作是为了我的一些暑期研究。我们希望在特定的 RTT 计算中对 TCP 进行修改。我想做的是将 tcp_input.c 中的一个函数的分辨率替换为动态加载的内核模块提供的函数。我认为这将提高我们开发和分发修改的速度。
我感兴趣的函数被声明为静态,但是我已经用非静态函数重新编译了内核并由 EXPORT_SYMBOL 导出。这意味着该函数现在可供内核的其他模块/部分访问。我已经通过“cat /proc/kallsyms”验证了这一点。
现在我希望能够加载一个模块,该模块可以将符号地址从初始地址重写为动态加载的函数。同样,当模块要被卸载时,它会恢复原来的地址。这是一种可行的方法吗?大家有没有建议如何更好地实施?
谢谢!
编辑:
这是我最终的方法。
给定以下函数(我想覆盖它,而不是导出):
像这样修改:
这将预期的函数标识符重新定义为指向原始实现的函数指针(可以以类似方式调用)。EXPORT_SYMBOL() 使地址全局可访问,因此我们可以从模块(或其他内核位置)修改它。
现在您可以使用以下形式编写内核模块:
此模块用动态加载的版本替换原始实现。卸载后,将恢复原始引用(和实现)。在我的具体情况下,我为 TCP 中的 RTT 提供了一个新的估计器。通过使用一个模块,我可以进行小的调整并重新启动测试,而无需重新编译和重新启动内核。
c - 在内核中更改文件权限
我正在编写内核模块(Linux 中的 C),我想更改其中其他文件的权限。任何解决方案?因为我在内核中,所以我不能使用 chmod syscall 并且......感谢您的帮助
这是我的 Makefile:
这是我的代码:
制作时会发出警告:
WARNING: "sys_chmod" [file] undefiened
并且在使用“sudo insmod”加载模块时会出现以下错误:
Unknown sybol in module
似乎这个错误尤其发生在内核模块中。任何的想法?再次感谢!
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可能已经过时了。任何人都可以验证这一点吗?
linux-kernel - 从内核空间访问用户空间 - get_user_pages
我想将用户空间内存中的指针传递到内核模块中的函数中。我不想使用copy_from_user
. 我读过我应该使用get_user_pages
函数。
例如一页。
uaddr
是用户空间中的地址。
- 这样做之后,我可以转换并传递
uaddr
给我的内核模块函数吗?或者也许我必须以struct pages
某种方式使用这些? - 为什么我必须使用向下/向上读取?
- 毕竟我必须使用
SetPageDirty()
和page_cache_release()
功能?
linux - 如何使用 depmod 使一个 Linux 内核模块依赖于另一个外部模块?
我正在编写一个依赖于一个现有内核模块的内核模块。我正在从树中构建我的模块(作为外部模块)。
如何声明依赖项,以便 depmod 识别它?