用Kubernetes部署Springboot或Nginx,也就一個檔案的事
前言
請您根據本課程所學內容總結梳理出一個精簡的Linux系統概念模型,最大程度統攝整頓本課程及相關的知識資訊,模型應該是邏輯上可以運轉的、自洽的,並舉例某一兩個具體例子(比如讀寫檔案、分配記憶體、使用I/O驅動某個硬體等)納入模型中驗證模型。
談談您對課程的心得體會,改進建議等。
一、總結梳理出一個精簡的Linux系統概念模型
Linux系統一般有4個主要部分:核心、shell、檔案系統和應用程式。核心、shell和檔案系統一起形成了基本的作業系統結構,它們使得使用者可以執行程式、管理檔案並使用系統。
"三大法寶"和"兩把寶劍"
這是孟老師上課中的兩個生動比喻,三大法寶:儲存程式計算器、中斷、函式呼叫棧;兩把寶劍:中斷上下文和程序中斷上下文。
(1)中斷管理
核心的一個主要功能就是處理硬體外設I/O,中斷訊號提供了一種特殊的方式, 使得CPU轉去執行正常程式之外的程式碼,中斷會改變處理器執行指令的順序, 通常與CPU晶片內部或外部硬體電路產生的電訊號相對應。
初始化過程:
- 系統載入 start_kernel 開始,呼叫了 trap.c 中的 trap_init()函式對 中 斷 進 行 初 始 化 。 並且呼叫同一檔案下的set_trap_gate()/set_system_gate()/set_intr_gate()等對中斷描述符進行初始化。
- 在進入保護模式之前, IDT 再次通過 setup_idt()函式進行初始化,在這裡使用了 ignore_int()函式,是為了保護未初始化完成時發生異常不出錯。 然後呼叫 init_IRQ()函式,把中斷描述附表的中斷處理程式碼段地址設在在 interrupt 陣列中,該陣列指向同一個函式處理 common_interrup。
明確中斷髮生時, CPU 硬體級的中斷訊號處理過程 :
1. 確定與中斷或異常相關聯的向量 i
2. 讀取 idtr 暫存器的值,找到 IDT 的基址,通過查詢 IDT,找到第 i 項對應的內容。
3. 從 gdtr 暫存器獲得 GDT 的基地址,並在 GDT 中查詢,以讀取IDT 表項中的段選擇符所標識的段描述符。
4. 確定中斷是由授權的發生源發出的。
中斷:需要比較 CPL 和 GDT 中的 DPL。中斷處理程式的特
權不能低於引起中斷的程式的特權。
程式設計異常:需要比較 CPL 和 IDT 中的 DPL。
5. 檢查是否發生了特權級的變化,一般指的是使用者態陷入核心態。
儲存 ss 和 esp,並用新的堆疊的值填充。
6. 如果是故障,用引起故障的指令修改 cs 和 eip,以便異常處理後再次執行。
7. 在堆疊中儲存 eflags/cs/eip 的內容。
8. 如果有硬體出錯碼,則儲存。
9. 使用 IDT 中第 i 項中的段描述符和偏移量填充 cs 和 eip。
(2)檔案系統
地基(低層)由一排排的檔案櫃組成,井然有序。檔案櫃裡放置著“檔案”--電腦中的檔案。左上角,有一隻向前掛著421號牌的小企鵝。它表示這PID(程序ID)為421的程序,他正在檢視檔案櫃中的檔案,這代表系統中正有一個程序在訪問檔案系統。在右下角有一隻小狗,他是看門狗,這代表對檔案系統的監控,可以說整個linux系統都是構建在檔案系統之上的,Linux支援多種檔案系統,包括ext2、ext3、vfat等等。Linux採用虛擬檔案系統VFS來達到支援多種檔案系統格式的目標。VFS為各類檔案系統提供一個統一的操作介面和程式設計介面。向上提供統一的程式設計介面,向下對各種檔案系統進行相容。
Virtual File System這一層,是為了隱藏各個裝置之間的實現細節,向上提供統一的介面,試想,當我們通過mkfs.xxx系列命令建立了很多不同的檔案系統,但這些檔案系統都有各自的API介面,而使用者想要的是,不管你是什麼API,他們只關心mount/umount,或open/close等操作。
所以,VFS就把這些不同的檔案系統做一個抽象,提供統一的API訪問介面,這樣,使用者空間就不用關心不同檔案系統中不一樣的API了。VFS所提供的這些統一的API,再經過System Call包裝一下,使用者空間就可以經過SCI的系統呼叫來操作不同的檔案系統。
(3)程序
程序概念
從使用者角度:程序就是一個正在執行中的程式。
作業系統角度:作業系統執行一個程式,需要描述這個程式的執行過程,這個描述通過一個結構體task_struct{}來描述,統稱為PCB,因此對作業系統來說程序就是PCB(process control block)程式控制塊
程序的描述資訊有:識別符號PID,程序狀態,優先順序,程式計數器,上下文資料,記憶體指標,IO狀態資訊,記賬資訊。都需要作業系統進行排程。
程序建立
Linux中非常重要的函式——fork(),它從已存在的程序中建立一個新程序。新程序為子程序,而原程序為父程序。
#include <unistd.h> pid_t fork(void); 返回值: 父程序:返回值大於0,子程序的pid 子程序:返回值等於0
關於fork函式需要理解,每當呼叫一次fork函式時,會返回兩個兩次。一次是在呼叫程序中(父程序)返回一次,返回值是新派生的程序的程序ID。一次是在子程序中返回,返回值是0,代表當前程序為子程序。如果返回-1,那麼則代表在建立子程序的過程中出現了錯誤。
程序狀態
程序狀態一般有:就緒態,阻塞態,執行態
在Linux下:R執行狀態,S睡眠狀態,D磁碟休眠狀態,T停止狀態,X死亡狀態