第1章 概論 1
1.1 曆史背景 1
1.2 UNIX誕生的經過 1
1.3 UNIX版本6 2
1.4 各流派一覽 2
1.5 為什麼取得成功 3
1.5.1 簡潔高效 3
1.5.2 健壯性 3
1.5.3 功能豐富 3
1.5.4 移植性 3
1.5.5 開放性 4
1.6 縮寫及術語說明 4
第2章 UNIX綜述 6
2.1 硬件平颱 6
2.1.1 中斷和自陷(Trap) 7
2.1.2 兩種處理器模式 9
2.1.3 通用寄存器 10
2.1.4 I/O設備管理 10
2.1.5 棧(Stack) 11
2.1.6 常用指令 11
.2.1.7 備注 19
2.2 UNIX內核綜述 20
2.2.1 模塊分類 20
2.2.2 各模塊間的通信 20
2.2.3 源文件 21
2.2.4 語法規則和編碼風格說明 23
2.3 思考題 27
第3章 虛擬內存 28
3.1 簡介 28
3.2 虛擬內存的優點 29
3.2.1 安全性 29
3.2.2 提高空間利用率 30
3.2.3 多進程的支持 30
3.3 PDP11/40的虛擬內存機製 30
3.3.1 頁地址寄存器(PAR) 32
3.3.2 頁描述寄存器(PDR) 32
3.3.3 活動頁寄存器地址 33
3.3.4 虛擬地址嚮物理地址的映射過程 33
3.3.5 異常處理 35
3.3.6 和現代頁式虛存的比較 36
3.4 UNIX的虛存實現 36
3.4.1 進程空間分布 36
3.4.2 用戶活動頁寄存器設置函數estabur 37
3.4.3 用戶空間映射函數sureg 41
3.5 內存管理 42
3.5.1 內核內存管理 42
3.5.2 用戶內存管理 47
3.6 思考題 56
第4章 啓動模塊 57
4.1 操作流程 57
4.2 中斷嚮量 58
4.3 啓動函數start 60
4.4 備注 65
4.4.1 為什麼需要引導程序和裝入程序 65
4.4.2 0地址處指令分析 65
4.4.3 為什麼要使用匯編語言 66
4.4.4 Windows啓動過程淺析 66
4.5 思考題 67
第5章 進程管理和調度 68
5.1 程序員眼中的虛擬機 68
5.2 係統資源 68
5.3 進程上下文 70
5.4 進程調度 72
5.5 UNIX實現 73
5.5.1 進程上下文 73
5.5.2 進程的兩種狀態 80
5.5.3 調度過程 82
5.5.4 備注 128
5.6 思考題 134
第6章 中斷處理過程 136
6.1 PSW寄存器 136
6.2 中斷處理流程 136
6.3 中斷嚮量 138
6.4 PDP 11/40的中斷類型 139
6.4.1 電傳終端接口輸入中斷 139
6.4.2 電傳終端接口輸齣中斷 140
6.4.3 紙帶打孔機輸入中斷 140
6.4.4 紙帶打孔機輸齣中斷 140
6.4.5 時鍾中斷 140
6.4.6 行打印機中斷 140
6.4.7 磁盤讀寫中斷 140
6.5 一些常用函數 140
6.5.1 特殊指令 140
6.5.2 fubyte(fuibyte) 141
6.5.3 fuword(fuiword) 143
6.5.4 subyte(suibyte) 143
6.5.5 suword(suiword) 144
6.5.6 clearseg 144
6.5.7 copyseg 145
6.5.8 copyin/copyout 146
6.5.9 dpadd 148
6.5.10 ldiv/lrem/lshift 148
6.6 call函數 149
6.7 時鍾中斷 151
6.7.1 基本概念 151
6.7.2 處理過程 152
6.8 call函數調用分派切換器的理由 163
6.9 內核定時器 164
6.9.1 數據結構 164
6.9.2 定時器的創建 165
6.9.3 定時器的觸發 167
6.10 一些例子 168
6.10.1 進程優先級的調整 168
6.10.2 進程分派切換實例 174
6.11 備注 178
6.11.1 中斷服務函數中為什麼不使用互斥鎖 178
6.11.2 中斷服務函數中為什麼不訪問u變量 178
6.11.3 關於內存管理違例自陷的處理過程 179
6.11.4 調度標誌runrun和runin 179
6.12 思考題 179
第7章 自陷 180
7.1 自陷原理 180
7.2 自陷嚮量 180
7.3 PDP11/40的自陷類型 180
7.3.1 係統齣錯自陷 180
7.3.2 係統調用自陷 182
7.3.3 調試自陷 182
7.3.4 自陷優先級 183
7.4 自陷處理過程 184
7.4.1 匯編函數_trap 184
7.4.2 C函數trap 186
7.4.3 backup函數 191
第8章 文件係統 211
8.1 概述 211
8.2 框架 212
8.2.1 文件存儲的實現 212
8.2.2 UNIX文件係統 219
8.2.3 UNIX文件係統的詳細實現 224
8.3 文件訪問接口 229
8.3.1 文件創建接口creat 230
8.3.2 文件打開接口open 235
8.3.3 文件關閉接口close 236
8.3.4 文件讀接口read 237
8.3.5 文件寫接口write 238
8.3.6 文件定位接口seek 239
8.3.7 特殊文件創建接口mknod 242
8.3.8 文件鏈接接口link 244
8.3.9 取消文件鏈接接口unlink 246
8.3.10 設備加載接口smount 248
8.3.11 設備卸載接口sumount 251
8.4 節點和塊管理 253
8.4.1 節點緩存 253
8.4.2 塊緩存 255
8.4.3 塊訪問接口 263
8.4.4 節點訪問接口 294
8.5 塊設備驅動 322
8.5.1 概述 322
8.5.2 根設備——rk11磁盤 326
8.6 備注 335
8.6.1 FAT16文件係統 335
8.6.2 多進程訪問文件的問題 338
8.6.3 進程間同步 339
8.6.4 文件的刪除 340
8.6.5 設備驅動的擴展 340
8.7 總結 341
8.8 思考題 341
第9章 字符設備驅動 342
9.1 交互終端——電傳打字機(teletypewriter) 342
9.1.1 設備特性 343
9.1.2 操作寄存器 343
9.1.3 驅動框架 345
9.1.4 驅動函數 351
9.1.5 shell應用舉例 378
9.1.6 內核打印接口 379
9.2 PC-11紙帶打孔機 383
9.2.1 設備特性 383
9.2.2 操作寄存器 384
9.2.3 驅動框架 385
9.2.4 驅動函數 387
9.2.5 讀取器狀態轉換圖 392
9.3 LP-11行打印機 393
9.3.1 設備特性 393
9.3.2 操作寄存器 393
9.3.3 驅動框架 394
9.3.4 驅動函數 396
9.4 現代打印機 401
9.4.1 並口 401
9.4.2 和內核掛接 403
9.4.3 簡單的打印程序 406
9.4.4 CUPS 408
9.5 其他字符設備 408
9.5.1 內存 409
9.5.2 磁盤 411
9.6 網絡驅動程序 415
9.7 綜閤示例 416
9.8 總結 417
9.9 思考題 418
第10章 進程交換過程 419
10.1 概述 419
10.2 具體實現 421
10.2.1 進程換齣函數xswap 422
10.2.2 程序段內存釋放函數xccdec 423
10.2.3 交換函數swap 424
10.2.4 調用實例 425
10.3 綜閤示例 426
10.4 思考題 430
第11章 UNIX可執行文件 431
11.1 .out文件 431
11.1.1 可執行頭 431
11.1.2 程序段 432
11.1.3 數據段 432
11.1.4 程序和數據重定嚮錶 432
11.1.5 符號錶 434
11.1.6 示例 437
11.2 動態鏈接過程* 442
11.2.1 靜態共享 443
11.2.2 動態共享 446
11.2.3 GOT/PLT錶和位置無關代碼(PIC) 446
11.2.4 動態加載過程分析 450
第12章 係統調用 457
12.1 概述 457
12.2 係統調用的實現 457
12.2.1 用戶實現 459
12.2.2 係統調用錶和trap自陷 459
12.2.3 內核實現 469
12.3 各係統調用的實現 469
12.3.1 文件相關調用 471
12.3.2 進程相關調用 491
12.3.3 信號相關調用 538
12.3.4 調試功能調用 558
12.3.5 用戶/組ID調用 586
12.3.6 時間相關調用 589
12.3.7 終端相關調用 591
第13章 進程間通信 596
13.1 概述 596
13.2 管道 596
13.2.1 相關係統調用 596
13.2.2 管道實現過程分析 602
13.2.3 應用示例 603
13.2.4 采用內存文件實現管道 608
13.2.5 思考題 610
13.3 文件 610
13.4 有名管道 611
13.5 進程間同步 611
13.5.1 信號量 612
13.5.2 互斥體 621
13.5.3 事件 622
13.6 死鎖 634
13.7 其他進程間數據傳輸方式 636
13.7.1 消息(message) 636
13.7.2 信箱(mailbox) 648
13.7.3 共享內存 671
第14章 多綫程的實現 686
14.1 概述 686
14.2 綫程和經典進程的比較 686
14.3 綫程的示例實現 686
14.3.1 相關數據結構 686
14.3.2 實現方案 689
14.3.3 綫程創建調用CreateThread 691
14.3.4 內核改動 695
14.3.5 綫程退齣調用ExitThread 711
14.3.6 綫程id獲得調用gettid 712
14.3.7 綫程掛起調用SuspendThread 712
14.3.8 綫程恢復調用ResumeThread 714
14.3.9 綫程終止調用TerminateThread 715
14.3.10 綫程ID查詢調用GetThreadID 719
14.3.11 綫程名查詢調用GetThreadName 720
14.3.12 使用示例 721
14.3.13 思考題 723
第15章 網絡多用戶 724
15.1 係統初始化過程 724
15.1.1 init進程 724
15.1.2 getty程序 725
15.1.3 login程序 725
15.2 telnet程序 730
15.2.1 工作原理 730
15.2.2 常用配置 731
15.3 NFS(網絡文件係統) 732
15.3.1 基本原理 733
15.3.2 RPC(遠程過程調用) 734
15.3.3 各過程的實現 737
15.3.4 簡單示例 741
附錄A 參考書目及資源 742
附錄B 思考題答案 743
· · · · · · (
收起)