《計算機系統:核心概念及軟硬件實現(原書第4版)》基于虛構的計算機Pep/8,清晰、詳細、循序漸進地介紹了計算機組成、匯編語言和計算機體系結構中的核心思想,圍繞7個抽象層次組織內容,詳細介紹了計算機系統的應用層、高級語言層、匯編層、操作系統層、指令集架構層、微代碼層和邏輯門層。本書有完整的程序示例,理論和實踐相結合,寬度和深度相結合,提供了對普適的馮·諾依曼機器架構的深入理解。
《計算機系統:核心概念及軟硬件實現(原書第4版)》可作為高等院校計算機科學專業本科生的教材,也可作為相關專業人員學習計算機基礎知識的參考書。
《計算機系統:核心概念及軟硬件實現(原書第4版)》清晰、詳細、一步一步地介紹了計算機組成、匯編語言和計算機體系結構中的核心概念。它帶領學生用自上而下的方法探索計算機系統各個抽象層次的方方面面。通過說明不同的抽象層次和其他層次之間的關系,本書幫助學生將計算機系統及其組成部分看作一個統一的概念。
《計算機系統:核心概念及軟硬件實現(原書第4版)》基于Pep/8匯編器和模擬器,用來講授經典馮·諾依曼機器的基本知識。Pep/8現在包括新的符號跟蹤特性,能夠在學生單步跟蹤程序時,實時顯示全局變量和運行時棧的情況。
作者Warford教授從教30余年,他貫穿全書強調了掌握基本計算機概念的重要性,是理解當前和未來技術的基礎,他還強調了解決問題能力的重要性。本書覆蓋了ACM-IEEE計算機科學課程體系指導意見中體系結構和組成原理中所有的核心概念。
本書清晰、詳細、循序漸進地展示了計算機組成、匯編語言和計算機體系結構中的核心思想。本書的很大一部分是建立在一個虛構的計算機Pep/8基礎上的,用它來講解經典的馮·諾依曼機器的基本概念。這種方法的好處是能夠講解計算機科學的核心概念,而又不必拘泥于此類課程中常見的許多不相關的細節。這種方法還能鼓勵學生思考計算機科學底層的原理。本書的范圍也比較廣泛,重點強調了與硬件及其相關軟件的處理有關而少有提及的計算機科學主題。
內容摘要
計算機運行在一些抽象層上,在高級抽象層上編程只是一部分。基于圖1的層次結構,本書展示了計算機系統的一個統一的概念。
對應于圖1的7層,本書也分為7個部分:
App7層 應用層
HOL6層 高級語言層
ISA3層 指令集架構層
Asmb5層 匯編層
OS4層 操作系統層
LG1層 邏輯門層
Mc2層 微代碼層
本書主要是按照從上到下、從最高層到最低層的順序來書寫。ISA3層在Asmb5層之前以及LG1層在Mc2層之前講解是出于教學的目的。在這兩種情況下,暫時用相反的從下至上的方法來講解更自然,有了低層的構造模塊就很容易完成上層的構建。
App7層 App7層是單獨一章,介紹了應用程序。本章展示了抽象層次的概念,建立本書剩下部分的框架。還介紹了一些關系數據庫的概念,作為典型計算機應用的例子。同時,還假設學生對文字編輯器或文字處理器有一定的經驗。
HOL6層 HOL6層也是一章,復習了C++編程語言。本章假設學生具有某種命令語言的經驗,不一定是C++,可以是Java或C。書中避免了C++的高級特性,包括面向對象的概念。如果有必要,教師可以把C++例子翻譯成其他HOL6層的語言。
本章著重介紹了C++內存模型,包括全局變量和局部變量、函數參數以及動態分配的變量。也介紹了遞歸的問題,因為它依賴于運行時棧上的內存分配機制。還相當詳細地解釋了函數調用的內存分配過程,因為本書后面還會在較低抽象層次上分析這個機制。
ISA3層 ISA3層是指令集架構層,包括兩章,描述了一個用于說明計算機概念的虛構的Pep/8計算機。Pep/8是經典的馮·諾依曼機器。CPU包含一個累加器、一個變址寄存器、一個程序計數器、一個棧指針和一個指令寄存器。有8種尋址方式:立即數、直接、間接、棧相對、棧相對間接、變址、棧變址和棧變址間接。在模擬的只讀存儲器(ROM)中,Pep/8操作系統能從學生的文本文件中裝入和執行十六進制格式的程序。學生可以在Pep/8模擬器上運行小程序,學習不會改變內存值的ROM存儲指令。
學生能學習到位層的信息表示和計算機組成的知識。因為本書的中心主題是層次之間的關系,所以有關Pep/8的章節展示了ASCII表示(ISA3層)和類型為char的C++變量(HOL6層)之間的關系。還展示了補碼表示(ISA3層)和類型為int的C++變量(HOL6)之間的關系。
Asmb5層 Asmb5層是匯編層,書中介紹了匯編器的概念(匯編器是匯編層和機器層之間的翻譯器),還介紹了Asmb5層的符號和符號表。
這里是統一的方法派上用場的地方。第5章和第6章中的編譯器是高級語言到匯編語言的翻譯器。前面,學生學習了一種具體的HOL6層語言C++和一種具體的馮·諾依曼機器Pep/8。接下來的章節將繼續介紹層次之間的關系,講述下面這樣一些對應關系:(a)HOL6層的賦值語句和Asmb5層的裝入/存儲指令;(b)HOL6層的循環和if語句與Asmb5層的分支指令;(c)HOL6層的數組和Asmb5層的變址尋址;(d)HOL6層的過程調用和Asmb5層的運行時棧;(e)HOL6層的函數和過程參數與Asmb5層的棧相對尋址;(f)HOL6層的switch語句和Asmb5層的轉移表;(g)HOL6層的指針和Asmb5層的地址。
統一方法之美就在于可以在較低層次上實現C++章節中的例子。例如,第2章的遞歸例子中描述的運行時棧直接對應于Pep/8主存中的硬件棧。學生可以用手動方式直接在兩層之間翻譯,以便更好地理解編譯的過程。
這種方法為討論計算機科學中的核心問題提供了一種很自然的環境。例如,本書介紹了HOL6層的結構化編程,可以和Asmb5層的非結構化編程的可能性進行對比。書中討論了goto爭議、結構化編程/效率之間的折中,給出了兩個層次上語言的實際例子。
第7章向學生介紹了計算機科學理論。既然學生對如何把高級語言翻譯成匯編語言已經有了感性的認識,那么我們就提出所有計算中最基本的問題:什么是能夠被自動化的?這里介紹理論是很自然的,因為學生現在知道了編譯器(自動化翻譯器)必須做什么。他們通過識別C++和Pep/8匯編語言的語言符號來學習語法分析和有限狀態機—確定性的和非確定性的。本章包括兩種小語言之間的自動翻譯器,說明了詞法分析、語法分析和代碼生成。詞法分析器是有限狀態機的實現。還有什么比這樣更自然的介紹理論的方法呢?
OS4層 OS4層講述操作系統,分為兩章。第8章講述進程管理,包括兩節,一節講裝載器,一節講陷阱處理程序,說明了Pep/8操作系統的概念。有5條指令具有產生軟件陷阱的未實現操作碼。操作系統把用戶正在運行的進程的進程控制塊存儲在系統棧上,中斷服務例程解釋該指令。通過具體實現一個掛起進程來強化操作系統中運行和等待進程的經典狀態轉移圖。本章結尾描述了并發進程和死鎖。第9章描述存儲管理,包括主存和磁盤存儲器。
LG1層 LG1層用兩章來介紹組合電路和時序電路。從布爾代數的定理開始,第10章重點介紹計算機科學的數學基礎的重要性,展示布爾代數和邏輯門之間的關系,然后介紹一些常見的SSI和MSI邏輯設備,包括Pep/8 ALU的完整的邏輯設計。第11章通過介紹時序電路的狀態轉移圖,描述有限狀態機的基本概念。最后描述常見的計算機子系統,比如雙向總線、內存芯片和雙端口存儲器體。
J. 斯坦利·沃法德(J. Stanley Warford),現為美國佩珀代因大學(Pepperdine University)大學計算機科學系教授。Warford教授在進入學術界前是航空工程師,他任教30余年,曾擔任佩珀代因大學計算機科學系主任。他從倫斯勒理工學院獲得碩士學位,從加州大學洛杉磯分校獲得博士學位。由于杰出的教學成果,Warford教授獲得了Luckman獎。
龔奕利,本科畢業于武漢大學,在中國科學院計算技術研究所獲得博士學位,曾在美國印第安納大學從事博士后工作和美國密歇根大學從事訪問學者工作,現為武漢大學計算機學院副教授。主要研究方向為高性能計算和分布式系統,包括云計算和廣域文件系統。翻譯過《深入理解計算機系統》(第一、二版)等計算機專業書籍。
出版者的話
中文版序
譯者序
前言
第一部分應用層(第7層)
第1章計算機系統2
1.1 抽象層次2
1.1.1 藝術中的抽象3
1.1.2 文檔中的抽象4
1.1.3組織中的抽象5
1.1.4機器中的抽象6
1.1.5計算機系統中的抽象6
1.2 硬件8
1.2.1輸入設備9
1.2.2輸出設備11
1.2.3主存儲器12
1.2.4中央處理單元13
1.3軟件13
1.3.1操作系統14
1.3.2軟件分析和設計15
1.4數據庫系統16
1.4.1關系17
1.4.2查詢18
1.4.3語言結構19
總結20
練習21
第二部分高級語言層(第6層)
第2章C++24
2.1 變量24
2.1.1C++編譯器24
2.1.2 機器無關性24
2.1.3C++的內存模型25
2.1.4全局變量和賦值語句26
2.1.5局部變量28
2.2控制流29
2.2.1if/else語句29
2.2.2switch語句30
2.2.3while循環30
2.2.4do循環31
2.2.5數組和for循環31
2.3函數32
2.3.1空函數和傳值調用的參數32
2.3.2函數的例子33
2.3.3傳引用調用的參數34
2.4遞歸36
2.4.1階乘函數37
2.4.2遞歸的思考方式39
2.4.3遞歸加法40
2.4.4二項式系數函數41
2.4.5逆轉數組元素順序45
2.4.6漢諾塔45
2.4.7 相互遞歸48
2.4.8遞歸的成本48
2.5動態內存分配49
2.5.1指針49
2.5.2結構50
2.5.3鏈式數據結構51
總結52
練習53
問題54
第三部分指令集架構層(第3層)
第3章信息的表示58
3.1 無符號二進制表示58
3.1.1二進制存儲器58
3.1.2整數59
3.1.3基本轉換60
3.1.4無符號整數的范圍61
3.1.5無符號加法62
3.1.6 進位位62
3.2補碼二進制表示63
3.2.1補碼的表數范圍65
3.2.2基數轉換66
3.2.3 數軸66
3.2.4溢出位68
3.2.5負數和零位69
3.3 二進制運算69
3.3.1邏輯運算符69
3.3.2寄存器傳送語言70
3.3.3算術運算符70
3.3.4循環移位運算符72
3.4十六進制和符號表示72
3.4.1十六進制72
3.4.2基數轉換73
3.4.3字符75
3.5浮點數表示77
3.5.1二進制小數77
3.5.2余碼表示78
3.5.3隱藏位79
3.5.4特殊值80
3.5.5IEEE 754浮點數標準83
3.6跨層的表示方法85
3.6.1另一種表示87
3.6.2模型88
總結90
練習90
問題95
第4章計算機體系結構97
4.1硬件97
4.1.1中央處理單元98
4.1.2主存儲器98
4.1.3 輸入設備99
4.1.4 輸出設備99
4.1.5 數據和控制100
4.1.6 指令格式100
4.2直接尋址102
4.2.1 停止指令102
4.2.2裝入指令103
4.2.3存儲指令103
4.2.4加法指令104
4.2.5減法指令105
4.2.6與和或指令105
4.2.7按位取反和取負指令106
4.2.8裝入字節和存儲字節指令107
4.2.9字符輸入和輸出指令108
4.3馮·諾依曼機器109
4.3.1 馮·諾依曼執行周期109
4.3.2一個字符輸出程序110
4.3.3馮·諾依曼漏洞113
4.3.4一個字符輸入程序113
4.3.5十進制轉換為ASCII113
4.3.6一個修改自身的程序114
4.4ISA3層編程115
4.4.1只讀內存117
4.4.2Pep/8操作系統117
4.4.3使用Pep/8系統119
總結119
練習120
問題121
第四部分匯編層(第5層)
第5章匯編語言124
5.1匯編程序124
5.1.1指令助記符124
5.1.2偽操作126
5.1.3.ASCII和.END偽操作126
5.1.4匯編器127
5.1.5.BLOCK偽操作128
5.1.6.WORD和.BYTE偽操作129
5.1.7使用Pep/8匯編器129
5.1.8交叉匯編器130
5.2立即數尋址和陷阱指令131
5.2.1立即數尋址131
5.2.2DECI、DECO和BR指令131
5.2.3STRO指令133
5.2.4解釋位模式134
5.2.5反匯編器135
5.3符號137
5.3.1帶符號的程序137
5.3.2一個馮·諾依曼示例138
5.4從HOL6層翻譯139
5.4.1cout語句139
5.4.2變量和類型140
5.4.3全局變量和賦值語句141
5.4.4類型兼容143
5.4.5Pep/8符號跟蹤器144
5.4.6 算術移位和循環移位指令145
5.4.7常量和.EQUATE147
5.4.8指令和數據的放置149
總結149
練習150
問題152
第6章編譯到匯編層155
6.1 棧尋址和局部變量155
6.1.1棧相對尋址155
6.1.2訪問運行時棧156
6.1.3局部變量158
6.2轉移指令和控制流159
6.2.1 翻譯if語句160
6.2.2 優化編譯器161
6.2.3翻譯if/else語句162
6.2.4翻譯while循環163
6.2.5翻譯do循環164
6.2.6 翻譯for循環165
6.2.7 面條代碼166
6.2.8早期語言中的控制流168
6.2.9結構化編程定律169
6.2.10goto爭論169
6.3 函數調用和參數171
6.3.1翻譯函數調用171
6.3.2用全局變量翻譯傳值調用參數173
6.3.3 用局部變量翻譯傳值調用參數176
6.3.4翻譯非空函數調用178
6.3.5 用全局變量翻譯傳引用調用參數180
6.3.6用局部變量翻譯傳引用調用參數183
6.3.7翻譯布爾類型186
6.4 變址尋址和數組188
6.4.1 翻譯全局數組189
6.4.2翻譯局部數組191
6.4.3翻譯作為參數傳遞的數組193
6.4.4翻譯switch語句198
6.5 動態內存分配200
6.5.1翻譯全局指針200
6.5.2翻譯局部指針204
6.5.3翻譯結構207
6.5.4翻譯鏈式數據結構210
總結214
練習214
問題215
第7章語言翻譯原理222
7.1語言、語法和語法分析222
7.1.1連接223
7.1.2 語言223
7.1.3 語法224
7.1.4 C++標識符的語法225
7.1.5有符號整數的語法226
7.1.6上下文相關的語法227
7.1.7語法分析問題227
7.1.8表達式的語法228
7.1.9C++語法的一部分229
7.1.10 C++的上下文相關性232
7.2 有限狀態機233
7.2.1用FSM來分析標識符233
7.2.2 簡化的有限狀態機234
7.2.3非確定性有限狀態機234
7.2.4 具有空轉移的狀態機235
7.2.5語言符號識別器237
7.3實現有限狀態機239
7.3.1查找表分析器240
7.3.2直接編碼分析器241
7.3.3輸入緩沖區類244
7.3.4多token分析器244
7.4 代碼生成249
7.4.1語言翻譯器249
7.4.2 語法分析器特性259
總結260
練習260
問題262
第五部分 操作系統層(第4層)
第8章 進程管理266
8.1 裝載器266
8.1.1 Pep/8操作系統266
8.1.2 Pep/8裝載器267
8.1.3 程序的終止269
8.2 陷阱269
8.2.1 陷阱機制269
8.2.2 RETTR指令270
8.2.3 陷阱處理程序271
8.2.4 陷阱尋址方式斷言273
8.2.5 陷阱操作數地址計算274
8.2.6 空操作陷阱處理程序277
8.2.7 DECI陷阱處理程序277
8.2.8 DECO陷阱處理程序282
8.2.9 STRO陷阱處理程序和OS向量284
8.3 并發進程286
8.3.1 異步中斷286
8.3.2 操作系統中的進程287
8.3.3 多處理288
8.3.4 并發處理程序289
8.3.5 臨界區290
8.3.6 第一次嘗試實現互斥291
8.3.7 第二次嘗試實現互斥291
8.3.8 Peterson互斥算法292
8.3.9 信號量293
8.3.10 帶信號量的臨界區295
8.4 死鎖296
8.4.1 資源分配圖296
8.4.2 死鎖策略298
總結298
練習299
問題302
第9章 存儲管理305
9.1 內存分配305
9.1.1 單道程序設計305
9.1.2 固定分區多道程序設計306
9.1.3 邏輯地址306
9.1.4 可變分區多道程序設計308
9.1.5 分頁310
9.2 虛擬內存312
9.2.1 大程序的行為312
9.2.2 虛擬內存313
9.2.3 按需取頁315
9.2.4 替換頁315
9.2.5 頁替換算法316
9.3 文件管理318
9.3.1 磁盤驅動器318
9.3.2 文件抽象319
9.3.3 分配技術319
9.4 錯誤檢測和糾錯碼321
9.4.1 錯誤檢測碼321
9.4.2 編碼要求322
9.4.3 糾正一位錯編碼324
9.5 RAID存儲系統325
9.5.1 RAID 0級:非冗余條帶化326
9.5.2 RAID 1級:鏡像326
9.5.3 RAID 01級和10級:條帶化和鏡像327
9.5.4 RAID 2級:內存風格的ECC328
9.5.5 RAID 3級:位交叉奇偶校驗329
9.5.6 RAID 4級:塊交叉奇偶校驗329
9.5.7 RAID 5級:塊交叉分布奇偶校驗330
總結331
練習331
第六部分 邏輯門層(第1層)
第10章 組合電路334
10.1 布爾代數和邏輯門334
10.1.1 組合電路335
10.1.2 真值表335
10.1.3 布爾代數336
10.1.4 布爾代數定理337
10.1.5 互補證明338
10.1.6 邏輯圖339
10.1.7 其他表達方式341
10.2 組合分析341
10.2.1 布爾表達式和邏輯圖342
10.2.2 真值表和布爾表達式343
10.2.3 兩級電路345
10.2.4 無所不在的NAND346
10.3 組合設計347
10.3.1 范式348
10.3.2 三變量卡諾圖349
10.3.3 四變量卡諾圖353
10.3.4 對偶卡諾圖355
10.3.5 無關條件356
10.4 組合設備356
10.4.1 視角356
10.4.2 復用器358
10.4.3 二進制譯碼器358
10.4.4 多路分配器359
10.4.5 加法器359
10.4.6 加法器/減法器361
10.4.7 算術邏輯單元362
10.4.8 LG1層的抽象367
總結368
練習368
第11章 時序電路374
11.1 鎖存器和時鐘觸發器374
11.1.1 SR鎖存器374
11.1.2 鐘控SR觸發器376
11.1.3 主-從SR觸發器377
11.1.4 基本觸發器380
11.1.5 JK觸發器381
11.1.6 D觸發器382
11.1.7 T觸發器383
11.1.8 激勵表384
11.2 時序分析和設計384
11.2.1 時序分析問題385
11.2.2 預設置和清除387
11.2.3 時序設計387
11.2.4 一個時序設計問題388
11.3 計算機子系統390
11.3.1 寄存器390
11.3.2 總線391
11.3.3 內存子系統392
11.3.4 地址譯碼396
11.3.5 雙端口寄存器體400
總結401
練習402
第七部分 微代碼層(第2層)
第12章 計算機組成406
12.1 構造ISA3層機器406
12.1.1 中央處理單元406
12.1.2 馮·諾依曼周期408
12.1.3 實現存儲字節指令412
12.1.4 實現加法指令412
12.1.5 實現裝入指令413
12.1.6 實現算術右移指令415
12.2 性能問題416
12.2.1 總線寬度417
12.2.2 特殊的硬件單元419
12.2.3 3個優化領域421
12.2.4 微代碼423
12.3 MIPS機器425
12.3.1 裝入/存儲體系結構425
12.3.2 指令集427
12.3.3 高速緩存431
12.3.4 MIPS的計算機組成437
12.3.5 流水線439
12.4 結論445
12.4.1 模型簡化446
12.4.2 更大的景象446
總結447
練習448
附錄Pep/8體系結構451
部分練習參考答案457
索引468