iT邦幫忙

DAY 18
0

Linux kernel模組的開發系列 第 18

寫入與讀取 /proc 檔案

上回介紹如何建立並從 /proc 檔案系統中讀取資料,這次來介紹如何寫入到自建的 /proc 檔案中。讀跟寫的基本動作一樣,都是令讀或寫的動作去執行對應的函數。但是因為要寫入的資料是來自 user space,所以重點在於如何讓 user space 的資料進入到 kernel 中。

下面的例子中,create_proc_entry 函數用來建立 /proc/hello 檔案,函數會傳回一個 proc_dir_entry 結構,而讀取與寫入 /proc/hello 的動作則分別定義在 read_proc 與 write_proc 函數中。而在 write_proc 函數中實現將資料從 user space 輸入到 kernel space 的方法就是 copy_from_user 函數。

在 make 完這支程式並 insmod 到 kernel 之後,/proc/hello 就被建立起來,然後再透過 echo 與 cat 動作來測試寫入與讀取的動作,例如:

[root@Pomelo-14-61 LKMP]# insmod procfsrw.ko
[root@Pomelo-14-61 LKMP]# cat /proc/hello

[root@Pomelo-14-61 LKMP]# echo "hello" > /proc/hello
[root@Pomelo-14-61 LKMP]# cat /proc/hello

 hello

[root@Pomelo-14-61 LKMP]#





#include <linux/module.h>
#include <linux/kernel.h>
#include <asm/uaccess.h>
#include <linux/cdev.h>
#include <linux/proc_fs.h>
#define MAX_PROC_SIZE 100
static char proc_data[MAX_PROC_SIZE];

static struct proc_dir_entry *proc_write_entry;

int read_proc(char *buf,char **start,off_t offset,int count,int *eof,void *data )
{
int len=0;
 len = sprintf(buf,"\n %s\n ",proc_data);

return len;
}

int write_proc(struct file *file,const char *buf,int count,void *data )
{

if(count > MAX_PROC_SIZE)
    count = MAX_PROC_SIZE;
if(copy_from_user(proc_data, buf, count))
    return -EFAULT;

return count;
}

void create_new_proc_entry()
{
proc_write_entry = create_proc_entry("hello",0666,NULL);
if(!proc_write_entry)
      {
    printk(KERN_INFO "Error creating proc entry");
    return -ENOMEM;
    }
proc_write_entry->read_proc = read_proc ;
proc_write_entry->write_proc = write_proc;
printk(KERN_INFO "proc initialized");
}

int proc_init (void) {
    create_new_proc_entry();
    return 0;
}

void proc_cleanup(void) {
    printk(KERN_INFO " Inside cleanup_module\n");
    remove_proc_entry("hello",NULL);
}

MODULE_LICENSE("GPL");   
module_init(proc_init);
module_exit(proc_cleanup);
 

上一篇
file_operations 資料結構
下一篇
與設備溝通
系列文
Linux kernel模組的開發30

尚未有邦友留言

立即登入留言