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
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/237482.html
標籤:其他
