驅動載入到proc檔案下

迷霧綠洲發表於2014-10-25

kernel的除錯方法一般常用的有jtag  ,printk,proc,sys ,debugfile..   關於這些的對比準備專門寫一個,這裡就主要介紹proc的除錯方法。

  /proc檔案系統是一種特殊的,由軟體建立的檔案系統,核心使用它向外界匯出資訊。 /proc下面的每個檔案都繫結一個核心函式,使用者讀取其中的檔案時,該函式動態的生成檔案的“內容”。
   這樣其實是給了我們一個函式的介面,在這個介面我們可以呼叫底層我們自己寫的驅動函式,可以在其中加入自己想的列印什麼的。有了這個介面我們就可以將驅動執行產生的中間值,區域性變數輸出出來供debug實用。他的缺點也很明顯 已存在大量檔案,不能呼叫太大的檔案列印 函式必須已經寫入到要除錯的驅動中去。對比與產生的哈出這些缺點他的除錯方法還是又存在的價值的。畢竟提供了一個上下層聯絡的介面。

proc 自己定義了讀寫函式,定義了註冊函式,這些都是全域性的。

int (*read_proc)(char *page, char **start, off_t offset, int count,
                    int *eof, void *data);
   引數說明:
   page : 用來寫入資料的緩衝區;也就是說從/proc檔案中讀到的資料都寫入到page指向的緩衝區中.
   start: 用於指定實際的資料寫入到page指向的記憶體頁的具體的那個位置.
   offset : 和read引數中的相同 
   count  : 和read函式中的引數意義相同
   eof  : 當沒有資料返回時,必須設定該引數為一個整數,例如: *eof = 1;
   data : 該引數是核心提供給驅動程式的專用指標,可以用於內部記錄

   *建立只讀/proc檔案的函式
   struct proc_dir_entry *create_proc_read_entry(const char *name,
                           mode_t mode, struct proc_dir_entry *base, 
                           read_proc_t *read_proc, void * data)
   引數說明:
   name : 要建立的/proc下的檔名
   mode : 建立的檔案許可權的掩碼,若為0,則使用系統預設的許可權
   base : 該檔案所在的父目錄,若該引數為null,則該檔案將會被建立在/proc的根目錄下
   read_proc : 讀取/proc下的檔案時呼叫的函式,也就是前面講解的那個函式
   data : 核心會忽略data,但會把該引數傳遞給read_proc函式

   刪除/proc系統檔案的函式
   void remove_proc_entry(const char *name, struct proc_dir_entry *parent)
   引數說明:
   name : 在/proc檔案系統中建立的檔名
   parent : 父目錄名

參照上面的介紹我們就可以看是我們創造自己的proc/proc_test了

// test proc
#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/proc_fs.h>

int proc_read_memory_drv(char *page, char **start, off_t off, int count,
int *eof, void *data);
void memory_drv_exit(void);
int memory_drv_init(void);
module_init(memory_drv_init);
module_exit(memory_drv_exit);
struct proc_dir_entry *memory_drv_file;

int proc_read_memory_drv(char *page, char **start, off_t off, int count,
int *eof, void *data)
    {
        int len;
        len = sprintf(page, "test ok");
        return len;
    }

    int memory_drv_init(void)
    {
    memory_drv_file = create_proc_entry("proc_test", S_IRUGO, NULL);
        memory_drv_file->read_proc = proc_read_memory_drv;

        return 0;
    }

    void memory_drv_exit(void)
    {
        remove_proc_entry("proc_test", NULL);
    }


 這樣我們就完成了proc/proc_test 檔案的建立

這樣我們就可以把它加在我們想除錯的驅動檔案裡面了

然後進入rootfs

進入proc

cd proc

列出檔案

ll

可以看到proc_test

cat proc_test  

就可以顯示出來了我們列印的內容

test ok



  

相關文章