關(guān)于我們
書單推薦
新書推薦
|
操作系統(tǒng)真象還原
本書共分16章,講解了開發(fā)一個操作系統(tǒng)需要的技術(shù)和知識,主要內(nèi)容有:操作系統(tǒng)基礎(chǔ)、部署工作環(huán)境、編寫MBR主引導(dǎo)記錄、完善MBR錯誤、保護模式入門、保護模式進階和向內(nèi)核邁進、中斷、內(nèi)存管理系統(tǒng)、線程、輸入輸出系統(tǒng)、用戶進程、完善內(nèi)核、編寫硬盤驅(qū)動程序、文件系統(tǒng)、系統(tǒng)交互等核心技術(shù)。
前百度高級工程師精心寫作。操作系統(tǒng)并不深奧,本書給予解讀。
歷時19個月,行文60余萬字,用6000多行代碼實現(xiàn)了一個完整的操作系統(tǒng)。 徹底剖析操作系統(tǒng)的原理,實現(xiàn)內(nèi)核線程、特權(quán)級變換、用戶進程、任務(wù)調(diào)度、文件系統(tǒng)等操作系統(tǒng)基本的組成單元。 用實際代碼解釋了鎖、信號量、生產(chǎn)者消費者問題。 實現(xiàn)了shell,幫助大家理解內(nèi)部命令、外部命令、管道等操作。 本書用詼諧幽默的語言,把深奧的操作系統(tǒng)盡量講解清楚,讀者在輕松閱讀中就學(xué)通了深奧的知識,學(xué)完后不但明白了操作系統(tǒng),讀者可以輕松自制一個操作系統(tǒng),是一本難得的好書。 本書適合操作系統(tǒng)快速入門并希望快速提高的讀者、具備一定基礎(chǔ)、但不能靈活運用的讀者、也適用于那些已經(jīng)在操作系統(tǒng)領(lǐng)域有一定造詣、但依然存在誤用的讀者 絕大多數(shù)技術(shù)人都對操作系統(tǒng)懷著好奇的心,他們渴望一本告訴操作系統(tǒng)到底是什么的書,里面不要摻雜太多無關(guān)的管理性的東西,代碼量不大且是現(xiàn)代操作系統(tǒng)雛形,渴望很快看到操作系統(tǒng)的本質(zhì)而不花費大量的時間成本。操作系統(tǒng)并不深奧,本書給予解讀。 鄭鋼,畢業(yè)于北京大學(xué),前百度運維高級工程師,對操作系統(tǒng)有深入的研究。好運動,喜鉆研,熱衷于嘗試前沿技術(shù),樂于分享學(xué)習(xí)成果。
第0章 一些你可能正感到迷惑的問題 1
0.1 操作系統(tǒng)是什么 1 0.2 你想研究到什么程度 2 0.3 寫操作系統(tǒng),哪些需要我來做 2 0.4 軟件是如何訪問硬件的 2 0.5 應(yīng)用程序是什么,和操作系統(tǒng)是如何 配合到一起的 3 0.6 為什么稱為“陷入”內(nèi)核 4 0.7 內(nèi)存訪問為什么要分段 4 0.8 代碼中為什么分為代碼段、數(shù)據(jù)段? 這和內(nèi)存訪問機制中的段是一回事嗎 6 0.9 物理地址、邏輯地址、有效地址、線性 地址、虛擬地址的區(qū)別 11 0.10 什么是段重疊 12 0.11 什么是平坦模型 12 0.12 cs、ds這類sreg段寄存器,位寬是 多少 12 0.13 什么是工程,什么是協(xié)議 13 0.14 為什么Linux系統(tǒng)下的應(yīng)用程序不能在 Windows系統(tǒng)下運行 14 0.15 局部變量和函數(shù)參數(shù)為什么要放在 棧中 14 0.16 為什么說匯編語言比C語言快 15 0.17 先有的語言,還是先有的編譯器,第1個 編譯器是怎么產(chǎn)生的 16 0.18 編譯型程序與解釋型程序的區(qū)別 19 0.19 什么是大端字節(jié)序、小端字節(jié)序 19 0.20 BIOS中斷、DOS中斷、Linux中斷的 區(qū)別 21 0.21 Section和Segment的區(qū)別 25 0.22 什么是魔數(shù) 29 0.23 操作系統(tǒng)是如何識別文件系統(tǒng)的 30 0.24 如何控制CPU的下一條指令 30 0.25 指令集、體系結(jié)構(gòu)、微架構(gòu)、編程 語言 30 0.26 庫函數(shù)是用戶進程與內(nèi)核的橋梁 33 0.27 轉(zhuǎn)義字符與ASCII碼 37 0.28 MBR、EBR、DBR和OBR各是 什么 39 第1章 部署工作環(huán)境 42 1.1 工欲善其事,必先利其器 42 1.2 我們需要哪些編譯器 42 1.2.1 世界頂級編譯器GCC 42 1.2.2 匯編語言編譯器新貴NASM 43 1.3 操作系統(tǒng)的宿主環(huán)境 43 1.3.1 什么是虛擬機 44 1.3.2 盜夢空間般的開發(fā)環(huán)境,虛擬機 中再裝一個虛擬機 45 1.3.3 virtualBox下載,安裝 46 1.3.4 Linux發(fā)行版下載 46 1.3.5 Bochs下載安裝 46 1.4 配置bochs 48 1.5 運行bochs 49 第2章 編寫MBR主引導(dǎo)記錄,讓我們開始 掌權(quán) 52 2.1 計算機的啟動過程 52 2.2 軟件接力第一棒,BIOS 52 2.2.1 實模式下的1MB內(nèi)存布局 52 2.2.2 BIOS是如何蘇醒的 54 2.2.3 為什么是0x7c00 56 2.3 讓MBR先飛一會兒 58 2.3.1 神奇好用的$和$$,令人迷惑的 section 58 2.3.2 NASM簡單用法 60 2.3.3 請下一位選手MBR同學(xué)做 準(zhǔn)備 60 第3章 完善MBR 65 3.1 地址、section、vstart淺嘗輒止 65 3.1.1 什么是地址 65 3.1.2 什么是section 67 3.1.3 什么是vstart 68 3.2 CPU的實模式 70 3.2.1 CPU的工作原理 71 3.2.2 實模式下的寄存器 72 3.2.3 實模式下內(nèi)存分段由來 76 3.2.4 實模式下CPU內(nèi)存尋址方式 78 3.2.5 棧到底是什么玩意兒 81 3.2.6 實模式下的ret 84 3.2.7 實模式下的call 85 3.2.8 實模式下的jmp 92 3.2.9 標(biāo)志寄存器flags 97 3.2.10 有條件轉(zhuǎn)移 99 3.2.11 實模式小結(jié) 101 3.3 讓我們直接對顯示器說點什么吧 101 3.3.1 CPU如何與外設(shè)通信—IO 接口 101 3.3.2 顯卡概述 105 3.3.3 顯存、顯卡、顯示器 106 3.3.4 改進MBR,直接操作顯卡 110 3.4 bochs調(diào)試方法 112 3.4.1 bochs一般用法 113 3.4.2 bochs調(diào)試實例 118 3.5 硬盤介紹 122 3.5.1 硬盤發(fā)展簡史 122 3.5.2 硬盤工作原理 123 3.5.3 硬盤控制器端口 126 3.5.4 常用的硬盤操作方法 128 3.6 讓MBR使用硬盤 129 3.6.1 改造MBR 130 3.6.2 實現(xiàn)內(nèi)核加載器 134 第4章 保護模式入門 136 4.1 保護模式概述 136 4.1.1 為什么要有保護模式 136 4.1.2 實模式不是32位CPU,變成了 16位 137 4.2 初見保護模式 137 4.2.1 保護模式之寄存器擴展 137 4.2.2 保護模式之尋址擴展 140 4.2.3 保護模式之運行模式反轉(zhuǎn) 141 4.2.4 保護模式之指令擴展 145 4.3 全局描述符表 150 4.3.1 段描述符 150 4.3.2 全局描述符表GDT、局部描述 符表LDT及選擇子 155 4.3.3 打開A20地址線 157 4.3.4 保護模式的開關(guān),CR0寄存器的 PE位 158 4.3.5 讓我們進入保護模式 158 4.4 處理器微架構(gòu)簡介 165 4.4.1 流水線 166 4.4.2 亂序執(zhí)行 168 4.4.3 緩存 168 4.4.4 分支預(yù)測 169 4.5 使用遠(yuǎn)跳轉(zhuǎn)指令清空流水線,更新段描述 符緩沖寄存器 172 4.6 保護模式之內(nèi)存段的保護 173 4.6.1 向段寄存器加載選擇子時的 保護 173 4.6.2 代碼段和數(shù)據(jù)段的保護 174 4.6.3 棧段的保護 175 第5章 保護模式進階,向內(nèi)核邁進 177 5.1 獲取物理內(nèi)存容量 177 5.1.1 學(xué)習(xí)Linux獲取內(nèi)存的方法 177 5.1.2 利用BIOS中斷0x15子功能 0xe820獲取內(nèi)存 177 5.1.3 利用BIOS中斷0x15子功能 0xe801獲取內(nèi)存 179 5.1.4 利用BIOS中斷0x15子功能 0x88獲取內(nèi)存 180 5.1.5 實戰(zhàn)內(nèi)存容量檢測 181 5.2 啟用內(nèi)存分頁機制,暢游虛擬空間 186 5.2.1 內(nèi)存為什么要分頁 186 5.2.2 一級頁表 188 5.2.3 二級頁表 192 5.2.4 規(guī)劃頁表之操作系統(tǒng)與用戶 進程的關(guān)系 197 5.2.5 啟用分頁機制 198 5.2.6 用虛擬地址訪問頁表 204 5.2.7 快表TLB(Translation Lookaside Buffer)簡介 206 5.3 加載內(nèi)核 207 5.3.1 用C語言寫內(nèi)核 207 5.3.2 二進制程序的運行方法 211 5.3.3 elf格式的二進制文件 213 5.3.4 elf文件實例分析 218 5.3.5 將內(nèi)核載入內(nèi)存 222 5.4 特權(quán)級深入淺出 229 5.4.1 特權(quán)級那點事 229 5.4.2 TSS簡介 230 5.4.3 CPL和DPL入門 232 5.4.4 門、調(diào)用門與RPL序 235 5.4.5 調(diào)用門的過程保護 240 5.4.6 RPL的前世今生 243 5.4.7 IO特權(quán)級 248 第6章 完善內(nèi)核 252 6.1 函數(shù)調(diào)用約定簡介 252 6.2 匯編語言和C語言混合編程 256 6.2.1 淺析C庫函數(shù)與系統(tǒng)調(diào)用 256 6.2.2 匯編語言和C語言共同協(xié)作 259 6.3 實現(xiàn)自己的打印函數(shù) 261 6.3.1 顯卡的端口控制 261 6.3.2 實現(xiàn)單個字符打印 265 6.3.3 實現(xiàn)字符串打印 275 6.3.4 實現(xiàn)整數(shù)打印 277 6.4 內(nèi)聯(lián)匯編 281 6.4.1 什么是內(nèi)聯(lián)匯編 281 6.4.2 匯編語言AT&T語法簡介 281 6.4.3 基本內(nèi)聯(lián)匯編 283 6.4.4 擴展內(nèi)聯(lián)匯編 284 6.4.5 擴展內(nèi)聯(lián)匯編之機器模式簡介 294 第7章 中斷 298 7.1 中斷是什么,為什么要有中斷 298 7.2 操作系統(tǒng)是中斷驅(qū)動的 299 7.3 中斷分類 299 7.3.1 外部中斷 299 7.3.2 內(nèi)部中斷 301 7.4 中斷描述符表 304 7.4.1 中斷處理過程及保護 306 7.4.2 中斷發(fā)生時的壓棧 308 7.4.3 中斷錯誤碼 310 7.5 可編程中斷控制器8259A 311 7.5.1 8259A介紹 311 7.5.2 8259A的編程 314 7.6 編寫中斷處理程序 319 7.6.1 從最簡單的中斷處理程序 開始 319 7.6.2 改進中斷處理程序 335 7.6.3 調(diào)試實戰(zhàn):處理器進入中斷時 壓棧出棧完整過程 339 7.7 可編程計數(shù)器/定時器8253簡介 346 7.7.1 時鐘—給設(shè)備打拍子 346 7.7.2 8253入門 348 7.7.3 8253控制字 349 7.7.4 8253工作方式 350 7.7.5 8253初始化步驟 353 7.8 提高時鐘中斷的頻率,讓中斷來得更 猛烈一些 354 第8章 內(nèi)存管理系統(tǒng) 357 8.1 makefile簡介 357 8.1.1 makefile是什么 357 8.1.2 makefile基本語法 358 8.1.3 跳到目標(biāo)處執(zhí)行 360 8.1.4 偽目標(biāo) 361 8.1.5 make:遞歸式推導(dǎo)目標(biāo) 362 8.1.6 自定義變量與系統(tǒng)變量 363 8.1.7 隱含規(guī)則 365 8.1.8 自動化變量 366 8.1.9 模式規(guī)則 367 8.2 實現(xiàn)assert斷言 367 8.2.1 實現(xiàn)開、關(guān)中斷的函數(shù) 367 8.2.2 實現(xiàn)ASSERT 370 8.2.3 通過makefile來編譯 372 8.3 實現(xiàn)字符串操作函數(shù) 374 8.4 位圖bitmap及其函數(shù)的實現(xiàn) 377 8.4.1 位圖簡介 377 8.4.2 位圖的定義與實現(xiàn) 378 8.5 內(nèi)存管理系統(tǒng) 381 8.5.1 內(nèi)存池規(guī)劃 381 8.5.2 內(nèi)存管理系統(tǒng)第一步,分配頁 內(nèi)存 388 第9章 線程 398 9.1 實現(xiàn)內(nèi)核線程 398 9.1.1 執(zhí)行流 398 9.1.2 線程到底是什么 399 9.1.3 進程與線程的關(guān)系、區(qū)別簡述 402 9.1.4 進程、線程的狀態(tài) 405 9.1.5 進程的身份證—PCB 405 9.1.6 實現(xiàn)線程的兩種方式—內(nèi)核或 用戶進程 406 9.2 在內(nèi)核空間實現(xiàn)線程 409 9.2.1 簡單的PCB及線程棧的實現(xiàn) 409 9.2.2 線程的實現(xiàn) 413 9.3 核心數(shù)據(jù)結(jié)構(gòu),雙向鏈表 417 9.4 多線程調(diào)度 421 9.4.1 簡單優(yōu)先級調(diào)度的基礎(chǔ) 421 9.4.2 任務(wù)調(diào)度器和任務(wù)切換 425 第10章 輸入輸出系統(tǒng) 439 10.1 同步機制——鎖 439 10.1.1 排查GP異常,理解原子操作 439 10.1.2 找出代碼中的臨界區(qū)、互斥、 競爭條件 444 10.1.3 信號量 445 10.1.4 線程的阻塞與喚醒 447 10.1.5 鎖的實現(xiàn) 449 10.2 用鎖實現(xiàn)終端輸出 452 10.3 從鍵盤獲取輸入 456 10.3.1 鍵盤輸入原理簡介 456 10.3.2 鍵盤掃描碼 457 10.3.3 8042簡介 463 10.3.4 測試鍵盤中斷處理程序 465 10.4 編寫鍵盤驅(qū)動 468 10.4.1 轉(zhuǎn)義字符介紹 468 10.4.2 處理掃描碼 469 10.5 環(huán)形輸入緩沖區(qū) 476 10.5.1 生產(chǎn)者與消費者問題簡述 476 10.5.2 環(huán)形緩沖區(qū)的實現(xiàn) 478 10.5.3 添加鍵盤輸入緩沖區(qū) 481 10.5.4 生產(chǎn)者與消費者實例測試 482 第11章 用戶進程 485 11.1 為什么要有任務(wù)狀態(tài)段TSS 485 11.1.1 多任務(wù)的起源,很久很久 以前…… 485 11.1.2 LDT簡介 486 11.1.3 TSS的作用 488 11.1.4 CPU原生支持的任務(wù)切換 方式 492 11.1.5 現(xiàn)代操作系統(tǒng)采用的任務(wù) 切換方式 495 11.2 定義并初始化TSS 497 11.3 實現(xiàn)用戶進程 501 11.3.1 實現(xiàn)用戶進程的原理 501 11.3.2 用戶進程的虛擬地址空間 501 11.3.3 為進程創(chuàng)建頁表和3特權(quán) 級棧 502 11.3.4 進入特權(quán)級3 505 11.3.5 用戶進程創(chuàng)建的流程 506 11.3.6 實現(xiàn)用戶進程—上 507 11.3.7 bss簡介 513 11.3.8 實現(xiàn)用戶進程—下 515 11.3.9 讓進程跑起來—用戶進程的 調(diào)度 519 11.3.10 測試用戶進程 520 第12章 進一步完善內(nèi)核 523 12.1 Linux系統(tǒng)調(diào)用淺析 523 12.2 系統(tǒng)調(diào)用的實現(xiàn) 527 12.2.1 系統(tǒng)調(diào)用實現(xiàn)框架 527 12.2.2 增加0x80號中斷描述符 527 12.2.3 實現(xiàn)系統(tǒng)調(diào)用接口 528 12.2.4 增加0x80號中斷處理例程 528 12.2.5 初始化系統(tǒng)調(diào)用和實現(xiàn) sys_getpid 530 12.2.6 添加系統(tǒng)調(diào)用getpid 531 12.2.7 在用戶進程中的系統(tǒng)調(diào)用 532 12.2.8 系統(tǒng)調(diào)用之棧傳遞參數(shù) 534 12.3 讓用戶進程“說話” 536 12.3.1 可變參數(shù)的原理 536 12.3.2 實現(xiàn)系統(tǒng)調(diào)用write 538 12.3.3 實現(xiàn)printf 539 12.3.4 完善printf 542 12.4 完善堆內(nèi)存管理 545 12.4.1 malloc底層原理 545 12.4.2 底層初始化 548 12.4.3 實現(xiàn)sys_malloc 550 12.4.4 內(nèi)存的釋放 555 12.4.5 實現(xiàn)sys_free 558 12.4.6 實現(xiàn)系統(tǒng)調(diào)用malloc和free 562 第13章 編寫硬盤驅(qū)動程序 566 13.1 硬盤及分區(qū)表 566 13.1.1 創(chuàng)建從盤及獲取安裝的 磁盤數(shù) 566 13.1.2 創(chuàng)建磁盤分區(qū)表 567 13.1.3 磁盤分區(qū)表淺析 571 13.2 編寫硬盤驅(qū)動程序 578 13.2.1 硬盤初始化 578 13.2.2 實現(xiàn)thread_yield和idle線程 582 13.2.3 實現(xiàn)簡單的休眠函數(shù) 584 13.2.4 完善硬盤驅(qū)動程序 585 13.2.5 獲取硬盤信息,掃描分區(qū)表 590 第14章 文件系統(tǒng) 595 14.1 文件系統(tǒng)概念簡介 595 14.1.1 inode、間接塊索引表、文件 控制塊FCB簡介 595 14.1.2 項與簡介 597 14.1.3 超級塊與文件系統(tǒng)布局 599 14.2 創(chuàng)建文件系統(tǒng) 601 14.2.1 創(chuàng)建超級塊、i結(jié)點、項 601 14.2.2 創(chuàng)建文件系統(tǒng) 603 14.2.3 掛載分區(qū) 609 14.3 文件描述符簡介 612 14.3.1 文件描述符原理 612 14.3.2 文件描述符的實現(xiàn) 614 14.4 文件操作相關(guān)的基礎(chǔ)函數(shù) 615 14.4.1 inode操作有關(guān)的函數(shù) 616 14.4.2 文件相關(guān)的函數(shù) 620 14.4.3 相關(guān)的函數(shù) 623 14.4.4 路徑解析相關(guān)的函數(shù) 628 14.4.5 實現(xiàn)文件檢索功能 630 14.5 創(chuàng)建文件 633 14.5.1 實現(xiàn)file_create 633 14.5.2 實現(xiàn)sys_open 636 14.5.3 在文件系統(tǒng)上創(chuàng)建第1個 文件 639 14.6 文件的打開與關(guān)閉 640 14.6.1 文件的打開 640 14.6.2 文件的關(guān)閉 642 14.7 實現(xiàn)文件寫入 643 14.7.1 實現(xiàn)file_write 643 14.7.2 改進sys_write及write系統(tǒng) 調(diào)用 648 14.7.3 把數(shù)據(jù)寫入文件 650 14.8 讀取文件 651 14.8.1 實現(xiàn)file_read 651 14.8.2 實現(xiàn)sys_read與功能驗證 653 14.9 實現(xiàn)文件讀寫指針定位功能 655 14.10 實現(xiàn)文件刪除功能 657 14.10.1 回收inode 657 14.10.2 刪除項 660 14.10.3 實現(xiàn)sys_unlink與功能驗證 663 14.11 創(chuàng)建 665 14.11.1 實現(xiàn)sys_mkdir創(chuàng)建 666 14.11.2 創(chuàng)建功能驗證 669 14.12 遍歷 671 14.12.1 打開和關(guān)閉 671 14.12.2 讀取1個項 673 14.12.3 實現(xiàn)sys_readdir及sys_ rewinddir 674 14.13 刪除 676 14.13.1 刪除與判斷空 676 14.13.2 實現(xiàn)sys_rmdir及功能驗證 677 14.14 任務(wù)的工作 679 14.14.1 顯示當(dāng)前工作的原理及 基礎(chǔ)代碼 679 14.14.2 實現(xiàn)sys_getcwd 681 14.14.3 實現(xiàn)sys_chdir改變工作 683 14.15 獲得文件屬性 684 14.15.1 ls命令的幕后功臣 684 14.15.2 實現(xiàn)sys_stat 685 第15章 系統(tǒng)交互 687 15.1 fork的原理與實現(xiàn) 687 15.1.1 什么是fork 687 15.1.2 fork的實現(xiàn) 689 15.1.3 添加fork系統(tǒng)調(diào)用與實現(xiàn)init 進程 695 15.2 添加read系統(tǒng)調(diào)用,獲取鍵盤輸入 696 15.3 添加putchar、clear系統(tǒng)調(diào)用 697 15.4 實現(xiàn)一個簡單的shell 699 15.4.1 shell雛形 699 15.4.2 添加Ctrl+u和Ctrl+l快捷鍵 701 15.4.3 解析鍵入的字符 703 15.4.4 添加系統(tǒng)調(diào)用 705 15.4.5 路徑解析轉(zhuǎn)換 708 15.4.6 實現(xiàn)ls、cd、mkdir、ps、rm等 命令 712 15.5 加載用戶進程 717 15.5.1 實現(xiàn)exec 717 15.5.2 讓shell支持外部命令 723 15.5.3 加載硬盤上的用戶程序執(zhí)行 724 15.5.4 使用戶進程支持參數(shù) 727 15.6 實現(xiàn)系統(tǒng)調(diào)用wait和exit 731 15.6.1 wait和exit的作用 731 15.6.2 孤兒進程和僵尸進程 732 15.6.3 一些基礎(chǔ)代碼 733 15.6.4 實現(xiàn)wait和exit 737 15.6.5 實現(xiàn)cat命令 741 15.7 管道 745 15.7.1 管道的原理 745 15.7.2 管道的設(shè)計 747 15.7.3 管道的實現(xiàn) 748 15.7.4 利用管道實現(xiàn)進程間通信 752 15.7.5 在shell中支持管道 754 參考文獻 760
你還可能感興趣
我要評論
|