本書從理解計算機硬件的核心工作機制(存儲程序計算機和函數(shù)調用堆棧)和用戶態(tài)程序如何通過系統(tǒng)調用陷入內(nèi)核(中斷異常)入手,通過上下兩個方向雙向夾擊的策略,并利用實際可運行程序的反匯編代碼從實踐的角度理解操作系統(tǒng)內(nèi)核,分析Linux內(nèi)核源代碼,從系統(tǒng)調用陷入內(nèi)核、進程調度與進程切換開始,*后返回到用戶態(tài)進程。
本書配有豐富的實驗指導材料和練習,適合作為高等院校計算機相關專業(yè)的指導用書,也適合Linux操作系統(tǒng)開發(fā)人員自學。
基于本書內(nèi)容的在線視頻課程Linux操作系統(tǒng)分析被教育部評為國家精品在線開放課程,被教育部高等學校計算機類專業(yè)教學指導委員會評為2018年度中國高校計算機教育慕課聯(lián)盟優(yōu) 秀在線開放課程。
孟寧,高校教師、資 深碼農(nóng),主講課程獲國家精品在線開放課程認定。在讀行學、網(wǎng)易云課堂、學堂在線、實驗樓等在線教育平臺的累計注冊學員達10萬余人次,專注于Linux內(nèi)核、互聯(lián)網(wǎng)架構、軟件工程、區(qū)塊鏈、人工智能等技術領域,與華為、IBM等多家國內(nèi)外知名企業(yè)和創(chuàng)業(yè)公司有技術合作。
婁嘉鵬,高校教師,曾榮獲北京市優(yōu) 秀教師,藍墨云平臺北京市十大魅力教師等稱號,講授Java程序設計、Linux內(nèi)核原理與分析、網(wǎng)絡攻防實戰(zhàn)、移動平臺開發(fā)等課程,研究方向包括Linux內(nèi)核及安全、密碼系統(tǒng)、軟件工程等。
劉宇棟,高校教師,主要研究方向包括網(wǎng)絡攻防技術、系統(tǒng)安全、社交網(wǎng)絡分析等。并講授操作系統(tǒng)、Linux內(nèi)核原理與分析、網(wǎng)絡對抗技術等課程。
第 1章 計算機工作原理 1
1.1 存儲程序計算機工作模型
1
1.2 x86-32匯編基礎 3
1.2.1 x86-32 CPU的寄存器 4
1.2.2 數(shù)據(jù)格式 6
1.2.3 尋址方式和常用匯編指令 7
1.2.4 匯編代碼范例解析 11
1.3 匯編一個簡單的C語言程序并分析其匯編指令執(zhí)行過程 13
1.4 單元測試題 26
1.5 實驗 27
第 2章 操作系統(tǒng)是如何工作的 29
2.1 函數(shù)調用堆棧 29
2.2 借助Linux內(nèi)核部分源代碼模擬存儲程序計算機工作模型及時鐘中斷 32
2.2.1 內(nèi)嵌匯編 32
2.2.2 虛擬一個x86的CPU硬件平臺 34
2.3 在mykernel基礎上構造一個簡單的操作系統(tǒng)內(nèi)核 36
2.3.1 代碼范例 36
2.3.2 代碼分析 42
2.4 單元測試題 48
2.5 實驗 48
第3章 MenuOS的構造 50
3.1 Linux內(nèi)核源代碼簡介
50
3.2 構造一個簡單的Linux內(nèi)核 56
3.3 跟蹤調試Linux內(nèi)核的啟動過程 60
3.4 單元測試題 65
3.5 實驗 66
第4章 系統(tǒng)調用的三層機制(上) 67
4.1 用戶態(tài)、內(nèi)核態(tài)和中斷
67
4.2 系統(tǒng)調用概述 70
4.2.1 操作系統(tǒng)提供的API和系統(tǒng)調用的關系 70
4.2.2 觸發(fā)系統(tǒng)調用及參數(shù)傳遞方式 71
4.3 使用庫函數(shù)API和C代碼中嵌入?yún)R編代碼觸發(fā)同一個系統(tǒng)調用 72
4.3.1 使用庫函數(shù)API觸發(fā)一個系統(tǒng)調用 72
4.3.2 內(nèi)嵌匯編語法簡介 73
4.3.3 C代碼中嵌入?yún)R編代碼觸發(fā)一個系統(tǒng)調用 75
4.3.4 含兩個參數(shù)的系統(tǒng)調用范例 76
4.3.5 通用的觸發(fā)系統(tǒng)調用的庫函數(shù)syscall 78
4.4 單元測試題 79
4.5 實驗 80
第5章 系統(tǒng)調用的三層機制(下) 81
5.1 給MenuOS增加命令 81
5.2 使用gdb跟蹤系統(tǒng)調用內(nèi)核函數(shù)sys_time 83
5.3 系統(tǒng)調用在內(nèi)核代碼中的處理過程 85
5.3.1 中斷向量0x80和system_call中斷服務程序入口的關系 86
5.3.2 在system_call匯編代碼中的系統(tǒng)調用內(nèi)核處理函數(shù) 87
5.3.3 整體上理解系統(tǒng)調用的內(nèi)核處理過程 88
5.4 單元測試題 91
5.5 實驗 92
第6章 進程的描述和進程的創(chuàng)建 93
6.1 進程的描述 93
6.2 進程的創(chuàng)建 97
6.2.1 0號進程的初始化
98
6.2.2 內(nèi)存管理相關代碼
99
6.2.3 進程之間的父子、兄弟關系 100
6.2.4 保存進程上下文中CPU相關的一些狀態(tài)信息的數(shù)據(jù)結構 101
6.2.5 進程的創(chuàng)建過程分析
103
6.3 單元測試題 120
第7章 可執(zhí)行程序工作原理 122
7.1 ELF目標文件格式
122
7.1.1 ELF概述 122
7.1.2 ELF格式簡介
123
7.1.3 相關操作指令 128
7.2 程序編譯 129
7.2.1 預處理 129
7.2.2 編譯 130
7.2.3 匯編 131
7.2.4 鏈接 133
7.3 鏈接與庫 134
7.3.1 符號與符號解析
134
7.3.2 重定位 137
7.3.3 靜態(tài)鏈接與動態(tài)鏈接
139
7.4 程序裝載 143
7.4.1 程序裝載概要 143
7.4.2 fork與execve內(nèi)核處理過程 148
7.4.3 莊周夢蝶 153
7.4.4 小結 154
7.5 單元測試題 155
7.6 實驗 156
第8章 進程的切換和系統(tǒng)的一般執(zhí)行過程 158
8.1 進程調度的時機 158
8.1.1 硬中斷與軟中斷
158
8.1.2 進程調度時機 159
8.2 調度策略與算法 161
8.2.1 進程的分類 161
8.2.2 調度策略 162
8.2.3 CFS調度算法
164
8.3 進程上下文切換 165
8.3.1 進程執(zhí)行環(huán)境的切換
165
8.3.2 核心代碼分析 167
8.4 Linux系統(tǒng)的運行過程
172
8.5 Linux系統(tǒng)構架與執(zhí)行過程概覽 174
8.5.1 Linux操作系統(tǒng)的構架 174
8.5.2 ls命令執(zhí)行過程即涉及操作系統(tǒng)相關概念 175
8.6 進程調度相關源代碼跟蹤和分析 176
8.6.1 配置運行MenuOS系統(tǒng) 176
8.6.2 配置gdb遠程調試和設置斷點 177
8.6.3 使用gdb跟蹤分析schedule()函數(shù) 177
8.7 單元測試題 179