zoukankan      html  css  js  c++  java
  • ubuntu/linux mint 创建proc文件的三种方法(一)

    在做内核驱动开发的时候。能够使用/proc下的文件,获取对应的信息。以便调试。

    大多数/proc下的文件是仅仅读的。但为了演示样例的完整性。都提供了写方法。


    方法一使用create_proc_entry创建proc文件(简单,但写操作有缓冲区溢出的危急)

    方法二使用proc_create和seq_file创建proc文件(较方法三简洁)

    方法三使用proc_create_data和seq_file创建proc文件(较麻烦。但比較完整)

    演示样例四在proc文件里使用内核链表的一个演示样例(用的方法三)

    --------------------------------------------------------------------------------------------------------------------

    一、

    proc_test01.c 源代码

    #include <linux/module.h>
    #include <linux/sched.h> //jiffies
    #include <linux/proc_fs.h>
    #include <linux/uaccess.h> //copy_to|from_user()
    
    static char *str = NULL;
    
    //proc文件的读函数
    static int my_proc_read(char *page, char **start, off_t off, int count, int *eof, void *data)
    {
    	int ret = 0;
    	ret = sprintf(page, "current kernel time is %ld
    ", jiffies);
    	ret += sprintf(page+ret, "str is %s
    ", str);
    
    	return ret;
    }
    
    //proc文件的写函数
    static int my_proc_write(struct file *filp, const char __user *buf, unsigned long count, void *data)
    {
    	//分配暂时缓冲区
    	char *tmp = kzalloc((count+1), GFP_KERNEL);
    	if (!tmp)
    		return -ENOMEM;
    
    	//将用户态write的字符串复制到内核空间
    	//copy_to|from_user(to,from,cnt)
    	if (copy_from_user(tmp, buf, count)) {
    		kfree(tmp);
    		return -EFAULT;
    	}
    
    	//将str的旧空间释放,然后将tmp赋值给str
    	kfree(str);
    	str = tmp;
    
    	return count;
    }
    
    
    static int __init my_init(void)
    {
    	struct proc_dir_entry *file;
    
    	//创建proc文件
    	file = create_proc_entry("jif", 0666, NULL);
    	if (!file) {
    		printk("Cannot create /proc/jif
    ");
    		return -1;
    	}
    
    	//将创建好的文件和读写函数关联在一起
    	file->read_proc = my_proc_read;
    	file->write_proc = my_proc_write;
    
    	return 0;
    }
    
    static void __exit my_exit(void)
    {
    	//删除proc文件
    	remove_proc_entry("jif", NULL);
    	kfree(str);
    }
    
    module_init(my_init);
    module_exit(my_exit);
    MODULE_AUTHOR("aran");
    MODULE_LICENSE("GPL");

    Makefile文件:

    obj-m	:= proc_test01.o
    KERNEL	:= /lib/modules/`uname -r`/build #for mint/ubuntu
    #KERNEL := /lib/modules/`uname -r`/source #for redhat
    
    all:
    	make -C $(KERNEL) M=`pwd` modules
    
    install:
    	make -C $(KERNEL) M=`pwd` modules_install
    	depmod -A
    
    clean:
    	make -C $(KERNEL) M=`pwd` clean

    測试结果:

        由于我用的是linxu mint 17, create_proc_entry()函数已被删除,故无法在本机上測试。但在redhat6.4上測试过。用法和測试截图请參考后面的方法。



  • 相关阅读:
    RAID中条带的概念
    关于几个与IO相关的重要概念
    分布式调度
    ajax
    choices参数
    1.Python实现字符串反转的几种方法
    django web框架
    CRM总结
    Python面试重点(web篇)
    day02-网编并发数据库
  • 原文地址:https://www.cnblogs.com/mqxnongmin/p/10962771.html
Copyright © 2011-2022 走看看