産品特色
        編輯推薦
                                    1.基於Intel Core i7處理器的64位多核操作係統  
2.引入諸多Linux內核的設計精髓  
3.既可在Bochs虛擬機中執行,又可通過U盤引導運行於筆記本電腦                 
內容簡介
   本書講述瞭一個64位多核操作係統的自製過程。此操作係統自製過程是先從虛擬平颱構築起一個基礎框架,隨後再將基礎框架移植到物理平颱中進行升級、完善與優化。為瞭凸顯64位多核操作係統的特點,物理平颱選用搭載著Intel Core-i7處理器的筆記本電腦。與此同時,本書還將Linux內核的源碼精髓、諸多官方白皮書以及多款常用協議濃縮於其中,可使讀者在讀完本書後能夠學以緻用,進而達到理論聯係實際的目的。  
全書共分為16章。第1~2章講述瞭操作係統的基礎概念和開發操作係統需要掌握的知識;第3~5章在虛擬平颱下快速構建起一個操作係統模型;第6~16章將在物理平颱下對操作係統模型做進一步升級、優化和完善。  
本書既適閤在校學習理論知識的初學者,又適閤在職工作的軟件工程師或有一定基礎的業餘愛好者。     
作者簡介
   田宇 Linux內核愛好者,曾在多傢大中型軟件公司從事軟件開發工作,參與過多款高端嵌入式産品的開發研製,主要負責Linux內核和驅動的研發,以及開源操作係統環境的深度定製。     
目錄
   第 一部分 操作係統相關知識介紹及環境搭建  
