最早在接觸Linux BSP時,項目中有一項規格就是底層需向上層提供硬件PCB及BOM信息。由於在Linux的根文件系統/proc目錄下有硬件CPU、內存、存儲器等與硬件相關的信息,並且在用戶空間通過cat命令就可以輕易獲得,於是有個想法,就是設法將項目中硬件PCB及BOM等信息展現在/proc目錄下,然後用戶空間可以通過cat或通過讀寫文件的形式獲得這些信息。所以就查閱了關於Linux proc文件系統的一些知識,並整理一個例程。
什麼是proc文件系統?
proc文件系統是一個僞文件系統,它只存在內存當中,而不佔用外村空間。它以文件系統的方式訪問內核數據的操作接口。Linux內核提供了一種通過/proc文件系統,在運行時訪問內核內部數據結構、改變內核設置的機制、用戶和應用程序可以通過proc得到系統的信息,並可以改變內核的某些參數。由於系統的信息、如進程,是可以動態改變的,所以用戶或應用程序讀取proc文件時,proc文件系統是動態從系統內核讀出所需要的信息並提交的。(這一點可sysfs有點類似,現在的驅動編程中,往往是通過sysfs實現一些參數的更改,甚至把sysfs當做“開關”使用)。
上一個例程:
#include <linux/module.h>
#include <linux/proc_fs.h>
char mystring[] = "hello_proc";
int my_proc_read( char *buf, char **start, off_t off, int count, int *eof, void *data )
{
int len = 0;
len += sprintf( buf+len, "\n%s\n", mystring);
len += sprintf( buf+len, "\n" );
return len;
}
static int __init proc_init( void )
{
create_proc_read_entry("myproc", 0, NULL, my_proc_read, NULL );
return 0;
}
static void __exit proc_exit(void )
{
remove_proc_entry( "myproc",NULL );
}
module_init( proc_init );
module_exit( proc_exit );
MODULE_LICENSE("GPL");
MODULE_DESCRIPTION("Test proc filesystem");
MODULE_AUTHOR("Vincent Wu <[email protected]>");
將上面例程編譯層模塊test_proc.ko
1. insmod test_proc.ko
加載模塊後在/proc目錄下生成文件節點myproc
2.cat /proc/mypoc
看到輸出信息爲hello_proc
另外通過read系統調用讀/proc/myproc也可以得到數據hello_proc
注意上面是在/proc目錄下生成目錄myproc,如果想在/proc目下生成一個目錄,然後在該生成的目錄下生成一個子目錄。如建立目錄/proc/myproc/myproc_sub,可以這樣:
#include <linux/module.h>
#include <linux/proc_fs.h>
char mystring[] = "hello_proc";
struct proc_dir_entry *parent;
int my_proc_read( char *buf, char **start, off_t off, int count, int *eof, void *data )
{
int len = 0;
len += sprintf( buf+len, "\n%s\n", mystring);
len += sprintf( buf+len, "\n" );
return len;
}
static int __init proc_init( void )
{
parent = proc_mkdir ("myproc", NULL);
create_proc_read_entry("myproc_sub", 0, parent, my_proc_read, NULL );
return 0;
}
static void __exit proc_exit(void )
{
remove_proc_entry( "myproc_sub",parent);
}
module_init( proc_init );
module_exit( proc_exit );
MODULE_LICENSE("GPL");
MODULE_DESCRIPTION("Test proc filesystem");
MODULE_AUTHOR("Vincent Wu <[email protected]>");