Linux内核模块开发(笔记)(3)

发表于:2013-10-14来源:IT博客大学习作者:扶凯点击数: 标签:linux
例如 读 cat /proc/cpuinfo 写 echo fukei-name /proc/sys/kernel/hostname proc 的功能实现 proc 在 c 中是一个结构体来实现的,是 struct proc_dir_entry 。它可以给读写绑定到特

  例如

  读

cat /proc/cpuinfo

  写

echo fukei-name > /proc/sys/kernel/hostname

  proc 的功能实现

  proc 在 c 中是一个结构体来实现的,是 struct proc_dir_entry 。它可以给读写绑定到特定的函数上。然后通过别人对 proc 中文件的操作来触发和回调相应的绑定的函数。

  read_proc 和 write_proc 是这个结构体的成员,也是一种结构体。函数就注册在这个上面。有兴趣的同学可以看看 include/linux/proc_fs.h 中的 read_proc_t 和 write_proc_t 的定义。

  实现起来也简单。

struct proc_dir_entry *proc_entry = create_proc_entery(....);
int my_read_proc()
{
}
proc_entry->read_proc = my_read_proc();

  在这的 create_proc_entery 会返回一个 proc_dir_entry 的结构体的引用。失败就是 NULL 。

  这样,当用户空间进行 read 的系统调用时,如使用 cat proc 中的内容时。内核会调用注册到 read_proc 上的这个 my_read_proc 来实现的.

#include <linux/module.h>
#include <linux/proc_fs.h>
#include <linux/sched.h>
#include <linux/mm.h>
 
#define MODULE_NAME "Memory"
 
int my_read_proc(char *page,char **start, off_t off,int count,  int *eof,void *data)
{
        struct task_struct *tsk = current;
        int len;
        len = sprintf( page, "This module info: task %s pid %d\n",tsk->comm, tsk->pid );
        return  len;
}
 
struct proc_dir_entry *proc_entry;
int init_module(void)
{
        proc_entry = create_proc_entry(MODULE_NAME, 0644, NULL);
        if (proc_entry==NULL){
                remove_proc_entry(MODULE_NAME, NULL);
        }
        proc_entry->read_proc = my_read_proc;
        return  0;
}
 
void cleanup_module(void)
{
        remove_proc_entry(MODULE_NAME, NULL); // 退出和出错记的删除
}
 
MODULE_LICENSE("GPL");

原文转自:http://blogread.cn/it/article/4630