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