買這商品的人也買了...
-
$356自己動手寫編譯器、鏈接器
-
$734操作系統真象還原
-
$507現代編譯原理 C語言描述 (修訂版)
-
$714$678 -
$894$849 -
$719$683 -
$880$695 -
$594$564 -
$419$398 -
$505Android 系統性能優化:卡頓、穩定性與續航
-
$602趣話計算機底層技術
-
$534$507 -
$534$507 -
$407程序員的制勝技
-
$534$507 -
$505穿越作業系統迷霧:從零實現作業系統
-
$414$393 -
$539$512 -
$764高級算法和數據結構
-
$528$502 -
$580$458 -
$505LangChain 入門指南:構建高可復用、可擴展的 LLM 應用程序
-
$1,010Linux 核心完全註釋
-
$600$474 -
$811深入理解Kubernetes源碼
相關主題
商品描述
用讀一本小說的心態來閱讀本書,你會對整個操作系統的體系結構和邏輯細節有非常清晰的認識,從此愛上並閱讀更多的操作系統源碼。第1部分:進入內核前的苦力活。覆蓋從開機到運行到Linux中的main函數的關鍵流程解析,幫你清晰認識Intel CPU的體系結構。第2部分:“大戰”前期的初始化工作。講述main中的各種初始化函數,這些函數是操作系統各個模塊的交互橋梁,為理解後續操作系統各個模塊的運作原理打好基礎。第3部分:一個新進程的誕生。講述從內核態切換至用戶態,並建立起第一個用戶進程的全部過程。學完這部分,你將會理解一個多進程的操作系統是如何建立和運作的。第4部分:shell程序的到來。主要討論如何將磁盤中存儲的shell程序加載到內存中來,並最終交給CPU去執行。通過這個過程你會看清一個程序從存儲到硬盤到最終被執行的全部過程。第5部分:一條shell命令的執行。讓我們跟著一條shell命令“走南闖北”,從用戶輸入給電腦一個字符串開始,一直到該程序的最終執行,這一過程能幫你把前面所學的知識融會貫通,整個操作系統的啟動流程與運作原理,將會生動形象地浮現在你的腦海中。
目錄大綱
第1 部分 進入內核前的苦力活
第1回 最開始的兩行代碼 / 2
開機後初始化指向BIOS / 3
讀取硬盤啟動區(第一扇區) / 4
加載到內存 0x7c00 位置,並跳轉到這里 / 5
第2回 從0x7c00 到0x90000 / 8
第3回 做好訪問內存的基礎準備工作 / 13
這些寄存器是乾什麽的 / 14
CPU 訪問內存的三種途徑 / 15
再次回顧一下前三回的內容 / 16
第4回 把全部的操作系統代碼從硬盤搬到內存 / 17
把剩下的操作系統代碼從硬盤請到內存 / 17
聊聊操作系統的編譯過程 / 21
挪來挪去的真討厭 / 22
擴展閱讀:什麽是中斷 / 23
擴展閱讀:什麽是軟中斷 / 38
第5回 將重要的操作系統代碼放在零地址處 / 48
第6回 解決段寄存器的歷史包袱問題 / 56
保護模式下的物理地址計算方式 / 57
全局描述符表 / 59
第7回 六行代碼進入保護模式 / 63
第8回 重新設置中斷描述符表與全局描述符表 / 69
第9回 開啟分頁機制 / 75
第10 回 進入main 函數前的最後一躍 / 86
第1 部分總結與回顧 / 92
第2 部分 “大戰”前期的初始化工作
第11 回 整個操作系統就二十幾行代碼 / 98
第12 回 管理內存前先劃分出三個邊界值 / 103
第13 回 主內存初始化mem_init / 106
第14 回 中斷初始化trap_init / 110
第15 回 塊設備請求項初始化blk_dev_init / 116
第16 回 控制台初始化tty_init / 123
第17 回 時間初始化time_init / 132
第18 回 進程調度初始化sched_init / 138
第19 回 緩沖區初始化buffer_init / 147
第20 回 硬盤初始化hd_init / 155
第2 部分總結與回顧 / 159
第3 部分 一個新進程的誕生
第21 回 第3 部分全局概述 / 172
move_to_user_mode / 173
fork / 174
init / 174
pause / 175
第22 回 從內核態切換到用戶態 / 176
讓進程無法跳出用戶態 / 176
內核態與用戶態的本質—特權級 / 177
特權級轉換的方式 / 178
除了改變特權級還做了哪些事 / 181
第23 回 如果讓你來設計進程調度 / 184
整體流程設計 / 185
上下文環境 / 186
運行時間信息 / 188
優先級 / 188
進程狀態 / 189
第24 回 從一次定時器滴答來看進程調度 / 192
第25 回 通過fork 看一次系統調用 / 197
第26 回 fork 函數中進程基本信息的復制 / 205
第27 回 透過fork 來看進程的內存規劃 / 213
LDT 的賦值 / 214
頁表的復制 / 217
第28 回 番外篇——我居然會認為權威著作寫錯了 / 221
第29 回 番外篇——寫時復制就這麽幾行代碼 / 227
儲備知識 / 227
寫時復制的本質 / 230
看看代碼是怎麽寫的 / 232
第30 回 番外篇——你管這破玩意兒叫文件系統 / 237
第3 部分總結與回顧 / 251
第4 部分展望 / 254
第4 部分 shell 程序的到來
第31 回 拿到硬盤信息 / 258
第32 回 加載根文件系統 / 264
硬盤中的文件系統格式是怎樣的 / 266
內存中用於文件系統的數據結構有哪些 / 267
第33 回 打開終端設備文件 / 272
第34 回 進程2 的創建 / 281
fork / 282
close / 285
open / 285
execve / 286
第35 回 execve 加載並執行shell 程序 / 287
讀取文件開頭 1KB 的數據 / 289
將這 1KB 的數據解析為 exec 結構 / 290
判斷是腳本文件還是可執行文件 / 291
準備參數空間 / 291
設置 eip 和 esp,完成搖身一變 / 296
電腦的世界沒有魔法 / 297
第36 回 缺頁中斷 / 301
跳轉到一個不存在的地址會發生什麽 / 302
缺頁中斷do_no_page / 304
缺頁中斷返回 / 309
第37 回 shell 程序跑起來了 / 311
第38 回 操作系統啟動完畢! / 317
第39 回 番外篇——調試Linux 最早期的代碼 / 322
整體思路和效果 / 322
第一步:配置虛擬機 / 324
第二步:安裝qemu / 324
第三步:下載並運行可調試的 Linux-0.11 源碼 / 325
第四步:通過 vscode 遠程調試 / 327
第40 回 番外篇——為什麽有些技術原理你怎麽看也看不懂 / 331
第4 部分總結與回顧 / 333
第5 部分 一條shell 命令的執行
第41 回 一條shell 命令的執行過程概述 / 338
第42 回 用鍵盤輸入一條命令 / 342
第43 回 shell 程序讀取你的命令 / 352
第44 回 進程的阻塞與喚醒 / 359
第45 回 解析並執行shell 命令 / 364
第46 回 讀硬盤數據全流程 / 375
如果讓你來設計這個函數 / 375
鳥瞰操作系統的讀操作函數 / 376
執行讀操作file_read / 382
第47 回 讀取硬盤數據的細節 / 391
第48 回 信號 / 400
第49 回 番外篇——為什麽你學得比別人慢 / 406
第5 部分總結與回顧 / 411