【linux – 如何在内核模块中使用proc_pid_cmdline】教程文章相关的互联网学习教程文章

linux-如何在内核模块中将网络接口设置为混杂模式?【代码】

我开发了一个内核模块来获取所有绕过和以太网接口的数据包. 现在我要在我的模块中将该接口设置为混杂模式.我该怎么做? 我使用dev_get_by_name(& init_net,“ eth0”)到结构net_device * dev的接口. 最好的祝福解决方法:您可以使用以下功能(可在net / core / dev.c中找到):int dev_set_promiscuity(struct net_device *dev, int inc)如果要将设备设置为混杂模式,inc必须为1.要取消混杂模式,请将inc设置为-1.为了使该功能正常工作,...

linux-步骤来构建一个内置的内核模块?

我可以构建一个可加载模块,并且该模块可以成功地与应用程序一起使用.现在,我正在尝试将此驱动程序作为内置驱动程序包含在内核驱动程序文件夹中.但是,当我尝试此操作时,在/ dev文件夹中没有创建设备文件.要做此内置模块的必要步骤是什么?现有模块是否需要任何修改? 提前致谢解决方法:我相信您的问题类似于Compiling a driver as a part of a kernel, not as a module问题 该问题的答案提到修改内核Makefile以包括您的模块对象或目...

linux-内核模块中的obj-m变量【代码】

在内核模块中,存在makefile obj-m变量.考虑以下:CUR = $(shell uname -r) DIR = /lib/modules/$(CUR)/build PWD = $(shell pwd) obj-m := m1.o m2.o default: $(MAKE) -C $(DIR) SUBDIRS=$(PWD) modules 在此Makefile中,默认目标包含一个调用内核子make的配方. obj-m变量不会导出到环境,因此sub-make无法使用它.但是,如果我们删除obj-m变量初始化,则此make不会编译m1和m2内核模块.因此,问题是: 在这种情况下,为什么内核子生...

Linux内核:无法使用工作队列加载简单的Linux内核模块【代码】

我在Linux内核模块中使用工作队列时遇到问题.我的模块编译时没有给出任何错误,但是在加载时失败了.我无法加载以下模块并在dmesg中得到以下错误.[root@nanderson test_mod]# insmod workqueue_test.ko insmod: ERROR: could not insert module workqueue_test.ko: Unknown symbol in module [root@nanderson test_mod]# dmesg -c [50404.453417] workqueue_test: Unknown symbol destroy_workqueue (err 0) [50404.453437] workqu...

编译Linux内核模块时未定义的函数【代码】

我正在尝试使用Linux softirq.有一个简单的程序使用linux / interrupt.h中定义的linux系统调用:// // Created by kivi on 24.09.16. //#include <linux/module.h> #include <linux/init.h> #include <linux/interrupt.h> #include <linux/stat.h>#define SHARED_IRQ 17static int irq = SHARED_IRQ, my_dev_id, irq_counter = 0; module_param( irq, int, S_IRUGO );/* The interrupt handler */ static irqreturn_t xxx_interru...

检查Linux内核模块是否正在运行【代码】

