我刚刚开始学习在 linux 内核 2.6 上制作内核模块的技巧。我想要做的是有 3 个内核线程,称为从线程,需要将数据发送到第 4 个内核线程,称为主线程,并接收它们各自的响应。slaves 可以随时请求,这意味着我需要某种队列结构和一种将响应重定向到正确线程的方法。
首先,我着眼于实现我自己的队列结构来对传入的请求进行排队 - 但我如何向主人发出信号?我不希望主人继续轮询(如自旋锁/信号量的情况)。我有一种感觉,在线程之间有更好的通信方式。
由于缺乏文档(以及公认的较差的搜索技能),我对如何实现这一点感到茫然。你能为我指出正确的方向吗?
我目前正在编写一个 Linux 内核模块,并且在实现它与用户空间程序的通信时遇到了问题。
该内核模块需要接收用户空间程序下发的任务,完成后将结果发送回用户空间程序。当内核模块执行其工作时,应该阻止用户空间程序。
我认为内核用户空间 IPC 或 Unix 套接字会很不错,但我没有运气找到谷歌的例子。
目前我丑陋的解决方案是导出一个chardev并让用户空间程序将请求写入设备文件,并从中读取结果。但是每次open()调用我只能发出一个请求,这会导致新的问题。我真的需要一个 IPC 或类似套接字的东西。谢谢!
众所周知,netlink 是用户/内核空间通信机制。
我想从我的内核模块通信到另一个。另一个内核模块已经有了 netlink 接口。
是否可以像我们在用户空间那样从内核模块连接到 netlink?
我需要确定内核模块中正在运行的 Linux 内核的堆栈大小。我知道宏 THREAD_SIZE 给出了给定架构的堆栈大小,但我不能使用它。由于编译和运行机器是不同的。有什么办法可以通过 proc 接口、内核 api 或导出的符号来做到这一点?谢谢
我正在编写一个创建 IP 数据包的内核模块。现在我想发送这个数据包,但还没有为它的传输创建任何套接字。
有什么方法可以在内核例程的帮助下直接发送它。
因为我已经跟踪了用于数据包传输的 linux 内核代码,所以在net/core/dev.c 中定义了一个名为dev_hard_start_xmit()的函数 。我们可以使用它吗?
其实我不想使用套接字。
我已经做了一个新的 Linux TCP cong 算法实现,并且在这段代码中有一些静态变量,现在我希望它们通过使用一些配置方法是动态的。
根据我在内核级编程中的理解,我们无法加载一些文本文件并将值放在那里并通过程序读取它..
但我需要其他东西来使这些值动态化,以便用户每次更改值时都可以更改它们而无需编译内核代码。
我听说过可以帮助我们的 proc 条目,但我不确定这是否是正确的方法。不确定 ioctl() 是否也能提供帮助。?
有人可以给出一些关于如何使这些变量动态化的想法,以便我们即时更改它们并设置值。
我是模块编程的新手,我需要进行系统调用以检索系统进程并显示他们消耗了多少CPU.
我该如何打电话?
我一直在学习内核编程并接受Eudyptula挑战,任务5要求我修改一个早期任务的hello world模块,以便在插入USB键盘时自动加载,并在拔下键盘时卸载.
现在,为了它,我不会在这里发布我的代码,因为这对于这项任务来说将是一个巨大的破坏者,并会破坏其他人的乐趣.基本上,它的作用是:
struct usb_device_id数组,其中包含一个将我的模块绑定到任何USB键盘的条目struct usb_driver并初始化正确的字段; 特别是,它引用了我之前创建的usb设备id表数组MODULE_DEVICE_TABLE来注册驱动程序.注册/取消注册例程正在运行.当我手动加载和卸载模块时,我得到了预期的调试消息.
我将模块复制到/lib/modules/$(uname -r)并运行depmod -a.该模块被添加到modules.alias和modules.dep,但是当我插入/拔出键盘没有任何反应.
进一步的研究表明,我应该有一个modules.usbmap文件,由depmod内核保存设备和驱动程序之间的映射来加载.我的文件夹树中的任何地方都没有此文件.我也没有modules.pcimap.我检查了内核配置以确保启用了可加载模块支持,以及热插拔支持 - 它们是.
这是Kubuntu 14.04,带有自编译的3.16.0-rc5内核.我错过了什么?我已经完成了内核配置并检查了最明显的选项.我有点被困在这里.有任何想法吗?
是否有可能在执行新流程,关闭流程以及状态发生变化(即停止,分页等)时收到通知(通过回调或类似方式)?在user-land中,在/ proc上设置目录监听器会很容易.
以下是什么意思(OE+)?
$ sudo cat /proc/modules | grep hello //hello_world is a kernel module created by me.
hello_world 20480 1 - Loading 0xffffffffc0221000 (OE+)
Run Code Online (Sandbox Code Playgroud)
这是我的情况.
我修补了Linux内核函数load_module(),它被调用finit_module(),用于insmod插入内核模块的系统调用.修补程序查找由我(已调用hello_world)安装创建的特定模块,当它执行时,它会阻止调用do_init_module(),而是返回0.do_init_call()负责调用模块的init功能,并将模块状态设置为live(MODULE_STATE_LIVE).
当我读到时/proc/modules,模块状态是Loading,这是预期的.但是我不明白(OE+)输出结尾的含义.这不会显示在任何其他模块上,如以下命令所验证.
$ sudo cat /proc/modules | grep OE
hello_world 20480 1 - Loading 0xffffffffc0221000 (OE+)
Run Code Online (Sandbox Code Playgroud)
我正在使用Linux内核v4.7.3.
更新
所有这些都发生在Qemu虚拟机中.在正在运行的主机上Linux 4.4.0-36-generic (Ubuntu),我得到以下内容.
$ sudo cat /proc/modules | grep OE …Run Code Online (Sandbox Code Playgroud) kernel-module ×10
linux-kernel ×9
c ×4
linux ×4
ipc ×2
sockets ×2
kernel ×1
netlink ×1
process ×1
system-calls ×1