# Reading [The Linux Kernel Module Programming Guide](https://sysprog21.github.io/lkmpg/) (3) ## The /proc File System ### why proc_ops instead of file_operations /proc底下放的檔案是為了user space program和kernel space program溝通,前面有講到file_operations這個結構,是為了讓device file應對不同syscall執行不同的函數,現在的proc_ops則是特別為了操作/proc底下的file設計,很像以前寫開檔讀檔那樣,只不過現在的問題是建立檔案的是kernel module,裡面的東西並不實際存在disk上面,它實際是一段kernel memory (可以在procfs3.c看出來,所有的操作都是對 `static char procfs_buffer[PROCFS_MAX_SIZE];`這塊記憶體),所以用途也比較特殊,為了避免誤用一些syscall,proc_ops砍掉一些對kernel space memory來說不合理或危險的syscall,在較新的linux版本會強制要求使用proc_ops去控制proc file。 ### 好處&目的 user space program依舊是透過syscall去讀寫檔案,kernel module讀到這些資訊就可以在kernel mode做出相對應的動作,以往user program要跟kernel溝通就只能透過syscall去操作,syscall又是寫死在kernel image的syscall table上,如果你想做一些kernel space複雜的操作,可能就要做很多次且很多種的syscall,這樣很沒效率,寫一個自己的syscall又要重新compile kernel太麻煩,所以如果將這些操作寫在kernel module裡面,user program就只要在proc_ops寫下要做什麼,一次寫檔就好,kernel module收到這筆命令去完成對應的複雜任務。其他用法還有紀錄kernel的訊息,方便debug之類的。 接下來要說的就是之前看過的put_user,類似的功能還有get_user, copy_from_user, copy_to_user,目的就是要將kernel space memory的內容送到user space memory,反之亦然,不能直接dereference pointer,因為是來自不同的memory block(也要避免user傳進非法的reference導致kernel crush)。 ## inode and inode_operations 結構"inode"是檔案在檔案系統裡面的實體(雖然有一些filesystem實作時可能會用不同的方式取代inode),由一個或數個dentry指向他,主要負責檔案的metadata,如大小,建立時間,資料的位置等(但是檔案名稱不在這裡,而是在指向他的dentry,所以一個inode或者說一塊資料它從不同的路徑來讀會有不同的名子),所以對PATH解析就是一串inode連接起來的dentry。系統要找檔案就是找PATH裡最後一個dentry的inode,至於檔案內容的操作開啟、寫入、讀取等,則為結構"file"定義。inode和file各自有interface: inode_operations, file_operations,去應對系統的呼叫,一般的檔案內容操作時是透過file_operations,但是前面提過/proc file則是使用proc_ops,且proc_ops是在inode_operations裡面,這點是和ext4檔案不一樣,另外提一下,/proc底下的file system叫做procfs和root file system不一樣,至於root file system是誰取決開機在哪裡mount root,可能是硬碟ext4(重灌的時候格式化硬碟要選的格式就是這個),或是mount在ramdisk上的initramfs等,這些是透過VFS(virtual file system)將它們整合起來,這邊複習一下前面的init script,裡面有兩行mount 就是為了做這件事,/proc的部分在這裡提到,下一篇會講/sys。 另外提一下`proc_set_size(our_proc_file, 80);`,其實這個大小的設置只是給user program知道要傳多大的buffer進來接資料,並不是實際的memory大小,因為真正的空間大小已經寫在這裡了`static char procfs_buffer[PROCFS_MAX_SIZE];`,如果亂給的話會影響到user program的behavior。 要測試可以用cat去讀,echo寫/proc的file,
×
Sign in
Email
Password
Forgot password
or
By clicking below, you agree to our
terms of service
.
Sign in via Facebook
Sign in via Twitter
Sign in via GitHub
Sign in via Dropbox
Sign in with Wallet
Wallet (
)
Connect another wallet
New to HackMD?
Sign up