本書是計算機體系結構的入門教材,從程序員的視角展開討論,重點介紹基礎知識和概念,不深入底層技術的細節(jié)。這種視角旨在幫助程序員新手和計算機專業(yè)新生理解體系結構對編程的影響,書中濃縮的核心知識點涵蓋了程序員需要掌握的所有硬件層面,從而有利于其更好地進行軟件的設計、實現(xiàn)和運維。本書分為五個部分,包括數(shù)字邏輯、門和數(shù)據(jù)通路的基礎知識,以及體系結構的三個主要方面——處理器、內(nèi)存和I/O系統(tǒng)。此外,書中還涉及并行、流水線、能源和性能等高級主題,以及一個動手操作的實驗。第2版共包含了三個全新的章節(jié),并在整體上進行了與時俱進的修訂。
硬件工程已經(jīng)從使用分立電子元件轉向使用可編程器件。因此,編程變得更加重要。那些理解硬件如何運轉和熟知基本硬件原理的程序員,可以更加高效且少犯錯誤地構建軟件系統(tǒng)。掌握計算機體系結構的基礎知識使得編程人員能夠理解軟件如何映射到硬件上,并做出更好的軟件設計選擇。掌握底層硬件知識也有助于調(diào)試,因為它可以讓程序員快速地定位問題的根源。
本書適用于一個學期的本科課程。在眾多計算機科學課程中,計算機體系結構或計算機組成課程是唯一介紹計算機結構基本概念的課程,這些概念有助于學生理解他們賴以編程的計算機結構。遺憾的是,大多數(shù)計算機體系結構書籍都是硬件工程師編寫的,目標讀者是那些想學習如何設計硬件的學生。本書則采用了不同的方法:不再專注于硬件設計和工程細節(jié),而是針對程序員,解釋程序員需要知道的硬件基礎知識。因此,本書從程序員的角度解釋主題,并強調(diào)其對程序員的影響。
全書分為五個部分。第一部分介紹數(shù)字邏輯、門電路、數(shù)據(jù)通路和數(shù)據(jù)表示的基礎知識。大多數(shù)學生喜歡這種簡短的學習底層硬件的方式(特別是本書不介紹細微的硬件細節(jié))。第二至四部分涵蓋體系結構的三個主要方面:處理器、存儲器和輸入/輸出系統(tǒng)。在每一章中,都為學生提供了足夠的背景知識,以便他們了解相關機制如何運作及其對程序員的影響,而無須繼續(xù)了解許多細節(jié)。最后,第五部分涵蓋并行、流水線、功耗和能耗以及性能等高級主題。
附錄A描述課程的一個重要方面——實驗,學生可以通過實踐學習。盡管大多數(shù)實驗問題都集中在編程上,但學生應該在前幾周完成在面包板上連接門電路。該設備價格低廉(我們購買供學生實驗的長期設備時,每位學生花費少于15美元,學生自己購買實驗設備花費不到20美元)。
附錄C提供對x86匯編語言和x64擴展的簡單介紹。許多老師講授x86系統(tǒng),要求將其包含在內(nèi)。該材料位于附錄中,意味著選擇RISC匯編語言(例如,ARM體系結構)的老師可以將其用于比較。
第2版新增了兩章并對全書內(nèi)容做了一些修改和更新。例如,在第3章中,有關數(shù)據(jù)通路的部分展示了計算機系統(tǒng)的組件,并描述了當指令執(zhí)行時數(shù)據(jù)是如何在這些組件間流動的。通過簡單的例子在第2章介紹的數(shù)字邏輯與接下來章節(jié)介紹的處理器之間搭建了橋梁。在第20章中,覆蓋了功耗與能耗的基本概念,讀者無須了解更多細節(jié)。它解釋了為什么以半速運行的雙核處理器芯片的功耗要低于全速運行的單核處理器芯片的功耗。
我們建立了一個與本書配套的網(wǎng)站:http://www.eca.cs.purdue.edu。
本書正文及實驗練習被普渡大學用作教材,學生對這兩方面都非常積極。我們收到了大量關于本書的感謝信息。對于許多學生來說,實驗課是他們與硬件的第一次近距離接觸,因此學習熱情高漲。
感謝許多為本書做出貢獻的人。Bernd Wolfinger全面審閱了本書,并就主題和方向提出了一些重要建議。一些教授和學生指出了第1版中的錯別字。George Adams為第2版提供了詳細的意見和建議。
最后,感謝我的妻子Chris,她耐心細致的編輯和提出的寶貴建議,改進和完善了本書。
道格拉斯·科莫
---作者簡介---
道格拉斯·科莫(Douglas Comer) 世界知名的計算機網(wǎng)絡和TCP/IP專家,普渡大學計算機科學杰出教授,ACM會士,獲得了包括USENIX終身成就獎在內(nèi)的眾多獎項。曾擔任思科公司首席研究副總裁,CSNET技術委員會主席,DARPA分布式系統(tǒng)架構委員會主席,以及《Software—Practice And Experience》期刊主編。他撰寫了一系列突破性的教科書,這些書被翻譯成16種語言,在工業(yè)界和學術界影響甚廣。
---譯者簡介---
黃智瀕 北京郵電大學計算機學院講師,計算機體系結構博士,主講數(shù)字邏輯和計算機體系結構課程。主要研究方向包括GPU加速及大規(guī)模并行計算等。
戴志濤 北京郵電大學計算機學院教授,主講計算機組成原理和嵌入式系統(tǒng)課程。主要研究方向包括嵌入式片上系統(tǒng)架構等。
出版者的話
譯者序
前言
關于作者
第1章 簡介及概覽 1
1.1 體系結構的重要性 1
1.2 學習基礎知識 1
1.3 本書結構 1
1.4 一筆帶過的內(nèi)容 2
1.5 術語:體系結構和設計 2
1.6 小結 2
第一部分 基礎知識
第2章 數(shù)字邏輯基礎 4
2.1 引言 4
2.2 數(shù)字計算裝置 4
2.3 電氣術語:電壓和電流 4
2.4 晶體管 5
2.5 邏輯門 5
2.6 使用晶體管實現(xiàn)的“與非”邏輯門電路 7
2.7 表示邏輯門的符號 8
2.8 邏輯門互連的例子 8
2.9 實現(xiàn)二進制加法的數(shù)字電路 10
2.10 多邏輯門的集成電路 10
2.11 不只需要組合邏輯電路 11
2.12 維持狀態(tài)的電路 11
2.13 傳播延遲 12
2.14 使用鎖存器構建存儲器 12
2.15 觸發(fā)器和波形圖 13
2.16 二進制計數(shù)器 14
2.17 時鐘和時序 15
2.18 反饋的重要概念 17
2.19 啟動序列 18
2.20 軟件迭代與硬件復制 18
2.21 門和芯片的最簡化 19
2.22 使用閑置門 19
2.23 配電和散熱 20
2.24 時序和時鐘域 20
2.25 無時鐘邏輯 21
2.26 電路規(guī)模和摩爾定律 21
2.27 電路板和層 22
2.28 抽象層次 23
2.29 小結 23
習題 23
第3章 數(shù)據(jù)和程序的表示 25
3.1 引言 25
3.2 數(shù)字邏輯與抽象的重要性 25
3.3 位和字節(jié)的定義 25
3.4 字節(jié)大小和可能的值 25
3.5 二進制位權表示法 26
3.6 位序 27
3.7 十六進制記法 28
3.8 十六進制和二進制常數(shù)記法 29
3.9 字符集 29
3.10 Unicode 30
3.11 無符號整數(shù)、溢出和下溢 30
3.12 給位和字節(jié)編號 31
3.13 有符號二進制整數(shù) 31
3.14 一個補碼數(shù)字的例子 32
3.15 符號擴展 33
3.16 浮點數(shù) 33
3.17 IEEE浮點值的范圍 34
3.18 特殊值 35
3.19 二進制編碼的十進制表示 35
3.20 有符號數(shù)、分數(shù)和壓縮BCD表示法 36
3.21 數(shù)據(jù)聚合 36
3.22 程序的表示 37
3.23 小結 37
習題 37
第二部分 處理器
第4章 處理器和計算引擎的多樣性 40
4.1 引言 40
4.2 兩種基本的體系結構 40
4.3 哈佛與馮·諾依曼體系結構 40
4.4 處理器的定義 41
4.5 處理器的范圍 41
4.6 分層結構和計算引擎 42
4.7 傳統(tǒng)處理器的結構 43
4.8 處理器的分類和角色 44
4.9 處理器技術 44
4.10 存儲程序 45
4.11 取指–執(zhí)行周期 45
4.12 程序轉換 46
4.13 時鐘速率和指令速率 46
4.14 控制:啟動和停止 47
4.15 啟動取指–執(zhí)行周期 47
4.16 小結 48
習題 48
第5章 處理器類型和指令集 49
5.1 引言 49
5.2 數(shù)學能力、便利性和成本 49
5.3 指令集架構 49
5.4 操作碼、操作數(shù)和結果 50
5.5 典型的指令格式 50
5.6 可變長度指令與固定長度指令 50
5.7 通用寄存器 51
5.8 浮點寄存器和寄存器標識 51
5.9 使用寄存器編程 51
5.10 寄存器存儲體 52
5.11 復雜指令集和精簡指令集 53
5.12 RISC設計和執(zhí)行流水線 53
5.13 流水線和指令延遲 54
5.14 引起流水線停頓的其他原因 55
5.15 對程序員的影響 56
5.16 編程、停頓和無操作指令 56
5.17 轉發(fā) 56
5.18 操作類型 57
5.19 程序計數(shù)器、取指–執(zhí)行以及分支 57
5.20 子程序調(diào)用、參數(shù)以及寄存器窗口 58
5.21 一個示例指令集 59
5.22 極簡化的指令集 61
5.23 正交性原則 61
5.24 條件碼和條件分支 62
5.25 小結 62
習題 62
第6章 數(shù)據(jù)通路和指令執(zhí)行 64
6.1 引言 64
6.2 數(shù)據(jù)通路 64
6.3 示例指令集 64
6.4 內(nèi)存中的指令 66
6.5 移到下一條指令 67
6.6 取指令 68
6.7 解碼指令 69
6.8 連接到寄存器單元 69
6.9 控制和協(xié)調(diào) 70
6.10 算術運算和復用 70
6.11 涉及存儲器中數(shù)據(jù)的操作 71
6.12 執(zhí)行過程的示例 72
6.13 小結 73
習題 73
第7章 操作數(shù)尋址和指令表示 75
7.1 引言 75
7.2 零、一、二或三地址設計 75
7.3 每指令零操作數(shù) 75
7.4 每指令單操作數(shù) 76
7.5 每指令兩操作數(shù) 76
7.6 每指令三操作數(shù) 77
7.7 操作數(shù)來源和立即數(shù) 77
7.8 馮·諾依曼體系結構的瓶頸 77
7.9 顯式和隱式操作數(shù)編碼 78
7.10 組合多個值的操作數(shù) 79
7.11 權衡操作數(shù)的選擇 79
7.12 內(nèi)存中的值和間接引用 80
7.13 操作數(shù)尋址模式的示例 80
7.14 小結 81
習題 81
第8章 CPU:微碼、保護和處理器模式 83
8.1 引言 83
8.2 中央處理器 83
8.3 CPU的復雜性 83
8.4 執(zhí)行模式 84
8.5 向后兼容性 84
8.6 改變模式 84
8.7 特權和保護 85
8.8 多級保護 85
8.9 微碼指令 86
8.10 微碼變體 87
8.11 微碼的優(yōu)勢 87
8.12 FPGA和指令集的改變 88
8.13 垂直微碼 88
8.14 水平微碼 88
8.15 水平微碼的例子 89
8.16 水平微碼程序示例 91
8.17 需要多個周期的操作 91
8.18 水平微碼和并行執(zhí)行 92
8.19 前瞻性和高性能執(zhí)行 92
8.20 并行和執(zhí)行順序 93
8.21 亂序指令執(zhí)行 93
8.22 條件分支和分支預測 94
8.23 對