今天來看看day3中新增的**。day3中並沒有涉及太多一些檔案系統原理上的知識,主要是對之前的**進行補充與完善,新增了一些除錯資訊。主要涉及虛擬檔案系統proc的一些知識,今天來學習一下。
proc檔案系統全名process data system,初衷是傳遞程序資料。
proc檔案系統使核心生成系統狀態和相關配置的資訊。這些資訊可以有使用者和系統程式從普通檔案讀取,無需專門工具與核心通訊。
該方法主要利用乙個虛擬檔案系統即時產生檔案資訊,即只有發出請求時,資訊才會生成,而不是讀取。此類虛擬檔案系統並不需要專用的硬碟分割槽或者其他的塊儲存裝置。
proc檔案系統中主要包含以下幾類內容:
記憶體管理;
系統程序的特徵資料;
檔案系統;
裝置驅動;
系統匯流排;
電源管理;
終端;
/* helpful if this is different than other fs */
#define samplefs_magic 0x73616d70 /* "samp" */
// module_param:核心態下傳參的方法
// module_param(name, type, privilege)
unsigned int sample_parm = 0;
module_param(sample_parm, int, 0);
// module_parm_desc:用來描述引數的巨集。
module_parm_desc(sample_parm, "an example parm. default: x range: y to z");
#ifdef config_proc_fs
static struct proc_dir_entry *proc_fs_samplefs;
我們看到這裡有乙個結構體struct proc_dir_entry
,該結構體表示proc檔案系統中的資料項,每個資料項都由乙個proc_dir_entry例項描述。
struct proc_dir_entry ;
proc_write_t write; // 指向乙個支援向核心寫入的函式
void *data; // 引數,不同的引數對應不同的操作
unsigned int state_size;
unsigned int low_ino; // inode 編號
nlink_t nlink; // 目錄中子目錄和符號鏈結的個數
kuid_t uid; // 使用者id
kgid_t gid; // 組id
loff_t size; // 檔案大小(位元組),因為proc資料項都是動態生成的,所以一般情況下size為0
struct proc_dir_entry *parent; // 父目錄指標
struct rb_root subdir; // 指向乙個目錄中的第乙個子資料項,有可能是檔案,也可能是目錄
struct rb_node subdir_node;
char *name; // 檔名
umode_t mode;
u8 namelen; // 檔名長度
char inline_name;
} __randomize_layout;
void
sfs_proc_init(void)
這個函式比較簡單,主要是建立proc/fs/samplefs的目錄和檔案,主要的兩個函式就是proc_mkdir
和create_proc_read_entry
。必須指出的是,通過**來建立新的資料項並不常見,這些函式介面主要是用來測試,以便使用很小的代價在核心與使用者空間開啟一條通訊渠道。
proc_mkdir
主要是建立新目錄,create_proc_read_entry
建立proc中的檔案,但是這個功能在新核心中被替換為proc_create
,以下是proc_create的定義。
struct proc_dir_entry *proc_create(const char *name, umode_t mode,
struct proc_dir_entry *parent,
const struct file_operations *proc_fops)
不難發現我們只需要填上struct file_operations
這個引數即可。在老核心中,核心對proc檔案的file_operations約束較為嚴格,實現了乙個proc_file_operations:
static struct file_operations proc_file_operations =
所以只需要填上這幾個函式即可。關於seq_file與proc的關係暫時不做詳述,修改後的**如下:
static int samplefs_debug_open(struct seq_file *file, void *v)
static int samplefs_proc_open(struct inode *inode, struct file *file)
static const struct file_operations samplefs_proc_fops = ;
關於proc檔案寫的問題暫時不在這裡討論。
這個函式比較簡單,主要涉及remove_proc_entry
這個函式,定義如下:
void remove_proc_entry(const char *name, struct proc_dir_entry *parent)
所以也需要做一些小改動:
void
sfs_proc_clean(void)
#endif /* config_proc_fs */
static int __init init_samplefs_fs(void)
return register_filesystem(&samplefs_fs_type);
}static void __exit exit_samplefs_fs(void)
module_init(init_samplefs_fs)
module_exit(exit_samplefs_fs)
module_license("gpl");
解決辦法在這裡。大致意思是這是乙個未經驗證的模組,載入後汙染核心,總體來說沒什麼影響。
之後可以通過cat /proc/fs/samplefs/debugdata
檢視相關資訊。這時就可以進行實驗了!
module_param的介紹
module_param和module_parm_desc
proc檔案系統介紹一
proc檔案系統與seq_file的讀寫
Linux檔案系統初探(1)
首先要回答這樣乙個問題 為什麼要寫這樣的文章?網路中已經有大量這樣的教程和介紹。我的回答和codproject上的一位大牛的回答是類似的,其一是 對於初學者來說資訊越多越好,多角度的對同乙個問題或者概念進行描述對理解問題和概念是大有好處的。其二是 這樣把學習的東西講述出來才能更好的幫助自己理解概念。...
linux移植日記 day 3
目標 完成頁表 一 資料結構 元素功能 pagemask 控制頁面大小,預設為0,頁面大小為4kb 第二行 vpn2 對應cp0暫存器的entry hi暫存器 第三行 第四行 對應cp0暫存器的entry lo0和entry lo1暫存器 class tlbentry lo extends bund...
3 Linux檔案系統
注意 根分割槽底下的目錄 路徑,不一定都屬於根分割槽 目錄名目錄說明 etc 存放linux系統管理中的各種配置檔案和子目錄 sbin 存放系統管理員的系統管理程式 dev 存放系統所使用的各種外設 外設入口檔案 bin 系統常用命令 內部命令 boot 系統啟動時所使用的各種檔案 lib 存放系統...