欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久

打開(kāi)APP
userphoto
未登錄

開(kāi)通VIP,暢享免費電子書(shū)等14項超值服

開(kāi)通VIP
特殊文件系統proc
特殊文件系統/proc:

作者 :noble;
寫(xiě)作時(shí)間:2002-9-4;
測試環(huán)境:Red Hat Linux 7.2
聯(lián)系方法:QQ:4440151
Email:noble_shi@21cn.com

1.對kern_mout()進(jìn)行解析:
(1)調用函數get_unnamed_dev()為文件系統/proc文件系統分配一個(gè)設備號。
(2)調用函數read_super對應的函數proc_read_super()分配super_block,inode,dentry;(a)其中super_block是在函數read_super中新生成的;
(b)inode是調用函數proc_get_inde()新生成的;
(c)dentry由函數d_alloc_root()創(chuàng )建的;
注:根目錄的inode和dentry創(chuàng )建的依據是一個(gè)proc_dir_entry結構proc_root,這個(gè)結構相當于一般文件系統中硬盤(pán)上的(不是內存中的inode或dentry結構)目錄項之類(lèi)的東西。
(3)調用add_vfsmnt()創(chuàng )建vfsmount結構,同時(shí)對其進(jìn)行設置(如和super_block的關(guān)系等)。并使得proc文件系統file_system_type數據結構的kern_mnt指向這個(gè)vfsmount結構。但是這并不意味著(zhù)path_walk()就能順著(zhù)路徑名“/proc”找到proc文件系統的根節點(diǎn),因為path_walk()并不涉及file_system_type數據結構,而/proc的inode結構和dentry結構并沒(méi)有和新創(chuàng )建的這個(gè)vfsmount結構聯(lián)系起來(lái)。
2.所以,光調用kern_mount()還不夠,還得由系統調用的初始化進(jìn)程從內核外部調用系統調用mount(),再安裝一次,通常的命令行為:mount –nvt proc/dev/null/proc,也就是說(shuō),把建立再“空設備”/dev/null上的proc文件系統安裝再節點(diǎn)/proc 上。
在mount()中,因為file_system_type結構中FS-SINGLE標志位為1,所以要調用get_sb_single()來(lái)得到相應的超級塊,其方法和別的不同(別的都是從設備上讀),代碼中通過(guò)file_system_type結構中的指針kern_mnt取得文件系統vfsmount結構,從而取得其super_block結構,而這個(gè)關(guān)系正是在kern_mount()中設置好的。
Mount()中其他的操作就和普通的文件系統的安裝無(wú)異了。這樣就把proc文件系統安裝到了節點(diǎn)/proc上。
3.因為整個(gè)proc文件系統都不存在于設備上,所以不光是它的根節點(diǎn)需要在內存中創(chuàng )造出來(lái),自根節點(diǎn)以下的所以節點(diǎn)全都需要在運行時(shí)加以創(chuàng )建,這是由內核在初始化時(shí)調用proc_root_init()完成的。
(1)首先是直接在/proc下面的葉子節點(diǎn),即文件節點(diǎn),這是由proc_misc_init()創(chuàng )建的。
函數proc_misc_init()調用函數create_proc_read_entry()進(jìn)行分配結構,而create_proc_read_entry()則調用函數create_proc_entry(),下面對函數create_proc_entry()進(jìn)行解析:
a)調用函數xlate_proc_name()返回父親節點(diǎn)的proc_dir_entry結構;
b)調用函數kmalloc()分配自己的proc_dir_entry結構;
c)對自己的proc_dir_entry結構進(jìn)行初始化;
d)調用函數proc_register()對自己的proc_dir_entry結構進(jìn)行注冊登記,即掛到父親節點(diǎn)的proc_dir_entry結構內的subdir隊列中;
(2)創(chuàng )建三個(gè)特殊的文件節點(diǎn),這三個(gè)文件是:kmsg、kcore、profile;這些文件的創(chuàng )建直接調用create_proc_entry();
(3)創(chuàng )建直接在/proc目錄中的子目錄,如:net,fs,dirver等;這些子目錄都是通過(guò)proc_mkdir()創(chuàng )建的。
(4)除了這些子目錄之外,就只有/proc/tty是特殊的,因為其他的只有兩層目錄/proc/dirname,只有/proc/tty是一顆子樹(shù),即下面還有目錄,所以要專(zhuān)門(mén)創(chuàng )建,調用的函數是:proc_tty_init();
(5)此外,如果系統不采用傳統的基于主設備號/次設備號的/dev設備(文件)目錄,而采用樹(shù)狀的設備目錄/device_tree,則還要在proc_root_init()中創(chuàng )建/device_tree子樹(shù)。這是由proc_device_init()完成的。

