我刚刚开始学习在 linux 内核 2.6 上制作内核模块的技巧。我想要做的是有 3 个内核线程,称为从线程,需要将数据发送到第 4 个内核线程,称为主线程,并接收它们各自的响应。slaves 可以随时请求,这意味着我需要某种队列结构和一种将响应重定向到正确线程的方法。
首先,我着眼于实现我自己的队列结构来对传入的请求进行排队 - 但我如何向主人发出信号?我不希望主人继续轮询(如自旋锁/信号量的情况)。我有一种感觉,在线程之间有更好的通信方式。
由于缺乏文档(以及公认的较差的搜索技能),我对如何实现这一点感到茫然。你能为我指出正确的方向吗?
我目前正在编写一个 Linux 内核模块,并且在实现它与用户空间程序的通信时遇到了问题。
该内核模块需要接收用户空间程序下发的任务,完成后将结果发送回用户空间程序。当内核模块执行其工作时,应该阻止用户空间程序。
我认为内核用户空间 IPC 或 Unix 套接字会很不错,但我没有运气找到谷歌的例子。
目前我丑陋的解决方案是导出一个chardev并让用户空间程序将请求写入设备文件,并从中读取结果。但是每次open()调用我只能发出一个请求,这会导致新的问题。我真的需要一个 IPC 或类似套接字的东西。谢谢!
众所周知,netlink 是用户/内核空间通信机制。
我想从我的内核模块通信到另一个。另一个内核模块已经有了 netlink 接口。
是否可以像我们在用户空间那样从内核模块连接到 netlink?
我试图在内核空间的数据包上附加一些数据.我有一个echo客户端和服务器.我输入命令行,如:./client"message",服务器只是回复它.服务器使用./server运行.
现在,客户端和服务器位于两台不同的计算机上(可能是VM).我正在编写一个在客户机上运行的内核模块.它的工作是在数据包离开机器时在"消息"之后附加"12345".我将在下面介绍代码.
/*
* This is ibss_obsf_cat.c
*/
#include <linux/module.h>
#include <linux/moduleparam.h>
#include <linux/kernel.h>
#include <linux/netfilter.h>
#include <linux/skbuff.h>
#include <linux/netdevice.h>
#include <linux/udp.h>
#include <linux/ip.h>
#undef __KERNEL__
#include <linux/netfilter_ipv4.h>
#define __KERNEL__
/*
* Function prototypes ...
*/
static unsigned int cat_obsf_begin (unsigned int hooknum,
struct sk_buff *skb,
const struct net_device *in,
const struct net_device *out,
int (*okfn)(struct sk_buff *));
static void hex_dump (char str[], int len)
{
}
/*
* struct nf_hook_ops instance initialization
*/
static struct nf_hook_ops cat_obsf_ops __read_mostly = …Run Code Online (Sandbox Code Playgroud) 我使用getnstimeofday的console_unlock功能,它被初始化过程中很早就叫.如此早,即使计时也不会被初始化以便使用getnstimeofday.
有没有办法确定开始使用的精确时刻getnstimeofday.我的意思是,是否有任何全局变量或任何宏来检查计时是否已初始化,以便我可以开始使用getnstimeofday.
我是模块编程的新手,我需要进行系统调用以检索系统进程并显示他们消耗了多少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上设置目录监听器会很容易.
我在内核模块中有两个位置(Linux 3.13):
module_init我的代码是启用硬件性能计数器.当我把它module_init,代码工作正常.但是当我把它放到第二位时(通过运行带有无效操作码的指令触发),代码会permission denied出错(即错误:) -13.
由于这两个地方都在一个内核模块中,"即使在内核空间中,也有不同的权限?"
更新:值得一提的是,当我root在用户空间中运行无效操作码时,-13错误消失了; 否则,它会...
我推测"指令执行的特权决定了它的中断处理程序的执行."
以下是什么意思(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 ×7
linux ×5
c ×3
ipc ×2
kernel ×2
netfilter ×1
netlink ×1
privileges ×1
process ×1
sockets ×1
system-calls ×1
timer ×1