1.內核
1.1.組成部分
1.1.1.系統調用接口
1.1.2.進程管理
1.1.3.內存管理
1.1.4虛擬文件系統
1.1.6設備驅動程序
1.1.5網絡堆棧
1.1.7依賴體系結構的代碼
2.SHELL
3.文件系統
3.1認識 EXT2 文件系統
3.2文件系統特性
3.3文件目錄
4.應用程序
Linux系統四大組成部分:內核、SHELL、文件系統、應用程序。
1.內核
Linux內核(英語:Linux kernel),是一種計算機操作系統內核,以C語言和匯編語言寫成,匹配POSIX標準,以GNU通用公共許可證發布。Linux內核最早是由芬蘭黑客林納斯·托瓦茲為嘗試在自己的英特爾x86架構計算機上提供自由免費的類Unix系統而開發的。該計劃開始于1991年,林納斯·托瓦茲當時在Usenet新聞組comp.os.minix登載帖子,這份著名的帖子標示著Linux內核計劃的正式開始。
在計劃的早期有一些Minix的黑客提供了協助,而今天全球有無數程序員正在為該計劃無償提供幫助。
從技術上說Linux只是一個內核?!皟群恕敝傅氖且粋€提供硬件抽象層、磁盤及文件系統控制、多任務等功能的系統軟件。一個內核并不是一套完整的操作系統。有一套基于Linux內核的完整操作系統叫作Linux操作系統,或是GNU/Linux(在該系統中包含了很多GNU計劃的系統組件)。
Linux內核是在GNU通用公共許可證第2版之下發布的(加上一些非自由固件、blob與各種非自由許可證)。貢獻者遍布世界各地,日常開發在Linux內核郵件列表。
1.1.組成部分:內存管理、進程管理、設備驅動程序、文件系統和網絡管理等
Linux 內核的主要子系統
現在使用圖 3 中的分類說明 Linux 內核的主要組件。
1.1.1.系統調用接口
SCI 層提供了某些機制執行從用戶空間到內核的函數調用。正如前面討論的一樣,這個接口依賴于體系結構,甚至在相同的處理器家族內也是如此。SCI 實際上是一個非常有用的函數調用多路復用和多路分解服務。在 ./linux/kernel 中您可以找到 SCI 的實現,并在 ./linux/arch 中找到依賴于體系結構的部分。有關這個組件的更詳細信息可以在 參考資料 一節中找到。
1.1.2.進程管理
進程管理的重點是進程的執行。在內核中,這些進程稱為線程,代表了單獨的處理器虛擬化(線程代碼、數據、堆棧和 CPU 寄存器)。在用戶空間,通常使用進程 這個術語,不過 Linux 實現并沒有區分這兩個概念(進程和線程)。內核通過 SCI 提供了一個應用程序編程接口(API)來創建一個新進程(fork、exec 或 Portable Operating System Interface [POSIX] 函數),停止進程(kill、exit),并在它們之間進行通信和同步(signal 或者 POSIX 機制)。
進程管理還包括處理活動進程之間共享 CPU 的需求。內核實現了一種新型的調度算法,不管有多少個線程在競爭 CPU,這種算法都可以在固定時間內進行操作。這種算法就稱為 O(1) 調度程序,這個名字就表示它調度多個線程所使用的時間和調度一個線程所使用的時間是相同的。 O(1) 調度程序也可以支持多處理器(稱為對稱多處理器或 SMP)。您可以在 ./linux/kernel 中找到進程管理的源代碼,在 ./linux/arch 中可以找到依賴于體系結構的源代碼。在 參考資料 一節中可以了解有關這個算法的更多內容。
1.1.3.內存管理
內核所管理的另外一個重要資源是內存。為了提高效率,如果由硬件管理虛擬內存,內存是按照所謂的內存頁 方式進行管理的(對于大部分體系結構來說都是 4KB)。Linux 包括了管理可用內存的方式,以及物理和虛擬映射所使用的硬件機制。
不過內存管理要管理的可不止 4KB 緩沖區。Linux 提供了對 4KB 緩沖區的抽象,例如 slab 分配器。這種內存管理模式使用 4KB 緩沖區為基數,然后從中分配結構,并跟蹤內存頁使用情況,比如哪些內存頁是滿的,哪些頁面沒有完全使用,哪些頁面為空。這樣就允許該模式根據系統需要來動態調整內存使用。
為了支持多個用戶使用內存,有時會出現可用內存被消耗光的情況。由于這個原因,頁面可以移出內存并放入磁盤中。這個過程稱為交換,因為頁面會被從內存交換到硬盤上。內存管理的源代碼可以在 ./linux/mm 中找到。
1.1.4虛擬文件系統
虛擬文件系統(VFS)是 Linux 內核中非常有用的一個方面,因為它為文件系統提供了一個通用的接口抽象。VFS 在 SCI 和內核所支持的文件系統之間提供了一個交換層。
VFS 在用戶和文件系統之間提供了一個交換層
在 VFS 上面,是對諸如 open、close、read 和 write 之類的函數的一個通用 API 抽象。在 VFS 下面是文件系統抽象,它定義了上層函數的實現方式。它們是給定文件系統(超過 50 個)的插件。文件系統的源代碼可以在 ./linux/fs 中找到。
文件系統層之下是緩沖區緩存,它為文件系統層提供了一個通用函數集(與具體文件系統無關)。這個緩存層通過將數據保留一段時間(或者隨即預先讀取數據以便在需要是就可用)優化了對物理設備的訪問。緩沖區緩存之下是設備驅動程序,它實現了特定物理設備的接口。
1.1.5網絡堆棧
網絡堆棧在設計上遵循模擬協議本身的分層體系結構?;叵胍幌拢琁nternet Protocol (IP) 是傳輸協議(通常稱為傳輸控制協議或 TCP)下面的核心網絡層協議。TCP 上面是 socket 層,它是通過 SCI 進行調用的。
socket 層是網絡子系統的標準 API,它為各種網絡協議提供了一個用戶接口。從原始幀訪問到 IP 協議數據單元(PDU),再到 TCP 和 User Datagram Protocol (UDP),socket 層提供了一種標準化的方法來管理連接,并在各個終點之間移動數據。內核中網絡源代碼可以在 ./linux/net 中找到。
1.1.6設備驅動程序
Linux 內核中有大量代碼都在設備驅動程序中,它們能夠運轉特定的硬件設備。Linux 源碼樹提供了一個驅動程序子目錄,這個目錄又進一步劃分為各種支持設備,例如 Bluetooth、I2C、serial 等。設備驅動程序的代碼可以在 ./linux/drivers 中找到。
1.1.7依賴體系結構的代碼
盡管 Linux 很大程度上獨立于所運行的體系結構,但是有些元素則必須考慮體系結構才能正常操作并實現更高效率。./linux/arch 子目錄定義了內核源代碼中依賴于體系結構的部分,其中包含了各種特定于體系結構的子目錄(共同組成了 BSP)。對于一個典型的桌面系統來說,使用的是 i386 目錄。每個體系結構子目錄都包含了很多其他子目錄,每個子目錄都關注內核中的一個特定方面,例如引導、內核、內存管理等。這些依賴體系結構的代碼可以在 ./linux/arch 中找到。
2.Linux Shell
shell是系統的用戶界面,提供了用戶與內核進行交互操作的一種接口。它接收用戶輸入的命令并把它送入內核去執行,是一個命令解釋器。另外,shell編程語言具有普通編程語言的很多特點,用這種編程語言編寫的shell程序與其他應用程序具有同樣的效果。
基本上shell分兩大類:
一:圖形界面shell(Graphical User Interface shell 即 GUI shell)
例如:應用最為廣泛的 Windows Explorer (微軟的windows系列操作系統),還有也包括廣為人知的 Linux shell,其中linux shell 包括 X window manager (BlackBox和FluxBox),以及功能更強大的CDE、GNOME、KDE、 XFCE。
二:命令行式shell(Command Line Interface shell ,即CLI shell)
3.Linux 文件系統
Linux文件系統中的文件是數據的集合,文件系統不僅包含著文件中的數據而且還有文件系統的結構,所有Linux 用戶和程序看到的文件、目錄、軟連接及文件保護信息等都存儲在其中。
3.1.認識 EXT2 文件系統
Linux最傳統的磁盤文件系統(filesystem)使用的是EXT2這個啦!所以要了解文件系統就得要由認識EXT2開始! 而文件系統是創建在硬盤上面的,因此我們得了解硬盤的物理組成才行。磁盤物理組成的部分我們在第零章談過了,至于磁盤分區則在第三章談過了,所以底下只會很快的復習這兩部份。 重點在于inode, block還有superblock等文件系統的基本部分喔!
3.2.文件系統特性
我們都知道磁盤分區完畢后還需要進行格式化(format),之后操作系統才能夠使用這個分割槽。 為什么需要進行『格式化』呢?這是因為每種操作系統所配置的文件屬性/權限并不相同, 為了存放這些文件所需的數據,因此就需要將分割槽進行格式化,以成為操作系統能夠利用的『文件系統格式(filesystem)』。
由此我們也能夠知道,每種操作系統能夠使用的文件系統并不相同。 舉例來說,windows 98 以前的微軟操作系統主要利用的文件系統是 FAT (或 FAT16),windows 2000 以后的版本有所謂的 NTFS 文件系統,至于 Linux 的正統文件系統則為 Ext2 (Linux second extended file system, ext2fs)這一個。此外,在默認的情況下,windows 操作系統是不會認識 Linux 的 Ext2 的。
傳統的磁盤與文件系統之應用中,一個分割槽就是只能夠被格式化成為一個文件系統,所以我們可以說一個 filesystem 就是一個 partition。但是由于新技術的利用,例如我們常聽到的LVM與軟件磁盤陣列(software raid), 這些技術可以將一個分割槽格式化為多個文件系統(例如LVM),也能夠將多個分割槽合成一個文件系統(LVM, RAID)! 所以說,目前我們在格式化時已經不再說成針對 partition 來格式化了, 通常我們可以稱呼一個可被掛載的數據為一個文件系統而不是一個分割槽喔!
那么文件系統是如何運行的呢?這與操作系統的文件數據有關。較新的操作系統的文件數據除了文件實際內容外, 通常含有非常多的屬性,例如 Linux 操作系統的文件權限(rwx)與文件屬性(擁有者、群組、時間參數等)。 文件系統通常會將這兩部份的數據分別存放在不同的區塊,權限與屬性放置到 inode 中,至于實際數據則放置到 data block 區塊中。 另外,還有一個超級區塊 (superblock) 會記錄整個文件系統的整體信息,包括 inode 與 block 的總量、使用量、剩余量等。
每個 inode 與 block 都有編號,至于這三個數據的意義可以簡略說明如下:
superblock:記錄此 filesystem 的整體信息,包括inode/block的總量、使用量、剩余量, 以及文件系統的格式與相關信息等;
inode:記錄文件的屬性,一個文件占用一個inode,同時記錄此文件的數據所在的 block 號碼;
block:實際記錄文件的內容,若文件太大時,會占用多個 block 。
由于每個 inode 與 block 都有編號,而每個文件都會占用一個 inode ,inode 內則有文件數據放置的 block 號碼。 因此,我們可以知道的是,如果能夠找到文件的 inode 的話,那么自然就會知道這個文件所放置數據的 block 號碼, 當然也就能夠讀出該文件的實際數據了。這是個比較有效率的作法,因為如此一來我們的磁盤就能夠在短時間內讀取出全部的數據, 讀寫的效能比較好啰。
我們將 inode 與 block 區塊用圖解來說明一下,如下圖所示,文件系統先格式化出 inode 與 block 的區塊,假設某一個文件的屬性與權限數據是放置到 inode 4 號(下圖較小方格內),而這個 inode 記錄了文件數據的實際放置點為 2, 7, 13, 15 這四個 block 號碼,此時我們的操作系統就能夠據此來排列磁盤的閱讀順序,可以一口氣將四個 block 內容讀出來! 那么數據的讀取就如同下圖中的箭頭所指定的模樣了。
這種數據存取的方法我們稱為索引式文件系統(indexed allocation)。那有沒有其他的慣用文件系統可以比較一下啊? 有的,那就是我們慣用的閃盤(閃存),閃盤使用的文件系統一般為 FAT 格式。FAT 這種格式的文件系統并沒有 inode 存在,所以 FAT 沒有辦法將這個文件的所有 block 在一開始就讀取出來。每個 block 號碼都記錄在前一個 block 當中, 他的讀取方式有點像底下這樣:
上圖中我們假設文件的數據依序寫入1->7->4->15號這四個 block 號碼中, 但這個文件系統沒有辦法一口氣就知道四個 block 的號碼,他得要一個一個的將 block 讀出后,才會知道下一個 block 在何處。 如果同一個文件數據寫入的 block 分散的太過厲害時,則我們的磁盤讀取頭將無法在磁盤轉一圈就讀到所有的數據, 因此磁盤就會多轉好幾圈才能完整的讀取到這個文件的內容!
常常會聽到所謂的『碎片整理』吧? 需要碎片整理的原因就是文件寫入的 block 太過于離散了,此時文件讀取的效能將會變的很差所致。 這個時候可以透過碎片整理將同一個文件所屬的 blocks 匯整在一起,這樣數據的讀取會比較容易?。?想當然爾,FAT 的文件系統需要經常的碎片整理一下,那么 Ext2 是否需要磁盤重整呢?
由于 Ext2 是索引式文件系統,基本上不太需要常常進行碎片整理的。但是如果文件系統使用太久, 常常刪除/編輯/新增文件時,那么還是可能會造成文件數據太過于離散的問題,此時或許會需要進行重整一下的。 不過,老實說,鳥哥倒是沒有在 Linux 操作系統上面進行過 Ext2/Ext3 文件系統的碎片整理說!似乎不太需要啦!^_^
3.3.文件目錄
Linux 和 UNIX? 系統中的所有文件都可以作為一個大型樹型文件系統的一部分訪問,這個樹型文件系統的根為 /。
/bin: 所有用戶可以的基本命令程序文件
/sbin: 供系統管理使用的工具程序
/boot: 引導加載器必須用到的各靜態文件: kernel, initramfs(initrd), grub等;
/dev: 存儲特殊文件或設備文件; 設備有兩種類型:字符設備(線性設備)、塊設備;
/etc: 系統程序的配置文件,只能為靜態;
/home: 普通的家目錄的集中位置:一般每個普通的家目錄默認為此目錄下與用戶名同名的子目錄
/root: 管理員的家目錄:可選:
/lib: 為系統啟動或根文件系統上的應用程序(/bin, /sbin等)提供共享庫,以及為內核提供內核模塊
libc.so*:動態鏈接的C庫:
id*:運行時鏈接器/加載器;
modules:用于存儲內核模塊的目錄
/lib64: 64位系統特有的存放64位共享庫的路徑;
/media: 便攜式設備掛載點,cdrom, floppy等;
/mnt: 其它文件系統的臨時掛載點;
/opt: 附加應用程序的安裝位置;可選路徑;
/srv: 當前主機為服務提供的數據;
/tmp: 為那些會產生臨時文件的程序提供的用于存儲臨時文件的目錄;可供所有用戶執行寫入操作;有特殊權限;
/usr: 全局共享的只讀數據路徑;
/usr/local:讓系統管理員安裝本地應用程序:也通常用于安裝第三方程序
/var: 存儲常發生變化的數據的目錄;
/proc: 內核及進程存儲其相關信息;它們多為內核參數
/sys: sysfs 是 Linux 內核中設計較新的一種虛擬的基于內存的文件系統,它的作用與 proc 有些類似,但除了與 proc 相同的具有查看和設定內核參數功能之外,還有為 Linux 統一設備模型作為管理之用。
4.應用程序
應用程序,指為完成某項或多項特定工作的計算機程序,它運行在用戶模式,可以和用戶進行交互,具有可視的用戶界面。
參考文獻
1.^ Linux系統內核描述 – – 維基百科
2.^ Linux內核組成 – – ibm developerworks
3.^ 文件系統 – – 鳥哥的Linux私房菜
4.^ /sys– – ibm developerworks
原創文章,作者:laiwen2007,如若轉載,請注明出處:http://www.www58058.com/17371
[…] 來源: http://www.www58058.com/17371 […]