本书主要介绍与计算机系统相关的核心概念,解释这些概念如何相互关联并终影响程序执行的结果和性能。本书共分8章,主要内容包括数据的表示和运算、程序的转换及机器级表示、程序的链接、程序的执行、存储器层次结构、虚拟存储器、异常控制流和I/O操作的实现等。本书将计算机系统每个抽象 层涉及的重要概念通过程序的开发和运行串联起来,内容详尽,反映现实,概念清楚,通俗易懂,实例丰富,并提供大量典型习题以供读者练习。本书可以作为计算机专业本科或大专院校学生计算机系统方面的基础性教材,也可以作为有关专业研究生或计算机技术人员的参考书。
----------
前言
后 PC 时代的到来,使得原先基于 PC 而建立起来的专业教学内容已经远远不能反映现代社会对计算机专业人才的培养要求,原先计算机专业人才培养强调“程序”设计也变为更强调“系统”设计。这需要我们重新规划教学课程体系,调整教学理念和教学内容,加强学生系统能力培养,使学生能够深刻理解计算机系统整体概念,更好地掌握软/硬件协同设计和程序设计技术,从而更多地培养出满足业界需求的各类计算机专业人才。不管培养计算机系统哪个层面的计算机技术人才,计算机专业教育都要重视学生“系统观”的培养。
本书的主要目的就是为加强计算机专业学生的“系统观”而提供一本关于“计算机系统基础”课程教学的教材。
1. 本书的写作思路和内容组织
本书从程序员视角出发,重点介绍应用程序员如何利用计算机系统相关知识来编写更有效的程序。本书以高级语言程序的开发和运行过程为主线,将该过程中每个环节所涉及的硬件和软件的基本概念关联起来,试图使读者建立一个完整的计算机系统层次结构框架,了解计算机系统的全貌和相关知识体系,初步理解计算机系统中的每一个抽象层及其相互转换关系,建立高级语言程序、ISA、OS、编译器、链接器等之间的相互关联;对指令在硬件上的执行过程和指令的底层硬件执行机制有一定的认识和理解,从而增强读者在程序的调试、性能优化、移植和健壮性保证等方面的能力,并为后续的“计算机组成与设计”“操作系统”“编译技术”“计算机体系结构”等课程打下坚实基础。
本书的具体内容包括:程序中处理的数据在机器中的表示和运算、程序中各类控制语句对应的机器级代码的结构、可执行目标代码的链接生成、可执行目标代码中的指令序列在机器上的执行过程、存储访问过程、打断程序正常执行的机制以及程序中的 I/O 操作功能如何通过请求操作系统内核提供的系统调用服务来完成等。
不管构建一个计算机系统的各类硬件和软件多么千差万别,计算机系统的构建原理以及在计算机系统上的程序转换和执行机理是相通的,因而,本书仅介绍一种特定计算机系统平台下的相关内容。本书所用的平台为 IA-32/x86-64 + Linux + GCC + C 语言
本书共有 8 章,分两个部分
第一部分主要是系统概要并介绍可执行目标文件的生成,包含第 1~4 章
第二部分主要介绍可执行目标文件的运行,包含第 5~8 章
第 1 章是计算机系统概述
第 2 章和第 3 章分别介绍高级语言程序中的数据和语句所对应的底层机器级表示,展示的是高级语言程序到机器级语言程序的对应转换关系
第 4 章主要介绍如何将不同的程序模块链接起来构成可执行目标文件,展示的是程序的链接环节
第 5 章和第 6 章着重介绍程序的运行环节,包括与程序运行密切相关的硬件部分——CPU 及存储器的组织
第 7 章介绍打断程序正常运行的事件机制——异常控制流
第 8 章主要介绍程序中I/O操作的实现机制
此外,附录 A 中还补充了数字逻辑电路的基础内容,为那些没有数字逻辑电路基础知识的读者阅读本书提供方便。
2. 读者所需的背景知识
本书假定读者对C语言程序设计有一定的基础,已经掌握了C语言的语法和各类控制语句、数据类型及其运算、各类表达式、函数调用和C语言的标准库函数等相关知识。
此外,本书对于程序中指令的执行过程进行了介绍,这涉及布尔代数、逻辑运算电路、存储部件等内容,因而,本书正文内容假定读者具有数字逻辑电路基础知识。不过,如果读者不具备这些背景知识的话,可以参看本书附录 A
本书所用的平台为 IA-32/x86-64 + Linux + GCC + C 语言。书中大多数 C 语言程序对应的机器级表示都是基于 IA-32 + Linux 平台用 GCC 编译器生成的,本书会在介绍程序的机器级表示之前,先简要介绍 IA-32 的指令集体系结构,包括其机器语言和汇编语言的介绍,因而,读者无须任何机器语言和汇编语言的背景知识。
XII3. 使用本书作为教材的课程及教学建议
目前国内大学计算机专业课程设置,大多是按计算机系统层次结构进行横向切分,自下而上分解成数字逻辑电路、计算机组成原理、汇编程序设计、操作系统、编译原理、程序设计等课程,而且,每门课程都仅局限在本抽象层,相互之间几乎没有关联,因而学生对整个计算机系统的认识过程就像“瞎子摸象”一样,很难形成一个对完整计算机系统的全面认识。虽然国内有些高校也有计算机系统概论、计算机系统入门或导论之类的课程,但通常内容较广且结构较松散,基本上是计算机课程概论,因而很难使学生真正形成计算机系统层次结构整体框架。
笔者对美国几所顶级大学近年来相关课程体系进行了跟踪调查,发现他们都非常注重计算机系统能力的培养,都在讲完高层的编程语言及程序设计课程后开设一门关于计算机系统的基础课程,如 MIT 的 6.004、UC-Berkeley 的 CS 61C、CMU 的 CS 213、斯坦福大学的 CS 107 等。这些课程在内容上特别注重计算机系统各抽象层的纵向关联,将高级语言程序、汇编语言程序、机器代码及其执行串联起来,为学生进一步学习后续相关课程打下坚实的基础。
本书在借鉴国外相关课程教学内容和相关教材的基础上编写,适合于在完成程序设计基础课程后进行学习。本书内容贯穿计算机系统各个抽象层,是关于计算机系统的最基础的内容,因而使用本书作为教材开设的课程适用于所有计算机相关专业。
使用本书作为教材开设的课程名称可以是“计算机系统基础”“计算机系统导论”或类似名称,可以有以下几种安排方案。
章号 内容 课程
① ② ③ ④ ⑤
1. 计算机系统概述 √√√√√
2. 数据的机器级表示与处理 √√√√√
3. 程序的转换及机器级表示 √√√√
4. 程序的链接 √√√
5. 程序的执行 √√√√
6. 层次结构存储系统 √√√√
7. 异常控制流 √√
8. I/O 操作的实现 √√
附录 A 数字逻辑电路基础 √√√√√
上表的课程安排及教学建议说明如下:
第 ① 种课程适合于软件工程等不需要深入掌握底层硬件细节的专业。开设该课程后,则无须再开设“数字逻辑电路”“汇编程序设计”“计算机组成原理”和“微机原理与接口技术”课程,因为本书基本涵盖了上述课程中的所有主要内容,并将它们与高级语言程序、操作系统中的部分概念、编译和链接中的基本内容有机联系在一起了。这样做,不仅能缩减大量课时,还可以通过该课程的讲授为学生系统能力培养打下坚实的基础。因为课程内容较多,建议开设为一个一学年课程,第一学期学习附录 A 和第 1~4 章,第二学期学习第 5~8 章。每学期的总学时数为 60 左右。
第 ② 种课程适合于计算机工程、计算机系统等偏系统或硬件的专业。可以在该课程后开设一门将数字逻辑电路和计算机组成及设计的内容合并的课程,专门介绍计算机微体系结构的数字系统设计技术;也可以在该课程之前先开设“数字逻辑电路”课程,之后再开设“计算机组成与设计”课程。美国几个顶级大学采用的是前面一种做法。建议开设为一个一学期课程,总学时数为 80 左右。
第 ③、④ 和 ⑤ 种课程,适合于其他与计算机相关的非计算机专业或那些大专类计算机专业,在学时受限的情况下,可以选择一些基本内容进行讲授。建议开设为一个一学期课程,总学时数在 60~80
本书对于存储访问机制和异常控制流这两部分内容,在介绍基本原理的基础上,还简要介绍了 IA-32/x86-64 + Linux 平台的具体实现(书中带 * 的章节)。由于基本原理在一个具体平台中的实现往往比较复杂,因而带 * 章节的内容相对烦琐。若本书用作教材的话,这部分可以选择不作为课堂教学内容。但是,如果后续的操作系统课程实验内容是基于 IA-32 + Linux 平台实现的话,建议将这部分内容作为重点讲解。
4. 第 2 版修订内容
由于第 1 版教材编写时间比较仓促,因而导致部分内容不太完善,示例不太丰富,特别是,近年来计算机系统相关技术发生了一些变革,64 位系统的使用越来越广泛。为了更好地完善教材内容,丰富教学示例,反映技术的进步,拓宽本领域知识的覆盖面,更加合理地构建知识框架,第 2 版在第 1 版的基础上进行了若干修订,主要包括以下几个方面。
第 1 章 计算机系统概述:删除了关于计算机发展历史和计算机硬件的介绍,增加了对冯·诺依曼结构模型机及其指令系统的介绍,并通过模型机中具体程序例子简要介绍了高级语言程序与机器级代码的对应关系,以及在模型机上执行程序和指令的过程。此外,在计算机系统层次结构部分,增加了对系统核心层之间关联的介绍,包括语言规范中的未定义行为、不确定行为,以及应用程序二进制接口(ABI)和应用编程接口(API)等的介绍;在性能评价部分,还增加了对阿姆达尔定律的介绍。
第 2 章 数据的机器级表示与处理:增加了大量的 C 程序示例,将高级编程语言规范与具体程序执行结果结合起来介绍,以使读者充分理解程序中数据在机器中的表示与运算所涉及的各层面概念之间的关联关系。
第 3 章 程序的转换及机器级表示:增加了在 C 语言中直接嵌入汇编代码的方法、Intel架构指令格式及其指令机器码解析举例、非静态局部变量的分配、缓冲区溢出概念解释、栈随机化机制和栈破坏检测举例、64 位架构程序举例等内容。
第 4 章 程序的链接:增加了 ELF 头解析举例、节头表结构及其解析举例、可执行文件的存储器映像举例、动态链接时程序无关代码(PIC)的实现等内容。
第 5 章 程序的执行:增加了对 MIPS 单周期数据通路结构的介绍。
第 6 章 层次结构存储系统:增加了 DDR/DDR2/DDR3 SDRAM 等主存芯片技术和 64 位架构 Intel Core i7 + Linux 的存储系统介绍。
第 7 章 异常控制流:增加了进程的存储器映射及其共享对象和私有的写时拷贝对象的基本概念、程序加载处理过程、故障的信号处理和非本地跳转等内容。
第 8 章 I/O 操作的实现:增加了文件流缓冲区及其读写操作、QPI 总线、存储器总线、PCI-Express 总线以及基于总线的硬件互连结构等内容。
5. 如何阅读本书
本书的出发点是试图将计算机系统每个抽象层中涉及的重要概念通过程序的开发和运行过程这个主线串起来,因而本书涉及的所有问题和内容都是从程序出发的。这些内容或者涉及程序中数据的表示及运算;或者涉及程序对应的机器级表示;或者涉及多个程序模块的链接;或者涉及程序的加载及运行;或者涉及程序执行过程中的异常中断事件;或者涉及程序中的 I/O 操作等。从读者熟悉的程序开发和运行过程出发来介绍计算机系统基本概念,可以使读者将新学的概念与已有的知识关联起来,不断拓展和深化知识体系。特别是,因为所有内容从程序出发,所以所有内容都可以通过具体程序进行验证,边学边干中使所学知识转化为实践能力。
本书虽然涉及内容较广,但所有内容之间具有非常紧密的关联,因而,建议读者在阅读本书时采用“整体性”学习方法,通过第1章的学习先建立一个粗略的计算机系统整体框架,然后不断地通过后续章节的学习,将新的内容与前面的内容关联起来,以逐步细化计算机系统框架内容,最终形成比较完整的、相互密切关联的计算机系统整体概念。
本书提供了大量的例题和课后习题,这些题目大多是具体的程序示例,通过对这些示例的分析或验证性实践,读者可以对基本概念有更加深刻的理解。因此,在阅读本书时,若遇到一些难以理解的概念,可以先不用仔细琢磨,而是通过具体的程序示例对照基本概念和相关手册中的具体规定进行理解。
本书提供的小贴士对理解书中的基本概念很有用,但是,由于篇幅有限,这些补充资料不可能占用很大篇幅,因而大多是简要内容。如果读者希望了解更多的细节内容,可以自行到互联网上查找。
本书内容虽然涉及高级语言程序设计、数字逻辑电路、汇编语言程序、计算机组成与系统结构、操作系统、编译和链接等,但是,本书主要讲解它们之间的关联,而不提供其细节,如果读者想要了解更详细的关于数字系统设计、操作系统、编译技术、计算机体系结构等方面的内容,则还要阅读关于这些内容的专门书籍。不过,若读者学完本书后再去阅读这些方面的专门书籍,则会轻松很多。
袁春风
----------
本书对应的 中国大学 MOOC 慕课 在线课程
南京大学 计算机系统基础
计算机系统基础 (一):程序的表示、转换与链接 [国家精品]
https://www.icourse163.org/course/NJU-1001625001
计算机系统基础 (二):程序的执行和存储访问
https://www.icourse163.org/course/NJU-1001964032
计算机系统基础 (三):异常、中断和输入/输出
https://www.icourse163.org/course/NJU-1002532004
授课老师 南京大学 教授 袁春风
计算机系统基础 习题解答与教学指导 主编 袁春风 (2017.4)
https://book.douban.com/subject/27023252/
----------
重要参考 CSAPP
Computer Systems: A Programmer's Perspective (CSAPP)
http://csapp.cs.cmu.edu/
深入理解计算机系统 第 3 版 译者 龚奕利 贺莲 (2016.11)
https://book.douban.com/subject/26912767/
Computer Systems: A Programmer's Perspective, 3Ed, by Randal E. Bryant, David R. O'Hallaron (2015.3)
https://www.amazon.com/dp/013409266X/
15-213/18-213: Introduction to Computer Systems
https://www.cs.cmu.edu/~213/schedule.html
CMU (Carnegie Mellon University) 卡耐基梅隆大学 CS 213 是 CSAPP 对应的课程
课程编号/专业对应关系:
15-213 Computer Science
18-213 Computer Engineering
15-513 Graduate
Lab Assignments
http://csapp.cs.cmu.edu/3e/labs.html
实验作业
袁春风 南京大学计算机科学与技术系教授。主要研究领域为大数据计算与并行处理技术、Web信息检索与文本挖掘技术等。在相关领域承担科研项目近40项,发表论文近70篇,两次获江苏省科技进步二等奖,并获江苏省软件一等奖。
主持的“计算机组成原理”和“计算机组成与系统结构”课程被遴选为精品课程、精品资源共享课、江苏省精品课程。
主编的《计算机组成与系统结构》以及《计算机组成与系统结构习题解答与教学指导》获“十二五”普通高等教育规划教材和江苏省精品教材。
作为主要成员获2013年江苏省教学成果特等奖和2014年国家教学成果二等奖。
计算机系统基础 (一):程序的表示、转换与链接 获国家精品在线开放课程。
计算机组成与系统结构 课程网站获江苏省多媒体课件特等奖。