Linux系統篇-proc文件系統詳解

本頭條作者我經常使用 /proc 文件系統來訪問 Linux 內核的內容,這個虛擬文件系統就像是一扇窗一樣,開發了跟內核通信的窗。

/proc 文件系統是一個虛擬文件系統,通過它可以使用一種新的方法在 Linux內核空間和用戶間之間進行通信。在 /proc 文件系統中,我們可以將對虛擬文件的讀寫作為與內核中實體進行通信的一種手段,但是與普通文件不同的是,這些虛擬文件的內容都是動態創建的。本文對 /proc 虛擬文件系統進行了介紹,並展示了它的用法。

最初開發 /proc 文件系統是為了提供有關係統中進程的信息。但是由於這個文件系統非常有用,因此內核中的很多元素也開始使用它來報告信息,或啟用動態運行時配置。清單 1 是對 /proc 中部分元素進行一次交互查詢的結果。它顯示的是 /proc 文件系統的根目錄中的內容。注意,在左邊是一系列數字編號的文件。每個實際上都是一個目錄,表示系統中的一個進程。由於在 GNU/Linux 中創建的第一個進程是 init 進程,因此它的 process-id 為 1。然後對這個目錄執行一個 ls 命令,這會顯示很多文件。每個文件都提供了有關這個特殊進程的詳細信息。/proc 中另外一些有趣的文件有:cpuinfo,它標識了處理器的類型和速度;pci,顯示在 PCI 總線上找到的設備;modules,標識了當前加載到內核中的模塊。

另外,我們還可以使用 sysctl 來配置這些內核條目。/proc 文件系統並不是 GNU/Linux 系統中的惟一一個虛擬文件系統。在這種系統上,sysfs 是一個與 /proc 類似的文件系統,但是它的組織更好(從 /proc 中學習了很多教訓)。不過 /proc 已經確立了自己的地位,因此即使 sysfs 與 /proc 相比有一些優點,/proc 也依然會存在。還有一個 debugfs 文件系統,不過(顧名思義)它提供的更多是調試接口。debugfs 的一個優點是它將一個值導出給用戶空間非常簡單。下圖就是proc的截圖

Linux系統篇-proc文件系統詳解

這些文件和目錄的解釋,我整理了下:

cmdline:系統啟動時輸入給內核命令行參數

cpuinfo:CPU的硬件信息 (型號, 家族, 緩存大小等)

devices:主設備號及設備組的列表,當前加載的各種設備(塊設備/字符設備)

dma:使用的DMA通道

filesystems:當前內核支持的文件系統,當沒有給 mount(1) 指明哪個文件系統的時候, mount(1) 就依靠該文件遍歷不同的文件系統

interrupts :中斷的使用及觸發次數,調試中斷時很有用

ioports I/O:當前在用的已註冊 I/O 端口範圍

kcore:該偽文件以 core 文件格式給出了系統的物理內存映象(比較有用),可以用 GDB 查探當前內核的任意數據結構。該文件的總長度是物理內存 (RAM) 的大小再加上 4KB

kmsg:可以用該文件取代系統調用 syslog(2) 來記錄內核日誌信息,對應dmesg命令

kallsym:內核符號表,該文件保存了內核輸出的符號定義, modules(X)使用該文件動態地連接和捆綁可裝載的模塊

loadavg:負載均衡,平均負載數給出了在過去的 1、 5,、15 分鐘裡在運行隊列裡的任務數、總作業數以及正在運行的作業總數。

locks:內核鎖 。

meminfo物理內存、交換空間等的信息,系統內存佔用情況,對應df命令。

misc:雜項 。

modules:已經加載的模塊列表,對應lsmod命令 。

mounts:已加載的文件系統的列表,對應mount命令,無參數。

partitions:系統識別的分區表 。

slabinfo:sla池信息。

stat:全面統計狀態表,CPU內存的利用率等都是從這裡提取數據。對應ps命令。

swaps:對換空間的利用情況。

version:指明瞭當前正在運行的內核版本。

需要解釋的一點是:可加載內核模塊(LKM)是用來展示 /proc 文件系統的一種簡單方法,這是因為這是一種用來動態地向 Linux 內核添加或刪除代碼的新方法。LKM 也是 Linux 內核中為設備驅動程序和文件系統使用的一種流行機制。如果你曾經重新編譯過 Linux 內核,就可能會發現在內核的配置過程中,有很多設備驅動程序和其他內核元素都被編譯成了模塊。如果一個驅動程序被直接編譯到了內核中,那麼即使這個驅動程序沒有運行,它的代碼和靜態數據也會佔據一部分空間。但是如果這個驅動程序被編譯成一個模塊,就只有在需要內存並將其加載到內核時才會真正佔用內存空間。

喜歡我的文章的話,就關注我吧!在本頭條號的置頂文章中有【文章分類】包含:

[C++進階篇系列]

[高級網絡編程篇系列]

[Linux系統篇系列]

[C++基礎知識篇]

[協議篇系列]

[數據結構和算法系列]

[設計模式系列]

不要只收藏和轉發哦,軟件架構師成長必經之路。


分享到:


相關文章: