通过内核模块轮询循环设备

我试图读取我通过内核模块在200ms内创build的回送设备,但是当我尝试插入内核时,它正在崩溃内核。

我认为我的阅读模块有问题,但它没有定时器正常工作。

我是内核编程新手,请帮忙。 预先感谢您:D

#include <linux/kernel.h> #include <linux/module.h> #include <linux/timer.h> #include<linux/fs.h> #include <linux/init.h> #include <asm/segment.h> #include <asm/uaccess.h> #include <linux/buffer_head.h> static struct timer_list my_timer; static void read_file(char *filename) { struct file *fd; char buf[1]; unsigned long long offset=0; mm_segment_t old_fs = get_fs(); set_fs(KERNEL_DS); fd = filp_open(filename, O_RDONLY, 0); if (fd >= 0) { printk(KERN_DEBUG); while (vfs_read(fd, buf, 1,&offset) == 1) { if((0 <= buf[0]) && (buf[0] <=255)) printk("%c", buf[0]); } printk(KERN_ALERT "Loop Ran\n"); filp_close(fd,NULL); } set_fs(old_fs); } void my_timer_callback( unsigned long data ) { int ret; printk( "my_timer_callback called (%ld).\n", jiffies ); printk( "Starting timer to fire in 200ms (%ld)\n", jiffies ); read_file("/dev/loop0"); ret = mod_timer( &my_timer, jiffies + msecs_to_jiffies(3000) ); if(ret) printk("Error in mod_timer\n"); } int init_module( void ) { int ret; printk("Timer module installing\n"); setup_timer( &my_timer, my_timer_callback, 0 ); printk( "Starting timer to fire in 200ms (%ld)\n", jiffies ); ret = mod_timer( &my_timer, jiffies + msecs_to_jiffies(200) ); if(ret) printk("Error in mod_timer\n"); return 0; } void cleanup_module( void ) { int ret; ret = del_timer( &my_timer ); if(ret) printk("The timer is still in use...\n"); printk("Timer module uninstalling\n"); return; }`enter code here` MODULE_LICENSE("GPL"); 

我的文件:

 obj-m := timer2.o all: make -C /lib/modules/$(shell uname -r)/build M=$(PWD) modules clean: make -C /lib/modules/$(shell uname -r)/build M=$(PWD) clean 

Solutions Collecting From Web of "通过内核模块轮询循环设备"

读取文件相当复杂,因为有很多角落案件需要处理。 (如果虚拟机映射需要扩展呢?如果在等待磁盘的时候需要挂起线程呢?等等)

这篇文章谈论你应该做什么,而不是: http : //www.linuxjournal.com/article/8110

不幸的是,这篇文章给出了一些示例代码来解决给人们带来希望的问题。 但是示例代码只能在“用户进程调用内核”的上下文中工作。 在这种情况下,内核可以重新使用当前的用户进程上下文,但这是一种破解。

在一般情况下(中断,定时器,刻蚀),你不能只是“随意的用户上下文”,因为这会导致大量的问题。

相反,您应该创建一个用户空间进程,将内核所需的数据交给内核。

内核定时器函数应该是原子的。 文件操作需要一个流程上下文。 您的崩溃是由于读取操作中存在文件操作。

Linux设备驱动程序 – 第7章应该让你继续核心计时器。