用戶空間與內核空間的接口:proc文件系統

最早在接觸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]>");




發佈了64 篇原創文章 · 獲贊 3 · 訪問量 11萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章