我看到一个怪异的,我不明白在我的代码的输出。 我有一个头文件中定义的结构。 我在用户空间填充一个结构,然后通过ioctl发送给一个内核模块。 内核模块应该从用户复制它,然后报告用户存储的值。 该结构被定义为: typedef struct Command_par { int cmd; /**< special driver command */ int target; /**< special configuration target */ unsigned long val1; /**< 1. parameter for the target */ unsigned long val2; /**< 2. parameter for the target */ int error; /**< return value */ unsigned long retval; /**< return value […]
我劫持__NR_read ( sys_read调用),每当我用我自己的系统调用劫持原始系统调用时,它会导致崩溃(在所有打开的KDE“konsoles”中)(即,只要我劫持sys_open )。 我想知道这是否是我的代码中的错误(可能),或者是因为别的原因而发生的。 我的问题是:如果崩溃是由于我的代码造成的,究竟是什么原因造成的,以及如何(如果可能)我可以修复它? 如果崩溃不是由我的代码造成的,是什么原因造成的? 我的代码在这里: https : //github.com/alexandernst/procmon/tree/master/procmon_kmodule syshijack.c是我得到syscall表的地方, hookfns.c是我劫持系统调用的地方。 PS:在这之前我已经问过这个问题了,但是它现在已经改变了,因为一旦我劫持了系统调用,崩溃就发生了。 *编辑* 我认为这个错误是来自钩子/解除钩子调用,所以我创build了一个问题https://github.com/alexandernst/procmon/issues/7不pipe怎样,我看不到是什么导致崩溃/冻结。
我必须编写LKM,拦截一些系统调用。 解决scheme是: 查找sys_call_table符号的地址,检查地址是否正确(例如检查sys_call_table [__ NR_close]指向sys_close的地址) 禁用中断 禁用CR0中的WP位 将sys_call_table [__ NR_close]更改为我自己的函数 启用WP位 启用中断。 加载模块正常工作。 但是,模块的安全卸载呢? 考虑当我将sys_call_table恢复到原始状态并卸载模块时的情况 – 如果内核仍然在其他CPU上的其他进程的系统调用的上下文中执行代码,该怎么办? 我将在内核模式下得到页面错误(因为模块代码段的页面不可用,因为模块被卸载)。 共享资源是sys_call_table中的条目。 如果我可以访问这个由锁保护的条目 – 那么我可以安全地卸载我的模块。 但是,由于内核系统调用处理程序没有任何这种锁(egarch / x86 / kernel / entry_32.S) – 这意味着没有安全的方式卸载我的模块? 这是真的吗? UPDATE1 我需要从2.4内核版本开始,获取旧内核(fanotify(2)不可用)的文件访问信息。 我需要这些信息来执行通过防病毒引擎的访问扫描。
我已经replace了系统调用表中的sys_open系统调用来实现统计系统。 我必须使用什么锁? spin_lock_irqsave()函数冻结了系统。 我在Linux 3.16.0-4-686-pae上使用Intel Core i3-4330。 部分但相关的代码: static DEFINE_SPINLOCK(spin); static int tally = 0; static asmlinkage long my_sys_open(const char __user *filename, int flags, int mode) { unsigned long fl; spin_lock_irqsave(&spin, fl); // system freeze tally++; spin_unlock_irqrestore(&spin, fl); printk("sys_open used %i times\n", tally); return old_sys_open(filename, flags, mode); }
我想以非交互方式运行“make localmodconfig”。 尝试时 是“”| 使localmodconfig 给出了以下错误: Console input/output is redirected. Run 'make oldconfig' to update configuration. make[1]: *** [scripts/kconfig/Makefile:45: localmodconfig] Error 1 make: *** [Makefile:547: localmodconfig] Error 2 我更喜欢localmodconfig而不是olddefconfig,因为旧的内核有3000多个模块,只使用了30个模块。 任何想法如何实现这一目标?
如果我的电脑有两个内核–CPU0和CPU1,CPU0的IRQ被禁用(local_irq_disabled())。 如何在CPU1上使用进程来启用CPU0的IRQ?
众所周知,netlink是用户/内核空间的通讯机制。 我想从我的内核模块通信到另一个。 另一个内核模块已经有了netlink接口。 是否有可能从内核模块连接到netlink,就像我们在用户空间中做的那样?
如何获得一个kobject,比如/sys/devices的path,用作你自己的sysfs条目的父kobject?
我有一个需要识别IP数据包(即IPv4或IPv6)的IP地址族。 在设法使用libnetfilter捕获数据包并获取源和目标IP地址。 但是现在我需要从我正在实现的kernel module识别出获得的IP地址地址族。 IP地址存储如下, struct iphdr *ip_header = (struct iphdr *)skb_network_header(skb); unsigned int src_ip = (unsigned int)ip_header->saddr; unsigned int dest_ip = (unsigned int)ip_header->daddr; 在我的研究过程中,我发现如何执行这个function,我只发现如何使用%pI4和%pI6格式化并显示为string。 而不是如何以编程方式识别IP地址族。 (可能像Linux内核模块相当于functionIPAddress.AddressFamily ) 如果你们的专家能帮我解决这个问题,我会被困在里面好几天,我会很感激的。 提前致谢 :) 编辑 有了@alk的build议,如果你的专家能够build议我改变上面提到的unsigned intvariables声明来支持IPv6,我将非常感激。 🙂
在探索netfilterfunction时,我尝试编写一个简单的netfilter模块并注册一个钩子,如下所示: dhcp_nfho.owner = THIS_MODULE; dhcp_nfho.hook = dhcp_hook_function; dhcp_nfho.hooknum = NF_INET_POST_ROUTING; dhcp_nfho.priority = NF_IP_PRI_FIRST; dhcp_nfho.pf = PF_INET; // not on bridge interface nf_register_hook(&dhcp_nfho); 我在LXR页面查看了nf_register_hook的代码:(3.13版本) int nf_register_hook(struct nf_hook_ops *reg) 69 { 70 struct nf_hook_ops *elem; 71 int err; 72 73 err = mutex_lock_interruptible(&nf_hook_mutex); 74 if (err < 0) 75 return err; 76 list_for_each_entry(elem, &nf_hooks[reg->pf][reg->hooknum], list) { 77 […]