我试图在200ms的时间内读取我通过内核模块创建的环回设备,但是当我尝试插入它时,它正在崩溃内核。
我认为我的阅读模块存在问题,但没有计时器就能正常工作。
我是内核编程的新手,请帮忙。 提前谢谢你: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");
我的Make文件:
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
答案 0 :(得分:0)
读取文件相当复杂,因为有很多极端情况需要处理。 (如果需要扩展VM映射怎么办?如果你必须在等待磁盘时挂起线程怎么办?等等。)
本文将讨论您应该做什么:http://www.linuxjournal.com/article/8110
不幸的是,这篇文章提供了一些针对问题的示例代码,这些代码可以给人们带来希望。但示例代码仅适用于“用户进程调用内核”的上下文。在这种情况下,内核可以重用当前的用户进程上下文,但这是一个黑客。
在一般情况下(中断,定时器,蚀刻),您不能只是“抓住随机用户上下文”,因为这会导致大量问题。
相反,您应该创建一个用户空间进程,为内核提供所需的数据。
答案 1 :(得分:0)
内核定时器函数应该是原子的。文件操作需要进程上下文。您的崩溃是由于您的读取操作中存在文件操作。
Linux设备驱动程序 - 第7章应该让你使用内核定时器。