Linux Device Drvier使用flip_open來讀取檔案



這篇文章主要就是寫如何從Linux Device Driver去讀取檔案的範例,
主要是在Linux Device Driver不能夠直接使用C語言內建的FILE的函數,
必須使用kernel內建的函數。然而有些其實我也有不太懂的部份,
大多數都是從網路上找到的範例,然後不小心成功了 XD。希望這篇對需要
的人有所幫助。



Device Driver的內容:test.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
#include   <linux/module.h>
#include  <linux/kernel.h>
#include   <linux/fs.h>   // Needed by filp
#include  <asm/uaccess.h> // Needed by segment descriptors
 
#define DBP(...) \
    printk(KERN_DEBUG __VA_ARGS__);
 
#define FILE_PATH "/tmp/test.txt"
 
#define ROM_SIZE 10
 
static int __init test_init(void)
{
    struct file  *f;
    char buf[ROM_SIZE];
    mm_segment_t fs;
    int i = 0;
 
    DBP("Test: init");
 
    f = filp_open(FILE_PATH, O_RDONLY,0);
 
    if(IS_ERR(f)){
        DBP("Test: filp_open error!!.");
        return -1;
    }else{
            fs = get_fs();
            set_fs(get_ds());
            f->f_op->read(f,buf,ROM_SIZE,&f->f_pos);
            set_fs(fs);
 
            for(i=0;i<ROM_SIZE;i++){
                 DBP("Test: data is %d\n",buf[i]);
            }
    }
 
    filp_close(f,NULL);
        return 0;
}
 
static void __exit test_exit(void)
{
        DBP("Test driver remove successfully\n");
}
 
module_init(test_init);
module_exit(test_exit);
MODULE_DESCRIPTION("Test module");
MODULE_AUTHOR("Carter");
MODULE_LICENSE("GPL");
MODULE_ALIAS("Test: test module");

先在/tmp底下建立test.txt,內容如下:

abcdefghijk

Makefile的內容:


obj-m:= test.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


$> make clean
$> make
就會產生test.ko
$> sudo insmod test.ko

使用lsmod來看看test的module有沒有安裝完成
$> lsmod

Module                  Size  Used by

test                     656  0 

在用dmesg來看看我們的driver有吐出什麼訊息,我這邊只有擷取我要的部份,不然其實他是很多的。
從dmesg來看我們已經可以從Driver去正確的讀取檔案的內容了。
$> dmesg
[30458.291722] Test: init [30458.291733] Test: data is 97 [30458.291734] Test: data is 98 [30458.291735] Test: data is 99 [30458.291735] Test: data is 100 [30458.291736] Test: data is 101 [30458.291737] Test: data is 102 [30458.291738] Test: data is 103 [30458.291739] Test: data is 104 [30458.291743] Test: data is 105 [30458.291743] Test: data is 106




留言

熱門文章