Articles of kernel module

是否有可能写一个字符驱动程序而不使用file_operations结构?

我不知道是否有一种方法来写入字符驱动程序,而不使用file_operations结构中提供的任何函数。 我对Linux设备驱动程序非常陌生 ,任何新手都会这样做,我开始阅读LDD3书籍。 我成功地写了一个简单的字符驱动程序。 include<linux/module.h> #include<linux/kernel.h> #include<linux/fs.h> #include<linux/cdev.h> #include<linux/semaphore.h> #include<linux/uaccess.h> int chardev_init(void); void chardev_exit(void); static int device_open(struct inode *, struct file *); static int device_close(struct inode *, struct file *); static ssize_t device_read(struct file *, char *, size_t , loff_t *); static ssize_t device_write(struct file *, const char *, size_t, loff_t *); static loff_t device_lseek(struct […]

使用自定义系统调用编译Linux内核模块时出错

我会一步一步的引导你 首先我编辑我的Linux内核目录中的3个文件 打开LINUX_DIRECTORY/arch/x86/syscalls/syscall_64.tbl并添加我正在执行的自定义调用 – 使用适当的格式 在这里声明它们: LINUX_DIRECTORY/include/linux/syscalls.h – 使用适当的格式: 打开LINUX_DIRECTORY/Makefile并将我正在存储新系统调用的目录添加到core-y行: core-y:= usr / my_system_call_directory / 这是我遇到的问题。 在LINUX_DIRECTORY/my_system_call_directory里面,我添加一个C文件,包含我自定义的系统调用定义和相应的Makefile 。 我把定义保留为空,因为在我的内核模块的C文件中,我声明了一个extern函数(我的自定义系统调用)并定义了一个单独的函数,它被设置为我的extern函数: extern long (*start_shuttle)(void); long my_start_shuttle(void) { // stuff here } int init_module(void) { // stuff here start_shuttle = my_start_shuttle; // more stuff } 重新编译内核后,我尝试make内核模块,并得到一个no definition for start_shuttle错误。 这是因为我把my_system_call_directory start_shuttle定义留空了吗? 它应该与我在内核模块中定义的my_start_shuttle完全匹配,还是应该添加一些特殊的东西? 我提前问了一些愚蠢的问题,因为我的机器花了这么长的时间来重新编译Linux,我不确定要改变什么。 谢谢

从<linux / proc_fs.h>中缺lessUbuntu proc_root_driver

我正在尝试在Ubuntu 10.04中编译内核2.6.35-22的内核模块,并且抱怨proc_root_driver丢失。 我做了一些search,我发现这应该定义这个,但在我的版本的Linux头,它没有定义。 是否有另一个全局variables,我应该使用它的位置,还是有一种方法,我可以在某个地方定义它的内核模块可以编译?

如何从linux内核生成稳定的37kHz GPIO触发器?

目前我有一个微控制器负责处理红外TX载波的产生,但是我开始想知道是否可以处理它,并在Linux端做这个工作 – 这样就降低了embedded式系统的成本。 我在飞思卡尔i.mx233(454MHz ARM9)上运行,如果我通过/dev/mem直接访问registry,我可以实现相当稳定的5MHz触发GPIO引脚。 由于我需要37kHz,我开始寻找放慢速度的方法,但是至less对于这个目的, nanowait()似乎太粗糙了。 我find了一个在rand循环中调用rand()的解决scheme,我似乎可以很好地生成38.4kHz的信号,但是根据示波器,有时会出现一些不可接受的抖动。 (据我所知,这样做对于资源来说是相当浪费的,但是当TX需要完成的时候,系统并没有真正的其他任务) 我的问题:Freescales内核代码(3.8分支)没有CONFIG_PREEMPT_RT补丁,所以这也许是我应该考虑的一件事,但在此之前: 我可以通过编写一个内核模块来从内核驱动GPIO来实现更精确的性能吗? 我需要从用户空间(要发送的数据)读取一些数据,但除此之外,我只需要在GPIO末尾以指定的频率触发LED,所以驱动程序应该非常简单。 我可以强制我的驱动程序的优先级,以便其他任务不会中断这个GPIO触发? (数据发送目前大约需要400ms,而且很less完成) 有没有更好的方法来创build每37kHz的中断,这样我就不会通过软件停止系统? 微控制器是完成这种任务,但如果可能的话,这将是很好的避免这种成本开销…

用“dev_groups”replace弃用的“dev_attrs”属性

我试图编译一个Linux设备驱动程序(内核模块),然而这个模块最后在​​2013年4月更新,当然它不会在最近的(3.13)内核上编译,这里是错误: als_sys.c:99:2: error: unknown field 'dev_attrs' specified in initializer 我已经search了,但是我发现的所有东西都是补丁,关于更新旧模块没有明确的“教程”,我唯一明白的是我需要使用dev_groups ,但是它不接受相同的值dev_attrs和我不知道如何适应现有的代码。 代码(其中的一些代码可以在这里find): # als_sys.c static ssize_t illuminance_show(struct device *dev, struct device_attribute *attr, char *buf) { struct als_device *als = to_als_device(dev); int illuminance; int result; result = als->ops->get_illuminance(als, &illuminance); if (result) return result; if (!illuminance) return sprintf(buf, "0\n"); else if (illuminance == -1) return sprintf(buf, "-1\n"); […]

sk_buff copy&sk_buff克隆

即时为Linux内核写一个模块,它试图窃取数据包及其相关的sk_buff 。 这样做我想要使用struct sk_buff *skb_copy(const struct sk_buff *skb, gfp_t gfp_mask)然后传递返回types到内核,因为数据包被丢弃 。 所以当内核获取有关数据包丢弃的信息时,尝试释放sk_buff。 在这里,我的问题是否会影响我刚刚复制的skb及其包含的数据? 或者现在我可以玩我的新sk_buff? 或者是否有可能使用skb_clone() &使用分组数据部分而不删除旧的sk_buff引用的数据,因为它将减less数据包的复制成本。

Linux内核模块 – 打开创build的字符设备导致一个错误

我刚开始阅读Ldd3,试图实现一个简单的模块,或多或less地遵循书中的例子。 模块向内核添加了自定义的fops(空函数)的字符设备。 模块加载没有问题,但是当我尝试打开设备时,进程被杀死,dmesg打印出debugging信息。 我的内核是4.8.0。 X86-64。 这是我的代码 #include <linux/init.h> #include <linux/module.h> #include <linux/types.h> // for dev_t #include <linux/kdev_t.h> // for MAJOR, MINOR macros etc.. #include <linux/fs.h> // for alloc_chrdev_region etc .. #include <linux/cdev.h> // to register char devic MODULE_LICENSE("Dual BSD/GPL"); dev_t hello_num; struct cdev *my_cdev; loff_t hello_llseek(struct file *filepo, loff_t offset, int a){ return 0; } […]

在内核模块中实现CPU扩展

我正在查找有关在内核模块中实现某些CPU扩展的信息。 我发现了一些相关的东西: http : //www.mirrors.docunext.com/lxr/http/source/arch/mips/kernel/unaligned.c实际上,这是唯一的源代码,我可以find,甚至是接近。 基本上,我有一个二进制只有共享对象与某些CPU扩展,我需要运行在一个稍微老的CPU,其中大部分的指令集,但不是花哨的新东西。 是的,我知道这样会比较慢,但是比用SIGILL碰撞要好。

内核模块函数未定义

基本上,我的操作系统类,我正在写一个内核模块,模拟5个terminal的机场接送。 到目前为止,我已经能够实现系统调用并validation它们是否正常工作。 但是,我试图将这些系统调用链接到一个模块。 对于每个内核存根和function,当我尝试使模块插入,它说它是未定义的。 另外,作为一个产品,当我运行这个命令时,模块不会插入: make; sudo insmod terminal.ko 由于模块中的未知符号,这是一个错误,我发现很less或没有文档上的make; sudo insmod terminal.ko 。 下面是我尝试制作和插入时的输出: make -C /lib/modules/`uname -r`/build/ M=`pwd` modules make[1]: Entering directory `/home/taylor/OPSYS_P2/linux-3.16.4' Building modules, stage 2. MODPOST 1 modules WARNING: "STUB_issue_request" [/home/taylor/OPSYS_P2/linux-3.16.4/opsyscall/module/terminal.ko] undefined! WARNING: "issue_request" [/home/taylor/OPSYS_P2/linux-3.16.4/opsyscall/module/terminal.ko] undefined! WARNING: "STUB_stop_shuttle" [/home/taylor/OPSYS_P2/linux-3.16.4/opsyscall/module/terminal.ko] undefined! WARNING: "stop_shuttle" [/home/taylor/OPSYS_P2/linux-3.16.4/opsyscall/module/terminal.ko] undefined! WARNING: "STUB_start_shuttle" [/home/taylor/OPSYS_P2/linux-3.16.4/opsyscall/module/terminal.ko] undefined! WARNING: "start_shuttle" [/home/taylor/OPSYS_P2/linux-3.16.4/opsyscall/module/terminal.ko] […]

找不到模块:modprobe

我编写了一个简单的hello world内核模块,编译并安装在/lib/modules/kernel_version/extra/ path中。 随着insmod它得到正确加载,但与modprobe我得到一个错误 modprobe: FATAL: Module hello_world.ko not found. 我已经安装了所有的必要条件。 这里是Makefile来编译和安装: make -C /lib/modules/$(shell uname -r)/build M=$(PWD) modules make -C /lib/modules/$(shell uname -r)/build M=$(PWD) modules_install 请告诉我如何完成。 提前致谢。