最近一直在考虑如何在只读文件系统中显示应用程序的版本号其他信息,由于用打印的方式的话会使串口显示的信息太多。最后想到使用proc文件系统来实现,在proc文件系统中建立一个文件,把在proc文件系统中建立文件并读写的功能写到一个驱动模块中,在应用程序中通过调用驱动接口的方式来把信息写入模块中,在操作proc中文件时输出此信息,这样想知道应用程序的版本号等信息就可直接打开对应的文件即可。当然还可以向proc中生成的文件写入信息。
在网络上找到一个简单的例子,在这里借花献佛,希望能给需要的人一点帮助。
#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/proc_fs.h>
#include <linux/string.h>
#include <linux/vmalloc.h>
#include <asm/uaccess.h>
MODULE_LICENSE("GPL");
MODULE_DESCRIPTION("Fortune Cookie Kernel Module");
MODULE_AUTHOR("M. Tim Jones");
#define MAX_COOKIE_LENGTH PAGE_SIZE
static struct proc_dir_entry *proc_entry;
static char *cookie_pot; // Space for fortune strings
static int cookie_index; // Index to write next fortune
static int next_fortune; // Index to read next fortune
ssize_t fortune_write( struct file *filp, const char __user *buff,
unsigned long len, void *data )
{
int space_available = (MAX_COOKIE_LENGTH-cookie_index)+1;
if (len > space_available) {
printk(KERN_INFO "fortune: cookie pot is full!/n");
return -ENOSPC;
}
if (copy_from_user( &cookie_pot[cookie_index], buff, len )) {
return -EFAULT;
}
printk("write len = %d/n", len);
cookie_index += len;
cookie_pot[cookie_index-1] = 0;
return len;
}
int fortune_read( char *page, char **start, off_t off,
int count, int *eof, void *data )
{
int len;
if (off > 0) {
*eof = 1;
return 0;
}
/* Wrap-around */
if (next_fortune >= cookie_index) next_fortune = 0;
len = sprintf(page, "%s/n", &cookie_pot[next_fortune]);
next_fortune += len;
// len = sprintf(page, "%s/n", "20090210 V1.0.0");
return len;
}
int init_fortune_module( void )
{
int ret = 0;
cookie_pot = (char *)vmalloc( MAX_COOKIE_LENGTH );
if (!cookie_pot) {
ret = -ENOMEM;
} else {
memset( cookie_pot, 0, MAX_COOKIE_LENGTH );
proc_entry = create_proc_entry( "fortune", 0644, NULL );
if (proc_entry == NULL) {
ret = -ENOMEM;
vfree(cookie_pot);
printk(KERN_INFO "fortune: Couldn't create proc entry/n");
} else {
cookie_index = 0;
next_fortune = 0;
proc_entry->read_proc = fortune_read;
proc_entry->write_proc = fortune_write;
proc_entry->owner = THIS_MODULE;
printk(KERN_INFO "fortune: Module loaded./n");
}
}
return ret;
}
void cleanup_fortune_module( void )
{
remove_proc_entry("fortune", &proc_root);
vfree(cookie_pot);
printk(KERN_INFO "fortune: Module unloaded./n");
}
module_init( init_fortune_module );
module_exit( cleanup_fortune_module );
Makefile如下:
LINUXROOT := /usr/src/kernels/2.6.11-1.1369_FC4-i686 //此处根据不同系统要修改
obj-m += proc_test_other.o
all:
@make -C $(LINUXROOT) M=$(PWD) modules
clean:
@make -C $(LINUXROOT) M=$(PWD) clean
这个例子虽然简单但很实用,重要的是通过它可以更好更快的理解proc文件系统的编程来实现自已的目的。也可以把代码放到另一个驱动模块中,这样就可以实现和驱动的交互。