커널 모듈을 통해 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");
내 만들기 파일 :
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
http://www.linuxjournal.com/article/8110 – BraveNewCurrency
@BraveNewCurrency 타이머가 없으면 읽기가 제대로 작동하므로 읽는 모듈이 Interupt Service Routine으로 작동하고 ISR이 너무 큰 문제가 있다고 생각합니다. –
도와 드릴까요? –