4./porc文件系統的目錄搜尋
注:/proc文件系統中,除了根節點(diǎn)外,其他節點(diǎn)只有proc_dir_entry 結構,沒(méi)有dentry結構和inode結構。
1)搜尋/proc/loadavg:
(1)調用path_walk(),到根節點(diǎn)后,要調用函數cached_lookup(),先在內存搜索下一個(gè)節點(diǎn)的dentry結構,如果沒(méi)在內存中找到,就從設備上讀取,對應的函數是real_lookup();
(2)從設備上的讀操作具體依賴(lài)于其父親節點(diǎn)的inode結構中的指針I(yè)_op指向那一個(gè)inode_operations數據結構。對于節點(diǎn)/proc,它的I_op指針指向proc_root_inode_operations,這是在它的proc_dir_entry結構proc_root中靜態(tài)定義好的。
(3)/proc文件系統對應的讀inode節點(diǎn)的函數是proc_lookup(),這個(gè)函數根據要查找節點(diǎn)的proc_dir_dentry結構,填充一個(gè)dentry結構,創(chuàng )建一個(gè)inode結構,然后返回。
(4)以后的操作就和一般節點(diǎn)的path_walk()沒(méi)什么區別了。
(5)下面對其讀操作進(jìn)行解析:
(a)為讀文件提供的操作函數是proc_file_read(),這是一個(gè)為proc特殊文件通用的函數。
(b)從代碼中可以看出,具體的讀操作是通過(guò)該節點(diǎn)的proc_dir_entry結構中的函數指針get_info或read_proc提供的。其中g(shù)et_info是為了與老一版本兼容而保留的,現在都已改用read_proc。
(c)對于/proc/loadavg來(lái)說(shuō),讀文件指針指向loadavg_read_proc();它的作用就是將數組avenrum[]中積累的在過(guò)去1分鐘、5分鐘以及15分鐘內的系統平均CPU負荷等統計信息通過(guò)sprintf()“打印”到緩沖區頁(yè)面中。
(d)在函數proc_file_read()中,調用該節點(diǎn)讀函數讀完以后,將把讀的信息通過(guò)函數copy_to_user(),拷貝的用戶(hù)空間。
2)搜尋/proc/self/cwd;
(1)同上,調用proc_root_lookup()->proc_pid_lookup();
注:
a)對于有proc_dir_entry結構的節點(diǎn),即向proc_root登記而掛入了其隊列中的節點(diǎn),也就是上一種情景,其查找目標節點(diǎn)所調用的函數依次是:
path_walk()->real_lookup()->proc_root_lookup()->proc_lookup();
注意:在real_lookup()中分配dentry結構,proc_root_lookup()是根據inode節點(diǎn)中提供的操作,在proc_lookup()中分配inode結構。

