2013-06-30 3 views
0

커널 모듈을 통해 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 
+2

http://www.linuxjournal.com/article/8110 – BraveNewCurrency

+0

@BraveNewCurrency 타이머가 없으면 읽기가 제대로 작동하므로 읽는 모듈이 Interupt Service Routine으로 작동하고 ISR이 너무 큰 문제가 있다고 생각합니다. –

+0

도와 드릴까요? –

답변

0

파일을 읽는 것은 매우 복잡를 처리하기 위해 많은 코너 경우가있다. (무엇 VM 매핑은 스레드를 중단해야하는 경우 디스크를 기다리는 동안 무엇을 확장 할 등이 필요한 경우?) 대신 무엇을해야하는지에 대한

이 문서 회담 : http://www.linuxjournal.com/article/8110

불행하게도, 기사는 사람들에게 희망을주는 문제를 해킹 할 수있는 몇 가지 샘플 코드를 제공합니다. 그러나 샘플 코드는 "커널로 사용자 프로세스 호출"의 컨텍스트에서만 작동합니다. 이 경우 커널은 현재 사용자 프로세스 컨텍스트를 다시 사용할 수 있지만 해킹입니다.

일반적인 경우 (인터럽트, 타이머, 에치)에서는 엄청난 문제로 이어질 수 있기 때문에 "임의 사용자 컨텍스트"를 잡을 수 없습니다.

대신 커널에 필요한 사용자 공간 프로세스를 만들어야합니다.

0

커널 타이머 함수는 원자 적이어야합니다. 파일 조작에는 프로세스 컨텍스트가 필요합니다. 충돌은 사용자가 파일 작업을 읽는 중 발생합니다.

리눅스 장치 드라이버 - 7 장에서는 커널 타이머를 사용할 수 있습니다.

관련 문제