第 1章 操作係統概述 4  
1.1 什麼是操作係統 4  
1.2 操作係統的組成結構 4  
1.3 編寫操作係統需要的知識 7  
1.4 本書操作係統簡介 8  
第 2章 環境搭建及基礎知識 9  
2.1 虛擬機及開發係統平颱介紹 9  
2.1.1 VMware的安裝 9  
2.1.2 編譯環境CentOS 6 10  
2.1.3 Bochs虛擬機 11  
2.2 匯編語言 14  
2.2.1 AT&T;匯編語言格式與Intel匯編語言格式 14  
2.2.2 NASM編譯器 16  
2.2.3 使用匯編語言調用C語言的函數 16  
2.3 C語言 19  
2.3.1 GNU C內嵌匯編語言 20  
2.3.2 GNU C語言對標準C語言的擴展 23  
第二部分 初級篇  
第3章 BootLoader引導啓動程序 30  
3.1 Boot引導程序 30  
3.1.1 BIOS引導原理 31  
3.1.2 寫一個Boot引導程序 32  
3.1.3 創建虛擬軟盤鏡像文件 36  
3.1.4 在Bochs上運行我們的Boot程序 38  
3.1.5 加載Loader到內存 40  
3.1.6 從Boot跳轉到Loader程序 52  
3.2 Loader引導加載程序 54  
3.2.1 Loader原理 54  
3.2.2 寫一個Loader程序 55  
3.2.3 從實模式進入保護模式再到IA-32e模式 65  
3.2.4 從Loader跳轉到內核程序 75  
第4章 內核層 78  
4.1 內核執行頭程序 78  
4.1.1 什麼是內核執行頭程序 78  
4.1.2 寫一個內核執行頭程序 79  
4.2 內核主程序 83  
4.3 屏幕顯示 85  
4.3.1 在屏幕上顯示色彩 86  
4.3.2 在屏幕上顯示log 88  
4.4 係統異常 100  
4.4.1 異常的分類 101  
4.4.2 係統異常處理(一) 102  
4.4.3 係統異常處理(二) 109  
4.5 初級內存管理單元 121  
4.5.1 獲得物理內存信息 121  
4.5.2 計算可用物理內存頁數 123  
4.5.3 分配可用物理內存頁 126  
4.6 中斷處理 142  
4.6.1 8259A PIC 142  
4.6.2 觸發中斷 148  
4.7 鍵盤驅動 152  
4.7.1 簡述鍵盤功能 152  
4.7.2 實現鍵盤中斷捕獲函數 154  
4.8 進程管理 155  
4.8.1 簡述進程管理模塊 155  
4.8.2 PCB 156  
4.8.3 init進程 163  
第5章 應用層 171  
5.1 跳轉到應用層 171  
5.2 實現係統調用API 180  
5.3 實現一個係統調用處理函數 185  
第三部分 高級篇  
第6章 處理器體係結構 190  
6.1 基礎功能與新特性 190  
6.1.1 運行模式 190  
6.1.2 通用寄存器 191  
6.1.3 CPUID指令 192  
6.1.4 標誌寄存器EFLAGS 193  
6.1.5 控製寄存器 195  
6.1.6 MSR寄存器組 199  
6.2 地址空間 199  
6.2.1 虛擬地址 200  
6.2.2 物理地址 200  
6.3 實模式 200  
6.3.1 實模式概述 201  
6.3.2 實模式的段尋址方式 201  
6.3.3 實模式的中斷嚮量錶 201  
6.4 保護模式 202  
6.4.1 保護模式概述 202  
6.4.2 保護模式的段管理機製 206  
6.4.3 保護模式的中斷/異常處理機製 214  
6.4.4 保護模式的頁管理機製 217  
6.4.5 保護模式的地址轉換過程 224  
6.5 IA-32e模式 226  
6.5.1 IA-32e模式概述 226  
6.5.2 IA-32e模式的段管理機製 228  
6.5.3 IA-32e模式的中斷/異常處理機製 234  
6.5.4 IA-32e模式的頁管理機製 234  
6.5.5 IA-32e模式的地址轉換過程 237  
第7章 完善BootLoader功能 238  
7.1 實模式的尋址瓶頸 238  
7.1.1 錯綜復雜的1 MB物理地址空間 238  
7.1.2 突破1 MB物理內存瓶頸 239  
7.1.3 實模式下的4 GB綫性地址尋址 240  
7.2 獲取物理地址空間信息 240  
7.3 操作係統引導加載階段的內存空間劃分 242  
7.4 U盤啓動 244  
7.4.1 USB-FDD、USB-ZIP和USB-HDD啓動模式的簡介 244  
7.4.2 將Boot引導程序移植到U盤中啓動 251  
7.5 在物理平颱上啓動操作係統 255  
7.6 細說VBE功能的實現 261  
7.6.1 VBE規範概述 261  
7.6.2 獲取物理平颱的VBE相關信息 272  
7.6.3 設置顯示模式 279  
第8章 內核主程序 282  
8.1 內核主程序功能概述 282  
8.2 操作係統的Makefile編譯腳本 282  
8.3 操作係統的kernel.lds鏈接腳本 286  
8.4 操作係統的綫性地址空間劃分 289  
8.5 獲得處理器的固件信息 290  
第9章 高級內存管理單元 297  
9.1 SLAB內存池 297  
9.1.1 SLAB內存池概述及相關結構體定義 298  
9.1.2 SLAB內存池的創建與銷毀 299  
9.1.3 SLAB內存池中對象的分配與迴收 302  
9.2 基於SLAB內存池技術的通用內存管理單元 308  
9.2.1 通用內存管理單元的初始化函數slab_init 308  
9.2.2 通用內存的分配函數kmalloc 312  
9.2.3 通用內存的迴收函數kfree 317  
9.3 調整物理頁管理功能 321  
9.3.1 內存管理單元結構及相關函數調整 321  
9.3.2 調整alloc_pages函數 323  
9.3.3 創建free_pages函數 327  
9.4 頁錶初始化 330  
9.4.1 頁錶重新初始化 331  
9.4.2 VBE幀緩存區地址重映射 334  
第 10章 高級中斷處理單元 337  
10.1 APIC概述 337  
10.2 Local APIC 338  
10.2.1 Local APIC的基礎信息 338  
10.2.2 Local APIC整體結構及各功能描述 344  
10.3 I/O APIC 352  
10.3.1 I/O APIC控製器的基礎信息 353  
10.3.2 I/O APIC整體結構及各引腳功能 356  
10.4 中斷控製器的模式選擇與初始化 358  
10.4.1 中斷模式 359  
10.4.2 Local APIC控製器的初始化 362  
10.4.3 I/O APIC控製器的初始化 368  
10.5 高級中斷處理功能 375  
10.5.1 Linux的中斷處理機製概述 375  
10.5.2 實現中斷上半部處理功能 377  
第 11章 設備驅動程序 382  
11.1 鍵盤和鼠標驅動程序 382  
11.1.1 鍵盤和鼠標控製器 382  
11.1.2 完善鍵盤驅動 389  
11.1.3 實現鼠標驅動 398  
11.2 硬盤驅動程序 403  
11.2.1 硬盤設備初探 403  
11.2.2 完善硬盤驅動程序 418  
第 12章 進程管理 428  
12.1 進程管理單元功能概述 428  
12.2 多核處理器 429  
12.2.1 超綫程技術與多核技術概述 429  
12.2.2 多核處理器間的IPI通信機製介紹 434  
12.2.3 讓我們的係統支持多核 437  
12.3 進程調度器 464  
12.3.1 Linux進程調度器簡介 465  
12.3.2 牆上時鍾與定時器 468  
12.3.3 內核定時器 479  
12.3.4 實現進程調度功能 486  
12.4 內核同步方法 498  
12.4.1 原子變量 498  
12.4.2 信號量 499  
12.4.3 完善自鏇鎖 501  
12.5 完善進程管理單元 503  
12.5.1 完善PCB與處理器運行環境 503  
12.5.2 完善進程調度器和AP處理器引導程序 508  
12.5.3 關於綫程 514  
第 13章 文件係統 516  
13.1 文件係統概述 516  
13.2 解析FAT32文件係統 517  
13.2.1 FAT32文件係統簡介 517  
13.2.2 通過實例深入解析FAT32文件係統 523  
13.2.3 實現基於路徑名的文件係統檢索功能 532  
13.3 虛擬文件係統 552  
13.3.1 Linux VFS簡介 552  
13.3.2 實現VFS 554  
第 14章 係統調用API庫 566  
14.1 係統調用API結構 566  
14.2 基於POSIX規範實現係統調用API庫 567  
14.2.1 POSIX規範下的係統調用API簡介 567  
14.2.2 升級係統調用模塊 568  
14.2.3 基礎文件操作的係統調用API實現 574  
14.2.4 進程創建的係統調用API實現 599  
14.2.5 內存管理的基礎係統調用API實現 618  
第 15章 Shell命令解析器及命令 626  
15.1 Shell命令解析器 626  
15.1.1 Shell命令解析器概述 626  
15.1.2 實現Shell命令解析器 627  
15.2 基礎命令 641  
15.2.1 重啓命令reboot 641  
15.2.2 工作目錄切換命令cd 642  
15.2.3 目錄內容顯示命令ls 645  
15.2.4 文件查看命令cat 654  
15.2.5 程序執行命令exec 655  
第 16章 一個彩蛋 665  
附錄 術語錶 676  
參考資料 679    
				
 
				
				
					《代碼的基石:操作係統原理與實踐》  內容概述:  本書旨在深入剖析操作係統的核心機製,從最基礎的硬件交互齣發,逐步構建起一個功能完善、性能優越的現代操作係統。全書分為理論篇和實踐篇,前者側重於操作係統原理的講解,後者則引導讀者動手實踐,將理論知識轉化為實際代碼。我們力求以清晰的邏輯、生動的案例,幫助讀者跨越抽象的理論迷霧,領略操作係統的設計藝術,掌握構建高效軟件係統的關鍵技能。  理論篇:操作係統的心髒與脈搏     第一章:從零開始的計算世界——計算機體係結構基礎        1.1 硬件的語言:CPU、內存與I/O設備            我們將首先迴顧計算機硬件的基本組成,包括中央處理器(CPU)的工作原理,指令集架構(ISA)的抽象,以及寄存器、緩存等對性能至關重要的概念。            內存的層級結構(DRAM、SRAM)及其讀寫機製,內存地址空間的概念,以及如何通過內存管理單元(MMU)進行地址轉換,將是重點關注的領域。            各種輸入輸齣(I/O)設備的工作模式,如何與CPU進行交互(輪詢、中斷、DMA),以及I/O控製器的作用,都會被詳細闡述。        1.2 啓動的序麯:BIOS/UEFI與引導加載程序            從按下電源按鈕到第一個應用程序運行,中間發生瞭什麼?我們將深入探討BIOS/UEFI在係統初始化過程中的角色,如何加載固件,並最終將控製權交給引導加載程序(Bootloader)。            引導加載程序的工作流程,包括加載操作係統內核到內存,以及內核初始化前的準備工作,將通過圖示和原理分析得以清晰展現。        1.3 獨一無二的身份:進程的誕生與消亡            2.1 抽象的藝術:進程的概念與PCB                我們將深入理解“進程”這一核心概念,它如何代錶一個正在運行的程序,以及進程控製塊(PCB)在管理進程中的關鍵作用。PCB中包含的進程狀態、程序計數器、寄存器信息、內存管理信息等,都將一一解析。            2.2 時間的魔法:進程調度策略                在多任務環境下,如何公平高效地分配CPU時間給各個進程,是操作係統麵臨的巨大挑戰。我們將詳細介紹各種經典的進程調度算法,如先來先服務(FCFS)、最短作業優先(SJF)、優先級調度、時間片輪轉(Round-Robin)等。                對於實時操作係統,還會探討硬實時與軟實時的概念,以及相關的調度算法,如速率單調調度(RMS)和最早截止期優先(EDF)。                死鎖的産生原因、條件以及避免、檢測和解除死鎖的策略,將作為進程管理的重要組成部分進行深入討論。            2.3 溝通的橋梁:進程間通信(IPC)                進程之間如何協同工作、交換數據?我們將詳細講解多種IPC機製,包括管道(Pipes)、消息隊列(Message Queues)、共享內存(Shared Memory)、信號量(Semaphores)和套接字(Sockets)。每種機製的原理、優缺點以及適用場景都會進行詳細分析。        3. 內存的藝術:資源的有效分配與保護            3.1 統一的視圖:虛擬內存的概念                虛擬內存是現代操作係統中最具革命性的技術之一。我們將從物理內存和用戶程序地址空間的區彆齣發,引入虛擬內存的概念,以及它如何為每個進程提供一個獨立的、更大的地址空間。            3.2 地址的轉換:分頁與分段                分頁(Paging)是實現虛擬內存最常用的技術。我們將詳細講解頁錶(Page Table)的結構、頁的劃分、頁目錄等,以及CPU如何通過內存管理單元(MMU)將虛擬地址轉換為物理地址。                分段(Segmentation)則是另一種地址映射方式,我們將探討段錶(Segment Table)的工作原理,以及段頁式內存管理。            3.3 空間的博弈:頁麵置換算法                當物理內存不足時,操作係統需要將內存中的頁麵換齣到磁盤(交換區)。我們將深入研究各種經典的頁麵置換算法,如最優頁麵置換算法(OPT)、先進先齣(FIFO)、最近最少使用(LRU)、時鍾算法(Clock Algorithm)等,並分析它們的性能特點。            3.4 內存的保護:內存訪問控製                為瞭防止進程相互乾擾或非法訪問內存,操作係統需要實施嚴格的內存訪問控製。我們將討論如何利用硬件(如MMU)和軟件機製來實現地址邊界檢查、權限控製等。        4. 並發的世界:綫程與同步            4.1 輕盈的執行體:綫程模型                在進程的基礎上,我們引入“綫程”的概念。我們將探討用戶級綫程(User-Level Threads)和內核級綫程(Kernel-Level Threads)的區彆,以及它們在性能和實現上的權衡。                多綫程模型(如一對一、多對一、多對多)將詳細介紹,幫助讀者理解綫程與進程的關係。            4.2 協作的藝術:同步機製                當多個綫程/進程訪問共享資源時,可能齣現競態條件(Race Condition)。我們將詳細講解互斥鎖(Mutex)、自鏇鎖(Spinlock)、信號量(Semaphore)、條件變量(Condition Variable)、讀寫鎖(Read-Write Lock)等同步原語。                臨界區(Critical Section)的概念以及如何保證其原子性,將是同步機製討論的核心。                死鎖在多綫程環境下的錶現形式和解決策略,將與進程死鎖進行對比分析。        5. 存儲的守護者:文件係統            5.1 數據的組織:文件與目錄結構                我們將深入探討文件的基本概念,如文件屬性、文件類型、文件操作(創建、刪除、讀、寫、定位)。                目錄的層次結構,如何實現文件查找和路徑解析,以及各種目錄組織方式(如單級、兩級、樹形)的優劣。            5.2 磁盤的舞蹈:磁盤調度與I/O管理                磁盤的物理結構(盤麵、磁道、扇區)將作為基礎。我們將詳細分析各種磁盤調度算法,如先來先服務(FCFS)、最短尋道時間優先(SSTF)、掃描算法(SCAN)、循環掃描算法(C-SCAN)等,以優化磁盤I/O性能。                緩衝區(Buffer)和緩存(Cache)在文件I/O中的作用,以及延遲寫入(Lazy Write)等技術。            5.3 空間的分配:文件分配方式                文件如何在磁盤上存儲?我們將介紹連續分配、鏈式分配(隱式鏈接、顯式鏈接)和索引分配(單級索引、多級索引、混閤索引)等文件分配方式,並分析它們的優缺點。            5.4 數據的安全:文件係統的一緻性與恢復                如何保證文件係統在異常情況下(如斷電)的數據一緻性?我們將討論日誌文件係統(Journaling File System)的原理,以及文件係統檢查(fsck)的重要性。        6. 機器的語言:設備驅動與I/O係統            6.1 硬件的代言人:設備驅動程序                我們將深入理解設備驅動程序(Device Driver)在操作係統中的角色,它如何作為硬件和操作係統內核之間的橋梁。                編寫設備驅動需要瞭解的硬件接口、中斷處理、DMA技術等。            6.2 I/O的統一接口:通用I/O模型                操作係統如何為用戶提供統一的I/O接口,屏蔽底層硬件差異?我們將探討字符設備、塊設備的概念,以及它們在係統調用中的錶現。                中斷處理流程,中斷嚮量錶(IVT)的作用,以及中斷共享等機製。            6.3 網絡的起點:網絡協議棧基礎                簡要介紹網絡通信的基本原理,TCP/IP協議棧的層次結構,以及套接字(Socket)作為網絡通信接口的概念。  實踐篇:從理論到代碼的飛躍     第七章:你的第一個操作係統內核        7.1 引導加載程序的實現            我們將指導讀者編寫一個簡單的引導加載程序,使其能夠將內核映像加載到內存並跳轉執行。這部分將涉及匯編語言編程和鏈接腳本的編寫。        7.2 內核的入口與初始化            解析內核的入口點,如何進行初步的硬件初始化(如設置中斷描述符錶IDT、全局描述符錶GDT)。        7.3 打印第一個“Hello, OS!”            通過直接訪問顯存或使用BIOS中斷,實現最基本的屏幕輸齣功能,讓讀者看到自己編寫的代碼運行起來。    第八章:進程與綫程的實踐        8.1 簡單的進程創建與管理            通過係統調用(如fork()的簡化版),實現用戶程序創建子進程的功能。            實現簡易的進程調度器,體驗不同調度算法的效果。        8.2 綫程模型的實現            在用戶空間或內核空間實現綫程的創建、調度和同步。            編寫多綫程程序,觀察同步機製的應用。    第九章:內存管理的實戰        9.1 虛擬內存的模擬            嘗試實現簡單的分頁機製,包括頁錶的創建與更新。            模擬頁麵置換算法,觀察內存抖動現象。        9.2 內存分配器的設計            實現用戶空間的內存分配器(如malloc/free的簡單版本),理解堆管理。    第十章:文件係統的構建        10.1 簡單的文件係統接口            設計和實現基本的文件操作(創建、讀取、寫入、刪除)。            構建簡單的目錄結構。        10.2 磁盤空間的管理            實現文件分配策略,如簡單的位圖(Bitmap)或空閑鏈錶。            模擬磁盤I/O,優化讀寫效率。    第十一章:設備驅動的初步探索        11.1 鍵盤輸入驅動            編寫簡單的鍵盤驅動程序,捕獲鍵盤輸入並將其傳遞給內核。        11.2 串口通信驅動            實現簡單的串口通信,為後續調試和遠程控製打下基礎。  本書的特色:     理論與實踐深度結閤: 每一個重要的概念都輔以相應的實踐章節,讓讀者在理解原理的同時,也能動手驗證。    循序漸進的難度: 從最基礎的硬件交互到復雜的係統服務,逐步引導讀者構建完整的操作係統。    豐富的示例代碼: 提供大量高質量、可運行的 C 語言示例代碼,方便讀者學習和調試。    深入的原理剖析: 對於關鍵技術,我們不僅僅停留在錶麵,而是深入到其底層實現機製。    麵嚮未來: 關注現代操作係統發展趨勢,為讀者構建紮實的知識體係。  適閤讀者:     計算機科學、軟件工程及相關專業的學生。    有一定 C 語言基礎,希望深入瞭解操作係統原理的開發者。    對操作係統底層實現感興趣的程序員。    想要構建高性能、高可靠性係統的工程師。  通過閱讀本書,您將不僅能夠理解操作係統是如何工作的,更能掌握構建現代操作係統的核心技術,為您的技術生涯打下堅實的基礎。