b)另一種情況是對應于當前系統中的各個(gè)進(jìn)程而并不存在proc_dir_entry結構的節點(diǎn)。其查找目標節點(diǎn)所調用的函數依次是:
path_walk()->real_lookup()->proc_root_lookup()->proc_pid_lookup();
注意:proc_lookup()和proc_pid_lookup()都在函數proc_root_lookup()中。
(2)從proc_root_lookup()返回到path_walk()中以后,接著(zhù)要檢查和處理兩件事,第一件事新找到的節點(diǎn)是否為安裝點(diǎn);第二件就是它是否是一個(gè)鏈接點(diǎn)。這正是我們所關(guān)心的,因為/proc/self就是個(gè)鏈接點(diǎn)。
(3)對于鏈接點(diǎn),通過(guò)do_follow_link(),調用該inode結構中的inode_operations結構提供的follow_link函數指針,尋找目標節點(diǎn)。
Follow_link指向函數proc_self_follow_link(),這個(gè)函數又調用vfs_follow_lnk();
(4)要指出的是,在vfs_follow_link()中,將會(huì )遞歸的調用path_walk()來(lái)尋找目標節點(diǎn),所以又會(huì )調用其父親節點(diǎn)/proc的lookup函數,即proc_root_lookup(),不同的是這次尋找的不是”self”,而是當前進(jìn)程的pid字符串。這一次,在proc_root_lookup()中對proc_lookup()的調用同樣會(huì )因為在proc_root的subdir隊列中找不到相應的proc_dir_entry結構而失敗,所以也要進(jìn)一步調用proc_pid_lookup()尋找??墒沁@一次的節點(diǎn)名不似乎“self”了,所以走的路線(xiàn)頁(yè)就不同了。
(5)這次調用proc_pid_lookup()所起的作用是將要找的函數名(當前進(jìn)程號的字符串形式)轉換成一個(gè)無(wú)符號整數,然后依此為pid從系統中尋找是否存在相應的進(jìn)程。如果找到了相應的進(jìn)程,就通過(guò)proc_pid_make_inode()為之創(chuàng )建一個(gè)inode結構,并初始化已經(jīng)分配的dentry結構。
(6)這樣,從path_walk()->do_follow_link()返回以后,就繼續搜尋下一個(gè)節點(diǎn)“cwd”,這一次搜索的是最后一個(gè)節點(diǎn),所以跳到:las_component處。
(7)但是,同樣也要調用函數real_lookup(),從設備上讀取inode結構(其實(shí)是重新創(chuàng )建一個(gè)inode結構)。在real_lookup()函數中要調用的函數是其父親節點(diǎn)的inode_operation結構中的lookup函數指針指向的函數,這個(gè)函數是proc_base_inode_operation()。
(8)在函數proc_base_inode_operation()中,創(chuàng )建inode結構,并根據不同的類(lèi)型進(jìn)行初始化。注意,inode結構中的union被用作一個(gè)proc_inode_info結構proc_I,這個(gè)結構中的tast指針在函數proc_pid_make_inode()中被設定為該進(jìn)程的task_struct指針。
另外,還要設置的兩項是:
(a)將inode結構中的指針I(yè)_op設置成指向proc_pid_link_inode_operation數據結構。
(b)將inode結構中替換union的proc_inode_info結構中的函數指針proc_get_link設置為指向函數proc_cwd_link();
(9)這樣,從proc_base_inode_operation()返回到(7):real_lookup(),進(jìn)而返回到path_walk()時(shí),nameidata結構中的指針dentry已經(jīng)指向這個(gè)特定“cwd”節點(diǎn)的dentry結構,但是接著(zhù)同樣要受到對其inode結構中的I_op指針以及相應inode_operation結構中的指針follow_link的檢查。因為follow_link非0,在(8)被設置。這樣,就可以找到當前工作目錄,其方法見(jiàn)(10);
(10)如前所述,節點(diǎn)的inode中的union用作一個(gè)proc_inode_info結構,其中的指針task指向相應進(jìn)程的task_struct結構,進(jìn)而可以得到這個(gè)進(jìn)程的fs_struct結構,而這個(gè)數據結構中的指針pwd即指向該進(jìn)程的”當前工作目錄“的dentry結構,同時(shí)指針pwdmnt指向該目錄所在設備安裝時(shí)的vfsmount結構。
本站僅提供存儲服務(wù),所有內容均由用戶(hù)發(fā)布,如發(fā)現有害或侵權內容,請點(diǎn)擊舉報。
打開(kāi)APP,閱讀全文并永久保存 查看更多類(lèi)似文章
猜你喜歡
類(lèi)似文章
linux文件系統之總結
proc文件系統分析(四)
【轉】Linux那些事兒之我是Sysfs(8)一起散散步-pathwalk - wilso...
sysfs文件系統2
嵌入式 Linux根文件系統移植(一)——Linux文件系統簡(jiǎn)介
Linux inode 學(xué)習
更多類(lèi)似文章 >>
生活服務(wù)
分享 收藏 導長(cháng)圖 關(guān)注 下載文章
綁定賬號成功
后續可登錄賬號暢享VIP特權!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服

欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久