操作系統概述
什麼是操作系統?
沒有公認定義,可以理解爲起協助作用的控制程序,或者是介於軟硬件之間的資源管理器。
操作系統軟件組成
-
Shell 命令行接口
- 通過鍵盤操縱
- 方便用戶進行命令輸入
-
GUI 圖形用戶接口
- WIMP
視窗(windows)、t圖標(icon)、選單(menu)、指標(pointer) - 直接操作、所見即所得
- WIMP
-
Kernel 操作系統內核
- 執行各種資源管理等功能
操作系統內核
- 併發:計算機系統中同時存在多個運行的程序,需要 OS 管理和調度
- 共享:“同時”訪問(宏觀),互斥共享(微觀:對資源進行隔離保護)
- 虛擬:高頻率交替(多道程序設計技術),使用戶感覺在專用系統
- 異步:程序執行時間難於預測,運行環境相同時,os需要保證輸出結果相同
系統類型
- UNIX(開放):UNIX BSD、Mac OS等
- Linux(與UNIX同一類,API兼容或類似,開放程度更完整):Ubuntu、安卓等
- Windows(專用和封閉,圖形用戶接口,易用)
操作系統主要功能:硬件抽象和協調管理
操作系統的演變
- 單用戶系統
- 批處理系統
- 多程序系統
- 分時
- 個人計算機:每個用戶一個系統
- 分佈式計算:每個用戶多個系統
操作系統結構
- 簡單結構:無模塊劃分,主要彙編,不可移植
- 分層結構:
- 將操作系統分爲多層(levels)
- 每層建立在底層之上
- 最底層(layer 0)是硬件
- 最高層(layer N)是用戶界面
- 每一層僅使用更低一層的功能(操作)和服務
- 將操作系統分爲多層(levels)
- 微內核結構(Microkernel):
- 儘可能把內核功能移到用戶空間
- 用戶模塊間的通信使用消息傳遞
- 好處:靈活、安全
- 缺點:性能
- 外核結構(Exokernel):
- 內核少放東西,資源管理由應用態代碼完成,一個系統支起不同的操作系統服務
- 讓內核分配機器的物理資源給多個應用程序,並讓每個程序決定如何處理這些資源
- 程序能鏈接到操作系統庫(libOS)實現了操作系統抽象
- 保護和控制隔離
- VMM(虛擬機管理器,非操作系統結構):
- 負責和硬件接觸(隔離資源),操作系統負責資源管理
- 虛擬機管理器將單獨的機器接口轉換成很多的虛擬機,每個虛擬機都是一個原始計算機系統的有效副本,並能完成所有的處理器指令
對於主流操作系統的結構分析
-
Windows
Windows 屬於比較接近微內核的混合內核結構,這樣的結構有一個特點,那就是驅動是單獨分發的,並不會和 Windows 的微內核混合在一起。因此,其驅動配置比較簡單,無需改動 Windows 內核代碼。 -
Linux
Linux是一個宏內核的結構,在保留了微內核結構優點的基礎上進行了優化。Linux的驅動和內核是整合在一起的,要適配某種硬件,得把驅動都整合進Linux內核。它是模塊化的、多線程的以及內核本身可調度的操作系統。Linux 僅僅是一個單塊內核,單個內核負責管理 CPU、內存、進程間通信、設備驅動程序、文件系統和系統服務器調用。 -
Mac OS
Mac OS 的內核(XNU)結合了微內核(Mach)和單片內核的(BSD)的特性。根據蘋果公司的 Github 頁面,XNU 是將卡耐基梅隆大學開發的 Mach 內核和 FreeBSD 組件整合而成的混合內核,加上用於編寫驅動程序的 C++ API。代碼的 BSD 子系統部分在微內核系統中,通常實現爲用戶空間的服務。Mach 部分負責底層工作,例如多任務、內存保護、虛擬內存管理、內核調試支持和控制檯 I/O。
啓動、中斷、異常和系統調用
BIOS啓動固件
基本功能:
- 基本輸入輸出的程序
- 系統設置信息
- 開機後自檢程序
- 系統自啓程序等
BIOS 系統調用:
- BIOS 以中斷調用的方式提供了基本的 I/O 功能
- INT 10h:字符顯示
- INT 13h:磁盤扇區讀寫
- INT 15h:檢測內存大小
- INT 16h:鍵盤輸入
- 只能在 x86 的實模式下訪問
系統啓動流程
- CPU 初始化
- CPU 加電穩定後從 0XFFFF0 讀第一條指令
- CS:IP = 0xf000:fff0
- 第一條指令是跳轉指令
- CPU 初始狀態爲16位實模式
- CS:IP 是16位寄存器
- 指令指針 PC = 16 * CS + IP
- 最大地址空間是 1MB
- CPU 加電穩定後從 0XFFFF0 讀第一條指令
- BIOS 初始化
- 硬件自檢 POST
- 檢測系統中內存和顯卡等關鍵部件的存在和工作狀態
- 查找並執行顯卡等接口卡 BIOS ,進行設備初始化
- 執行系統 BIOS ,進行系統檢測,檢測和配置系統中安裝的即插即用設備
- 更新 CMOS 中的擴展系統配置數據 ESCD
- 按指定啓動順序從軟盤、硬盤或光驅啓動
- 主引導記錄 MBR 格式
- 啓動代碼:446字節
- 檢查分區表正確性
- 加載並跳轉到磁盤上的引導程序
- 硬盤分區表:64字節
- 描述分區狀態和位置
- 每個分區描述信息佔據16字節
- 結束標誌字:2字節 (55AA)
- 主引導記錄的有效標誌
- 啓動代碼:446字節
- 分區引導扇區格式
- 跳轉指令:跳轉到啓動代碼
- 與平臺相關代碼
- 文件卷頭:文件系統描述信息
- 啓動代碼:跳轉到加載程序
- 結束標誌:55AA
- 跳轉指令:跳轉到啓動代碼
- 加載程序(bootloader)
系統啓動規範
- BIOS
- 固化到計算機主板上的程序
- 包括系統設置、自檢程序和系統自啓動程序
- BIOS-MBR、BIOS-GPT、PXE
- UEFI
- 接口標準
- 在所有平臺上一致的操作系統啓動服務
中斷、異常和系統調用
- 系統調用 (system call)
- 應用程序主動向操作系統發出的服務請求
- 異常
- 非法指令或者其他原因導致當前指令執行失敗 (如:內存出錯)後的處理請求
- 中斷
- 來自硬件設備的處理請求
- 區別:
- 源頭
- 中斷:外設
- 異常:應用程序意想不到的行爲
- 系統調用:應用程序請求操作提供服務
- 響應方式
- 中斷:異步
- 異常:同步
- 系統調用:同步或異步
- 處理機制
- 中斷:持續,對用戶應用程序是透明的
- 異常:殺死或者重新執行意想不到的應用程序指令
- 系統調用:等待和持續
- 源頭
中斷處理機制
- 硬件處理
- 在 CPU 初始化時設置中斷使能的標誌
- 依據內部或外部事件設置中斷標誌
- 依據中斷向量調用相應中斷的服務例程
- 在 CPU 初始化時設置中斷使能的標誌
- 軟件
- 現場保存(編譯器)
- 中斷服務處理(服務例程)
- 清除中斷標記(服務例程)
- 現場恢復(編譯器)
- 中斷嵌套
- 硬件中斷服務例程可被打斷
- 不同硬件中斷源可能硬件中斷處理時出現
- 硬件中斷服務例程中需要臨時禁止中斷請求
- 中斷請求會保持到 CPU 做出響應
- 異常處理例程可被打斷
- 異常服務例程執行時可能出現硬件中斷
- 異常服務例程可嵌套
- 異常服務例程可能出現缺頁
- 硬件中斷服務例程可被打斷
系統調用的外界使用
- 操作系統服務的編程接口
- 通常由高級語言編寫 (C 或者 C++)
- 程序訪問通常是通過高層次的 API 接口而不是直接進行系統調用
- 三種最常用的應用程序編程接口 (API)
- Win32 API 用於 Windows
- POSIX API 用於 POSIX-based systems (包括 UNIX, LINUX, Mac OS X的所有版本)
- Java API 用於 JAVA 虛擬機 (JVM)
系統調用的內部實現
- 每個系統調用對應一個系統調用號
- 系統調用接口根據系統調用號來維護表的索引
- 系統調用接口調用內核態中的系統調用功能實現,並返回系統調用的狀態和結果
- 用戶不需要知道系統調用的實現
- 需要設置調用參數和獲取返回結果
- 操作系統接口的細節大部分都隱藏在應用編程接口後
- 通過運行程序支持的庫來管理
函數調用和系統調用的不同處
- 系統調用
- INT 和 IRET 指令用於系統調用
- 系統調用時,堆棧切換和特權級的轉換
- INT 和 IRET 指令用於系統調用
- 函數調用
- CALL 和 RET 用於常規調用
- 常規調用時沒有堆棧切換
- CALL 和 RET 用於常規調用
中斷、異常和系統調用的開銷
系統調用比函數調用更安全,但是系統調用的開銷超過函數調用。
中斷、異常和系統調用具體開銷:
- 引導機制
- 建立內核堆棧
- 驗證參數
- 內核態映射到用戶態的地址空間
- 更新頁面映射權限
- 內核態獨立地址空間
- TLB
內存層次
操作系統的內存管理
操作系統的內存管理方式
- 操作系統中採用的內存管理方式
- 重定位 ( relocation )
- 分段 ( segmentation )
- 分頁 ( paging )
- 虛擬存儲 ( virtual memory )
- 目前多數系統(如 Linux )採用按需頁式虛擬存儲
- 實現高度依賴硬件
- 與計算機存儲架構緊耦合
- MMU(內存管理單元):處理 CPU 存儲訪問請求的硬件