我编写了一个内核模块,该模块在/ proc /中创建一个条目并执行其他一些任务.我想修改一个现有的内核模块,以检查我的模块是否正在运行,并根据它执行一些语句(或者在不运行时执行其他语句) 有关如何执行此操作的任何建议?解决方法:kernel / module.c提供的功能可能会满足您的需求;您首先需要锁定module_mutex,然后使用模块名称调用find_module().结果将是指向描述命名模块的struct模块的指针-如果未加载该模块,则为NULL:/* Search ...

使用Linux内核模块发送的UDP数据包不使用套接字【代码】

我正在编写一个创建IP数据包的内核模块.现在,我想发送此数据包,但尚未为其传输创建任何套接字. 有什么方法可以借助内核例程直接发送它. 由于我已经跟踪了Linux内核代码以进行数据包传输,因此在net / core / dev.c中定义了一个名为dev_hard_start_xmit()的函数.我们可以使用吗? 其实我不想使用套接字.解决方法:您不需要套接字就可以在内核中发送UDP数据包,只需分配一个skb,自己构造IP报头和UDP报头,最后通过dev_queue_xmit()将其发...

如何在Linux内核模块中添加定期计时器回调【代码】

这个问题已经在这里有了答案: > How to add a peridic timer callback in a linux kernel module 2个我正在研究一个Linux内核模块,该模块注册一个来自定制板的中断的回调,并将接收到的数据放入char设备接口后面的队列中,以供应用程序处理.即使没有来自板的中断,该模块也需要不断地监视和测量来自板的中断和数据,因此它具有另一个根据时间触发的回调. 当前的实现使用RTC...

如何调试Linux内核模块`init()`中的问题?

我正在使用远程(k)gdb调试模块中的问题,该问题在加载时会引起恐慌,例如调用init()时. 堆栈跟踪仅显示do_one_initcall(mod-> init)导致崩溃.为了将符号文件加载到gdb中,我需要获取模块文本部分的地址,并且要获取,我需要加载模块. 因为busybox(1.16.1)中的insmod不支持-m,所以我坚持使用grep modulename / proc / modules添加nm的偏移量来找出地址. 所以我在这里面临一个鸡和鸡蛋的问题-为了能够调试模块加载,我需要加载模块-但是为了...

安装新内核时如何自动进行Linux内核模块编译?

我正在写一个Linux内核模块.它与所有源文件一起发布(尽管许可证是专有的),可以针对正在运行的内核进行编译.安装我的模块(以.deb软件包分发)时,它将自动编译并安装.这可行. 问题是,在整个Linux系统的常规升级过程中,将安装较新版本的Linux内核.当这样新版本的内核开始运行时,它没有为其编译我的模块,并且我的应用程序失败.我希望在安装新的Linux内核软件包时就可以编译并安装我的模块. 因此,我的问题是:dpkg中是否有一种机制可以在...

如何从用户空间与Linux内核模块通信而不会乱丢/ dev新节点?

从用户空间与内核模块通信的方式有哪些?通过通信,我的意思是在内核模块和用户空间进程之间发送信息和命令. 我目前知道两种方式: >在已发布的设备节点上打开/关闭/读取/写入/ ioctl.>在导出和挂钩/ proc文件上读/写. 更具体地说,有人可以建议与内核模块进行通信的最佳方式,该内核模块实际上并不驱动任何硬件,因此不应该使用仅用于ioctl调用的存根节点乱丢/ dev吗?我主要需要检查其各种状态变量,并向其发送带有请求类型标记的数据...

linux – 类似netfilter的内核模块,用于获取源和目标地址【代码】

我读了this guide写一个内核模块做简单的网络过滤. 首先,我不知道这意味着什么,以及入站和出站数据包(通过传输层)之间的区别是什么?When a packet goes in from wire, it travels from physical layer, datalink layer, network layer upwards, therefore it might not go throughthe functions defined in netfilter for skb_transport_header to work.其次,我讨厌魔术数字,我想用Linux内核的实用程序(source file)中的任何函数替...

如何使用QEMU调试Linux内核模块?

我正在研究修改一些内核网络代码以及包含新内核模块的学术项目. 我正在使用QEMU来加载修改后的内核并进行测试. 但是,我发现某些.img需要一个完整的操作系统来进行调试.没有它可能吗? 或者,哪个是可以与Kernel 2.6 for system一起使用的发行版.除了运行程序的能力,包括网络支持外,发行版不需要任何功能.解决方法:在我看来,最简单的方法是使用buildroothttp://buildroot.uclibc.org/ 克隆它,将其配置为使用您的自定义内核(默认用户空...

如何从linux内核模块写入寄存器(cpu:ARM)【代码】

我试图从linux内核写入系统控制寄存器.但结果是分段错误:Unable to handle kernel paging request at virtual address 20050004内核模块的代码:#define REGBASE 0x20050000void writeRegister(void){__raw_writel( 0x00000002, REGBASE + 0x0004 ); }如何访问系统控制寄存器所在的片上存储器?解决方法:我猜这个REGBASE是一个物理地址而不是虚拟地址.您需要让内核将其映射到地址空间,然后才能使用它.大多数情况下,您使用ioremap映...

# linux 内核学习10-从第一个内核模块开始【代码】

linux 内核学习10-从第一个内核模块开始 1. 准备工作c文件#include <linux/init.h> #include <linux/module.h>// 该内核模块初始化函数 可以通过insmod命令来加载一个内核模块 static int __init my_test_init(void){printk("my first kernel module init\n");return 0; }// 该内核模块退出函数 ,可以使用rmmod命令卸载一个内核模块 static void __exit my_test_exit(void){printk("goodbye\n"); }//内核入口 my_test_init() mo...