最早在接觸linux bsp時,專案中有一項規格就是底層需向上層提供硬體pcb及bom資訊。由於在linux的根檔案系統/proc目錄下有硬體cpu、記憶體、儲存器等與硬體相關的資訊,並且在使用者空間通過cat命令就可以輕易獲得,於是有個想法,就是設法將專案中硬體pcb及bom等資訊展現在/proc目錄下,然後使用者空間可以通過cat或通過讀寫檔案的形式獲得這些資訊。所以就查閱了關於linux proc檔案系統的一些知識,並整理乙個例程。
什麼是proc檔案系統?
proc檔案系統是乙個偽檔案系統,它只存在記憶體當中,而不占用外村空間。它以檔案系統的方式訪問核心資料的操作介面。linux核心提供了一種通過/proc檔案系統,在執行時訪問核心內部資料結構、改變核心設定的機制、使用者和應用程式可以通過proc得到系統的資訊,並可以改變核心的某些引數。由於系統的資訊、如程序,是可以動態改變的,所以使用者或應用程式讀取proc檔案時,proc檔案系統是動態從系統核心讀出所需要的資訊並提交的。(這一點可sysfs有點類似,現在的驅動程式設計中,往往是通過sysfs實現一些引數的更改,甚至把sysfs當做「開關」使用)。
[cpp]view plain
copy
#include
#include
char
mystring =
"hello_proc"
; int
my_proc_read(
char
*buf,
char
**start, off_t off,
intcount,
int*eof,
void
*data )
static
int__init proc_init(
void
)
static
void
__exit proc_exit(
void
)
module_init( proc_init );
module_exit( proc_exit );
module_license("gpl"
);
module_description("test proc filesystem"
);
module_author("vincent wu "
);
將上面例程編譯層模組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,可以這樣:
[cpp]view plain
copy
#include
#include
char
mystring =
"hello_proc"
; struct
proc_dir_entry *parent;
intmy_proc_read(
char
*buf,
char
**start, off_t off,
intcount,
int*eof,
void
*data )
static
int__init proc_init(
void
)
static
void
__exit proc_exit(
void
)
module_init( proc_init );
module_exit( proc_exit );
module_license("gpl"
);
module_description("test proc filesystem"
);
module_author("vincent wu "
);
核心空間與使用者空間
1.核心態與使用者態的區別 1 核心態 的 不受任何限制,可以訪問 所有處理器指令集 記憶體位址以及i o空間 2 使用者態的 只能訪問其位址空間的頁表項中規定的虛擬位址。2.使用者態到核心態的切換方式 1 系統呼叫 軟中斷的一種 由使用者程序主動發起 2 異常 當cpu在執行執行在使用者態下的程式...
核心空間與使用者空間
首先,這個概念的由來,我認為跟cpu的發展有很大關係,在目前cpu的保護模式下,系統需要對其賴以執行的資料進行保護,為了保證作業系統核心資料,我們把記憶體空間進行劃分,一部分為作業系統核心執行的空間,另一部分是應用程式執行的空間,所謂空間就是記憶體的位址。因此核心空間和使用者空間的概念就出現了。在3...
核心空間與使用者空間
關於虛擬記憶體有三點需要注意 上圖展示了整個程序位址空間的分布,其中4g的位址空間分為兩部分,在使用者空間內,對應了記憶體分布的五個段 資料段 段 bss段 堆 棧。在上篇文章中有詳細的介紹。這個圖示核心使用者空間的劃分,圖中最重要的就是高階記憶體的對映 其中kmalloc和vmalloc函式申請的...