Linux系統一般有4個主要部分: 內核、shell、文件系統和應用程式。內核、shell和文件系統一起形成了基本的操作系統結構,它們使得用戶可以運行程式、管理文件並使用系統。部分層次結構如圖1-1所示。 1. linux內核 Linux內核是世界上最大的開源項目之一,內核是與電腦硬體介面的易替換 ...
Linux系統一般有4個主要部分:
內核、shell、文件系統和應用程式。內核、shell和文件系統一起形成了基本的操作系統結構,它們使得用戶可以運行程式、管理文件並使用系統。部分層次結構如圖1-1所示。
1. linux內核
Linux內核是世界上最大的開源項目之一,內核是與電腦硬體介面的易替換軟體的最低級別。它負責將所有以“用戶模式”運行的應用程式連接到物理硬體,並允許稱為伺服器的進程使用進程間通信(IPC)彼此獲取信息。
內核是操作系統的核心,具有很多最基本功能,它負責管理系統的進程、記憶體、設備驅動程式、文件和網路系統,決定著系統的性能和穩定性。
Linux 內核由如下幾部分組成:記憶體管理、進程管理、設備驅動程式、文件系統和網路管理等。如圖:
系統調用介面:SCI 層提供了某些機制執行從用戶空間到內核的函數調用。這個介面依賴於體繫結構,甚至在相同的處理器家族內也是如此。SCI 實際上是一個非常有用的函數調用多路復用和多路分解服務。在 ./linux/kernel 中您可以找到 SCI 的實現,併在 ./linux/arch 中找到依賴於體繫結構的部分。
1. 記憶體管理
對任何一臺電腦而言,其記憶體以及其它資源都是有限的。為了讓有限的物理記憶體滿足應用程式對記憶體的大需求量,Linux 採用了稱為“虛擬記憶體”的記憶體管理方式。Linux 將記憶體劃分為容易處理的“記憶體頁”(對於大部分體繫結構來說都是 4KB)。Linux 包括了管理可用記憶體的方式,以及物理和虛擬映射所使用的硬體機制。
不過記憶體管理要管理的可不止 4KB 緩衝區。Linux 提供了對 4KB 緩衝區的抽象,例如 slab 分配器。這種記憶體管理模式使用 4KB 緩衝區為基數,然後從中分配結構,並跟蹤記憶體頁使用情況,比如哪些記憶體頁是滿的,哪些頁面沒有完全使用,哪些頁面為空。這樣就允許該模式根據系統需要來動態調整記憶體使用。
為了支持多個用戶使用記憶體,有時會出現可用記憶體被消耗光的情況。由於這個原因,頁面可以移出記憶體並放入磁碟中。這個過程稱為交換,因為頁面會被從記憶體交換到硬碟上。記憶體管理的源代碼可以在 ./linux/mm 中找到。
2 .進程管理
進程實際是某特定應用程式的一個運行實體。在 Linux 系統中,能夠同時運行多個進程,Linux 通過在短的時間間隔內輪流運行這些進程而實現“多任務”。這一短的時間間隔稱為“時間片”,讓進程輪流運行的方法稱為“進程調度” ,完成調度的程式稱為調度程式。
進程調度控制進程對CPU的訪問。當需要選擇下一個進程運行時,由調度程式選擇最值得運行的進程。可運行進程實際上是僅等待CPU資源的進程,如果某個進程在等待其它資源,則該進程是不可運行進程。Linux使用了比較簡單的基於優先順序的進程調度演算法選擇新的進程。
通過多任務機制,每個進程可認為只有自己獨占電腦,從而簡化程式的編寫。每個進程有自己單獨的地址空間,並且只能由這一進程訪問,這樣,操作系統避免了進程之間的互相干擾以及“壞”程式對系統可能造成的危害。 為了完成某特定任務,有時需要綜合兩個程式的功能,例如一個程式輸出文本,而另一個程式對文本進行排序。為此,操作系統還提供進程間的通訊機制來幫助完成這樣的任務。Linux 中常見的進程間通訊機制有信號、管道、共用記憶體、信號量和套接字等。
內核通過 SCI 提供了一個應用程式編程介面(API)來創建一個新進程(fork、exec 或 Portable Operating System Interface [POSⅨ] 函數),停止進程(kill、exit),併在它們之間進行通信和同步(signal 或者 POSⅨ 機制)。
3. 文件系統
和 DOS 等操作系統不同,Linux 操作系統中單獨的文件系統並不是由驅動器號或驅動器名稱(如 A: 或 C: 等)來標識的。相反,和 UNIX 操作系統一樣,Linux 操作系統將獨立的文件系統組合成了一個層次化的樹形結構,並且由一個單獨的實體代表這一文件系統。Linux 將新的文件系統通過一個稱為“掛裝”或“掛上”的操作將其掛裝到某個目錄上,從而讓不同的文件系統結合成為一個整體。Linux 操作系統的一個重要特點是它支持許多不同類型的文件系統。Linux 中最普遍使用的文件系統是 Ext2,它也是 Linux 土生土長的文件系統。但 Linux 也能夠支持 FAT、VFAT、FAT32、MINIX 等不同類型的文件系統,從而可以方便地和其它操作系統交換數據。由於 Linux 支持許多不同的文件系統,並且將它們組織成了一個統一的虛擬文件系統.
虛擬文件系統(VirtualFileSystem,VFS):隱藏了各種硬體的具體細節,把文件系統操作和不同文件系統的具體實現細節分離了開來,為所有的設備提供了統一的介面,VFS提供了多達數十種不同的文件系統。虛擬文件系統可以分為邏輯文件系統和設備驅動程式。邏輯文件系統指Linux所支持的文件系統,如ext2,fat等,設備驅動程式指為每一種硬體控制器所編寫的設備驅動程式模塊。
虛擬文件系統(VFS)是 Linux 內核中非常有用的一個方面,因為它為文件系統提供了一個通用的介面抽象。VFS 在 SCI 和內核所支持的文件系統之間提供了一個交換層。即VFS 在用戶和文件系統之間提供了一個交換層。
VFS 在用戶和文件系統之間提供了一個交換層:
在 VFS 上面,是對諸如 open、close、read 和 write 之類的函數的一個通用 API 抽象。在 VFS 下麵是文件系統抽象,它定義了上層函數的實現方式。它們是給定文件系統(超過 50 個)的插件。文件系統的源代碼可以在 ./linux/fs 中找到。
文件系統層之下是緩衝區緩存,它為文件系統層提供了一個通用函數集(與具體文件系統無關)。這個緩存層通過將數據保留一段時間(或者隨即預先讀取數據以便在需要是就可用)優化了對物理設備的訪問。緩衝區緩存之下是設備驅動程式,它實現了特定物理設備的介面。
因此,用戶和進程不需要知道文件所在的文件系統類型,而只需要象使用 Ext2 文件系統中的文件一樣使用它們。
4. 設備驅動程式
設備驅動程式是 Linux 內核的主要部分。和操作系統的其它部分類似,設備驅動程式運行在高特權級的處理器環境中,從而可以直接對硬體進行操作,但正因為如此,任何一個設備驅動程式的錯誤都可能導致操作系統的崩潰。設備驅動程式實際控制操作系統和硬體設備之間的交互。設備驅動程式提供一組操作系統可理解的抽象介面完成和操作系統之間的交互,而與硬體相關的具體操作細節由設備驅動程式完成。一般而言,設備驅動程式和設備
的控制晶元有關,例如,如果電腦硬碟是 SCSI 硬碟,則需要使用 SCSI 驅動程式,而不是 IDE 驅動程式。
5.網路介面(NET)
提供了對各種網路標準的存取和各種網路硬體的支持。網路介面可分為網路協議和網路驅動程式。網路協議部分負責實現每一種可能的網路傳輸協議。眾所周知,TCP/IP 協議是 Internet 的標準協議,同時也是事實上的工業標準。Linux 的網路實現支持 BSD 套接字,支持全部的TCP/IP協議。Linux內核的網路部分由BSD套接字、網路協議層和網路設備驅動程式組成。
網路設備驅動程式負責與硬體設備通訊,每一種可能的硬體設備都有相應的設備驅動程式。
2 . linux shell
shell是系統的用戶界面,提供了用戶與內核進行交互操作的一種介面。它接收用戶輸入的命令並把它送入內核去執行,是一個命令解釋器。另外,shell編程語言具有普通編程語言的很多特點,用這種編程語言編寫的shell程式與其他應用程式具有同樣的效果。
目前主要有下列版本的shell。
1.Bourne Shell:是貝爾實驗室開發的。
2.BASH:是GNU的Bourne Again Shell,是GNU操作系統上預設的shell,大部分linux的發行套件使用的都是這種shell。
3.Korn Shell:是對Bourne SHell的發展,在大部分內容上與Bourne Shell相容。
4.C Shell:是SUN公司Shell的BSD版本。
3 . linux 文件系統
各操作系統使用的文件系統並不相同,例如,Windows 98 以前的微軟操作系統使用 FAT(FAT16)文件系統,Windows 2000 以後的版本使用 NTFS 文件系統,而 Linux 的正統文件系統是 Ext2。
在 CentOS 6.3 系統中,預設的文件系統是 Ext4,它是 Ext3(Ext2) 文件系統的升級版,在性能、伸縮性和可靠性方面進行了大量改進,變化可以說是翻天覆地的,比如:
- 向下相容 Ext3;
- 最大 1EB 文件系統和 16TB 文件;
- 無限數量子目錄;
- Extents 連續數據塊概念;
- 多塊分配、延遲分配、持久預分配;
- 快速 FSCK、日誌校驗、無日誌模式、線上碎片整理、inode 增強、預設啟用 barrier 等;
Linux支持的常見文件系統
Linux 系統能夠支持的文件系統非常多,除 Linux 預設文件系統 Ext2、Ext3 和 Ext4 之外,還能支持 fat16、fat32、NTFS(需要重新編譯內核)等 Windows 文件系統。也就是說,Linux 可以通過掛載的方式使用 Windows 文件系統中的數據。Linux 所能夠支持的文件系統在 "/usr/src/kemels/當前系統版本/fs" 目錄中(需要在安裝時選擇),該目錄中的每個子目錄都是一個可以識別的文件系統。我們介紹較為常見的 Linux 支持的文件系統,如表 1 所示。
文件系統 | 描 述 |
Ext | Linux 中最早的文件系統,由於在性能和相容性上具有很多缺陷,現在已經很少使用 |
Ext2 | 是 Ext 文件系統的升級版本,Red Hat Linux 7.2 版本以前的系統預設都是 Ext2 文件系統。於 1993 年發佈,支持最大 16TB 的分區和最大 2TB 的文件(1TB=1024GB=1024x1024KB) |
Ext3 | 是 Ext2 文件系統的升級版本,最大的區別就是帶日誌功能,以便在系統突然停止時提高文件系統的可靠性。支持最大 16TB 的分區和最大 2TB 的文件 |
Ext4 |
是 Ext3 文件系統的升級版。Ext4 在性能、伸縮性和可靠性方面進行了大量改進。Ext4 的變化可以說是翻天覆地的,比如向下相容 Ext3、最大 1EB 文件系統和 16TB 文件、無限數量子目錄、Extents 連續數據塊 概念、多塊分配、延遲分配、持久預分配、快速 FSCK、日誌校驗、無日誌模式、線上碎片整理、inode 增強、預設啟用 barrier 等。它是 CentOS 6.3 的預設文件系統 |
swap | swap 是 Linux 中用於交換分區的文件系統(類似於 Windows 中的虛擬記憶體),當記憶體不夠用時,使用交換分區暫時替代記憶體。一般大小為記憶體的 2 倍,但是不要超過 2GB。它是 Linux 的必需分區 |
NFS | NFS 是網路文件系統(Network File System)的縮寫,是用來實現不同主機之間文件共用的一種網路服務,本地主機可以通過掛載的方式使用遠程共用的資源 |
iso9660 | 光碟的標準文件系統。Linux 要想使用光碟,必須支持 iso9660 文件系統 |
fat | 就是 Windows 下的 fatl6 文件系統,在 Linux 中識別為 fat |
vfat | 就是 Windows 下的 fat32 文件系統,在 Linux 中識別為 vfat。支持最大 32GB 的分區和最大 4GB 的文件 |
NTFS | 就是 Windows 下的 NTFS 文件系統,不過 Linux 預設是不能識別 NTFS 文件系統的,如果需要識別,則需要重新編譯內核才能支持。它比 fat32 文件系統更加安全,速度更快,支持最大 2TB 的分區和最大 64GB 的文件 |
ufs | Sun 公司的操作系統 Solaris 和 SunOS 所採用的文件系統 |
proc | Linux 中基於記憶體的虛擬文件系統,用來管理記憶體存儲目錄 /proc |
sysfs | 和 proc —樣,也是基於記憶體的虛擬文件系統,用來管理記憶體存儲目錄 /sysfs |
tmpfs | 也是一種基於記憶體的虛擬文件系統,不過也可以使用 swap 交換分區 |
文件系統詳解:https://blog.csdn.net/hguisu/article/details/7401963
4 . 用戶態和內核態
應用程式是無法直接訪問硬體資源的,需要通過通過內核SCI 層提供的介面來訪問硬體資源。
Linux系統將自身劃分為兩部分,一部分為核心軟體,即是kernel,也稱作內核空間,另一部分為普通應用程式,這部分稱為用戶空間。
區分用戶空間和內核空間的目的是為確保系統安全。在CPU的所有指令中,有一些指令是非常危險的,如果錯用,將導致整個系統崩潰。比如:清記憶體、設置時鐘等。因為如果應用程式和內核在同一個保護級別,那麼應用程式就有可能有意或者不小心進入了內核空間,破壞了內核空間的代碼和數據,系統崩潰就不足為奇。所以CPU將指令分為特權指令和非特權指令,對於那些危險的指令,只允許操作系統及其相關模塊使用,普通的應用程式只能使用那些不會造成災難的指令。Intel的CPU將特權級別分為4個級別:RING0,RING1,RING2,RING3, 內核空間級別為“RING0”, 用戶空間級別為RING3。
linux的內核是一個有機的整體。每一個用戶進程運行時都好像有一份內核的拷貝,每當用戶進程使用系統調用時,都自動地將運行模式從用戶級轉為內核級,此時進程在內核的地址空間中運行。
當應用程式進程執行系統調用而陷入內核代碼中執行時,我們就稱進程處於內核運行態(或簡稱為內核態)。此時處理器處於特權級最高的(RING0級)內核代碼中執行。當進程處於內核態時,執行的內核代碼會使用當前進程的內核棧。每個進程都有自己的內核棧。當進程在執行用戶自己的代碼時,則稱其處於用戶運行態(用戶態)。即此時處理器在特權級最低的(RING3級)用戶代碼中運行。當正在執行用戶程式而突然被中斷程式中斷時,此時用戶程式也可以象徵性地稱為處於進程的內核態。因為中斷處理程式將使用當前進程的內核棧。這與處於內核態的進程的狀態有些類似。
內核態與用戶態是操作系統的兩種運行級別,跟intel cpu沒有必然的聯繫, 如上所提到的intel cpu提供Ring0-Ring3四種級別的運行模式,Ring0級別最高,Ring3最低。Linux使用了Ring3級別運行用戶態,Ring0作為 內核態,沒有使用Ring1和Ring2。
內核空間和用戶空間
x86 CPU採用了段頁式地址映射模型。進程代碼中的地址為邏輯地址,經過段頁式地址映射後,才真正訪問物理記憶體。
通常32位Linux內核地址空間劃分0~3G為用戶空間,3~4G為內核空間。64位內核地址空間劃分是不同的。
32位與64位具體地址分佈如下圖:
64位地址時將0x0000,0000,0000,0000 – 0x0000,7fff,ffff,f000這128T地址用於用戶空間。參見定義:
#define TASK_SIZE_MAX ((1UL << 47) - PAGE_SIZE),註意這裡還減去了一個頁面的大小做為保護。
而0xffff,8000,0000,0000以上為系統空間地址。註意:該地址前4個都是f,這是因為目前實際上只用了64位地址中的48位(高16位是沒有用的),而從地址0x0000,7fff,ffff,ffff到0xffff,8000,0000,0000中間是一個巨大的空洞,是為以後的擴展預留的。
而真正的系統空間的起始地址,是從0xffff,8800,0000,0000開始的,參見:
#define __PAGE_OFFSET _AC(0xffff,8800,0000,0000, UL)
而32位地址時系統空間的起始地址為0xC000,0000。
另外0xffff,8800,0000,0000 – 0xffff,c7ff,ffff,ffff這64T直接和物理記憶體進行映射,0xffff,c900,0000,0000 – 0xffff,e8ff,ffff,ffff這32T用於vmalloc/ioremap的地址空間。
而32位地址空間時,當物理記憶體大於896M時(Linux2.4內核是896M,3.x內核是884M,是個經驗值),由於地址空間的限制,內核只會將0~896M的地址進行映射,而896M以上的空間用做一些固定映射和vmalloc/ioremap。而64位地址時是將所有物理記憶體都進行映射。
內核態與用戶態
用戶態Ring3狀態不能訪問內核態Ring0的地址空間,包括代碼和數據。(例如32位Linux進程的4GB地址空間,3G-4G部 分大家是共用的,是內核態的地址空間,這裡存放在整個內核的代碼和所有的內核模塊,以及內核所維護的數據)。用戶運行一個程式,該程式所創建的進程開始是運行在用戶態的,如果要執行文件操作,網路數據發送等操作,必須通過write,send等系統調用,這些系統調用會調用內核中的代碼來完成操作,這時,必 須切換到Ring0,然後進入內核地址空間去執行這些代碼完成操作,完成後,切換回Ring3,回到用戶態。這樣,用戶態的程式就不能 隨意操作內核地址空間,具有一定的安全保護作用。
處理器總處於以下狀態中的一種:
1、內核態,運行於進程上下文,內核代表進程運行於內核空間;
2、內核態,運行於中斷上下文,內核代表硬體運行於內核空間;
3、用戶態,運行於用戶空間。
從用戶空間到內核空間有兩種觸發手段:
1.系統調用:
用戶空間的應用程式,通過系統調用,進入內核空間。這個時候用戶空間的進程要傳遞很多變數、參數的值給內核,內核態運行的時候也要保存用戶進程的一些寄存器值、變數等。所謂的“進程上下文”,可以看作是用戶進程傳遞給內核的這些參數以及內核要保存的那一整套的變數和寄存器值和當時的環境等。
2.中斷:
硬體通過觸發信號,導致內核調用中斷處理程式,進入內核空間。例如網卡發送一個數據包或硬碟驅動器提供一次 IO 請求等。這個過程中,硬體的一些變數和參數也要傳遞給內核,內核通過這些參數進行中斷處理。所謂的“中斷上下文”,其實也可以看作就是硬體傳遞過來的這些參數和內核需要保存的一些其他環境(主要是當前被打斷執行的進程環境)。
————————————————
版權聲明:本文為CSDN博主「規速」的原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/hguisu/article/details/6122513