- 计算机系统:基于x86+Linux平台
- 袁春风 朱光辉 余子濠编著
- 6358字
- 2024-08-06 16:53:59
前言
随着基于大数据处理的人工智能时代的到来,原先基于PC构建的专业教学内容已经远远不能反映现代社会对计算机专业人才的培养要求。原先计算机专业人才培养强调“程序”设计,而现在更强调“系统”设计。这就需要我们重新规划教学课程体系,调整教学理念和教学内容,加强学生的计算机系统能力培养,使学生能够深刻理解计算机系统的整体概念,更好地掌握软/硬件协同设计和程序设计技术,从而培养出更多满足业界需求的各类计算机专业人才。不管培养计算机系统哪个层面的技术人才,计算机专业教育都要重视学生“系统观”的培养。
本书是为加强计算机类专业学生的“系统观”而提供的一本用于计算机系统基础类课程教学的教材。
1.本书的写作思路和内容组织
本书从程序员视角出发,以高级语言程序的开发和运行过程为主线,将该过程中每个环节涉及的硬件和软件基本概念关联起来,试图建立一个完整的计算机系统层次结构框架,使读者了解计算机系统全貌和相关知识体系,初步理解计算机系统中的每一个抽象层及其相互转换关系,理解高级语言程序、指令集体系结构、操作系统、编译器、链接器等之间的相互关联,对指令在硬件上的执行过程和指令的底层硬件执行机制有一定的认识和理解,从而在程序的调试、性能优化、移植和健壮性保证等方面提升能力,并为后续“计算机组成原理”“操作系统”“编译技术”“计算机体系结构”等课程的学习打下坚实基础。
本书的具体内容包括程序中处理的数据在机器中的表示和运算、程序中各类控制语句对应的机器级代码的结构、可执行目标代码的链接生成、可执行目标代码中的指令序列在机器上的执行过程、存储访问过程、打断程序正常执行的机制以及程序中的I/O操作功能如何通过请求操作系统内核提供的系统调用服务来完成等。
虽然构建计算机系统的各类硬件和软件千差万别,但计算机系统的构建原理以及在计算机系统上的程序转换和执行机理是相通的,因而,本书主要介绍一种特定计算机系统平台下的相关内容。本书所用的平台为IA-32/x86-64+Linux+GCC+C语言。
本书以高级语言程序为出发点来组织内容,按照“自顶向下”的方式,以高级语言程序→汇编语言程序→机器指令序列→控制信号的顺序,展现程序从编程设计、编译转换、链接到最终运行的整个过程。对于存储访问机制和异常控制流这两部分内容,本书在介绍基本原理的基础上,还简要介绍了IA-32/x86-64+Linux系统的具体实现(书中带*的章节)。若将本书用作教材,则这部分可以不作为课堂教学内容,而作为学生的自学材料。
本书共有12章,从逻辑上分为四部分。第1章作为导引,基于一个简单模型机简要介绍计算机系统;第2~5章为第一部分——可执行文件的生成和加载执行,主要围绕程序的编译、汇编、链接、加载和执行进行介绍,包括信息的表示和运算、指令系统和程序的机器级表示等;第6、7章为第二部分——程序的存储访问,主要介绍存储层次结构和访存局部性、主存储器、外部存储器、cache、虚拟存储机制等;第8、9章为第三部分——硬件与操作系统之间的协同机制,主要介绍进程的上下文切换、进程控制、异常和中断处理、程序中I/O操作的底层实现机制,并通过综述hello程序的加载执行过程对系统各层次的关联内容进行归纳总结;第10~12章为第四部分——计算机系统性能优化,介绍程序性能优化方法、网络编程和多线程并发编程技术,以帮助读者理解从单处理器计算机系统到并行处理系统的自然过渡。
本书各章的主要内容说明如下。
第1章 计算机系统概述:主要介绍计算机系统的基本工作原理、程序的开发与运行过程、计算机系统的层次结构。
第2章 数据的机器级表示与处理:主要介绍各类数据在计算机中的表示与运算。计算机中的算术运算与现实中的算术运算有所区别,例如,一个整数的平方可能为负数、两个正整数的乘积可能比乘数小、进行浮点数运算时可能不满足结合律。计算机算术运算的这些特性使得有些程序会产生令人意想不到的结果,甚至造成安全漏洞,许多程序员为此感到困惑和苦恼。本章将从数据的机器级表示及其基本运算电路层面来解释计算机算术运算的本质特性,使程序员能够清楚地理解由计算机算术的局限性造成的异常程序行为。
第3章 程序转换与指令系统:计算机硬件只能理解机器语言程序,机器语言标准规范是位于软件和硬件之间的指令集体系结构,即指令系统。本章主要介绍高级语言程序转换为机器代码的过程以及指令系统相关的基本内容,包括指令中的操作数类型、寻址方式、IA-32和x86-64指令集体系结构及其常用指令。
第4章 程序的机器级表示:主要介绍C语言程序中的过程调用和控制语句(如选择、循环等结构语句)以及各类数据结构(如数组、指针、结构体、联合体等)元素的访问所对应的机器级代码。高级语言程序员使用高度抽象的过程调用、控制语句和数据结构等来实现算法,因而无法了解程序在计算机中执行的细节,无法真正理解程序设计中的许多抽象概念,也就很难解释清楚某些程序的行为和执行结果。本章从机器级汇编指令层面来解释程序的行为,因而程序员能对程序执行结果进行较为清楚的说明。通过学习本章,读者将会明白以下一些问题:过程调用时按值传递参数和按地址传递参数的本质差别是什么?缓冲区溢出漏洞是如何造成的?为什么递归调用会耗内存?为什么同样的程序在32位架构和64位架构上执行结果会不同?指针操作的本质是什么?
第5章 程序的链接与加载执行:主要介绍如何将多个程序模块链接以生成一个可执行目标文件并加载执行。通过介绍与链接相关的目标文件格式、符号解析、重定位、静态库、共享库以及可执行文件的加载等内容,使读者清楚地了解为何不能出现同名全局变量、为何可出现同名静态变量等编程问题。此外,链接生成的可执行文件与程序加载、虚拟地址空间和存储器映射等重要内容相关,对读者理解操作系统中存储管理方面的内容非常有用。可执行文件加载后的执行过程就是其包含的一条条指令的执行过程。
第6章 存储器层次结构:指令执行过程中需要通过访问存储器来取指令或读写操作数。通常,程序员以为程序代码和数据按序存放在由线性地址构成的主存空间中,实际上计算机中并不是只有主存,高速缓存和外存等存储器也与程序的执行相关。因此,存储单元不一定是指主存单元,访存过程也不仅是指访问主存的过程,而是指访问整个存储系统的过程。本章将介绍如何构成层次结构存储系统以及在该系统中的访存过程。层次结构存储系统能获得较好效果的一个很重要的原因是,程序中的存储访问具有局部性的特点,因此本章将详细介绍如何通过改善程序的时间局部性和空间局部性来提高程序执行的性能。
第7章 虚拟存储器:在链接生成的可执行文件中,其指令代码和数据的地址并不是主存地址,而是一个物理上并不存在的逻辑地址。每个可执行文件的代码和数据都映射到一个统一的虚拟地址空间中,因此在可执行文件执行过程中涉及逻辑地址向主存地址转换等实现虚拟存储器的一整套机制,这部分内容涉及指令系统、操作系统和硬件等多层次之间的关联和协同。本章主要介绍页式虚拟存储器机制。
第8章 进程与异常控制流:可执行文件被加载后就变成了一个进程,在正常执行过程中,CPU会因为内部异常或外部中断事件而打断原程序的执行,转去执行操作系统提供的针对这些特殊事件的处理程序。这种由于某些特殊情况引起用户程序的正常执行被打断所形成的意外控制流称为异常控制流。显然,计算机系统必须提供一种机制使自身能够实现异常控制流。本章主要介绍硬件层和操作系统层中涉及的内部异常和外部中断的异常控制流实现机制,包括进程与进程的上下文切换、异常的响应和处理、中断的响应和处理以及系统调用的实现等。
第9章 I/O操作的实现:所有高级语言的运行时系统都提供了执行I/O功能的高级机制,如C语言中提供了fread、printf和scanf等标准I/O库函数。从I/O函数提出I/O请求到设备响应并完成I/O请求,整个过程涉及多层次的I/O软件和I/O硬件的协调工作。本章主要介绍与I/O操作相关的软硬件协同内容,主要包括文件的概念、系统级I/O函数、C标准I/O库函数、设备控制器的基本功能和结构、I/O端口的编址方式、外设与主机之间的I/O控制方式以及利用陷阱指令将用户I/O请求转换为I/O硬件操作的过程,最终通过对hello程序加载执行过程的描述将前面各章的内容进行关联和总结。
第10章 程序性能的优化:主要介绍程序性能的优化方法,包括计算机系统性能评估方法、程序性能瓶颈分析方法、基于分层的性能优化技术分类,最后针对函数调用和指针别名这两类编译器不易优化的场景,介绍如何编写适合编译优化的源代码。
第11章 网络编程:网络编程在互联网应用中扮演着非常重要的角色,是互联网时代最底层的核心技术之一。了解网络编程的工作原理,有助于提升读者网络应用开发和调试的能力,并能够使读者深入理解TCP/IP网络通信协议。本章主要介绍网络I/O、MAC地址与IP地址、交换机与路由器、子网掩码与子网划分、TCP/IP通信协议、套接字编程等。
第12章 并发编程:了解并发编程的工作原理,有助于读者深入理解多线程与多进程程序的实现机制,提升并发应用程序的开发能力与调试能力。本章主要介绍并发编程的基本概念、并发与并行的区别、多进程与多线程、同步与互斥、并行程序设计等。
2.读者所需的背景知识
本书假定读者有一定的C语言程序设计基础,已经掌握了C语言的语法和各类控制语句、数据类型及其运算、各类表达式、函数调用和C语言的标准库函数等相关知识。
此外,本书还会对程序中指令的执行过程进行介绍,其中涉及布尔代数、逻辑运算电路、存储部件等内容,因而本书假定读者具有数字逻辑电路的基础知识。本书大多数C语言程序对应的机器级表示都是基于IA-32/x86-64+Linux平台用GCC编译器生成的,书中会在介绍程序的机器级表示之前,先简要介绍32位架构IA-32和64位架构x86-64,包括其机器语言和汇编语言,因而读者不需要任何指令系统和机器级语言的背景知识。
3.使用本书作为教材的课程
传统的计算机类专业课程体系按计算机系统层次结构横向切分,自下而上分成“数字逻辑电路”“计算机组成原理”“汇编程序设计”“操作系统”“编译原理”“程序设计”等课程,而且,每门课程都仅局限在本抽象层,相互之间很少关联,因而学生很难对完整的计算机系统形成全面认识。
本书在借鉴国外相关课程教学内容和相关教材的基础上编写而成,适合在完成程序设计基础课程后学习。本书内容贯穿计算机系统各抽象层,是关于计算机系统的最基础内容,因而使用本书作为教材开设的课程适用于所有计算机类相关专业。
使用本书作为教材开设的课程名称可以是“计算机系统基础”“计算机系统导论”或类似名称,可以有以下几种安排方案。
对于上表的说明如下:
• 第一种课程适合软件工程等不需要深入掌握底层硬件细节的专业。开设该课程后,无须开设“数字逻辑电路”“汇编程序设计”“计算机组成原理”“微机原理与接口技术”等偏硬件类课程,只要在课程的第2章中补充一些布尔代数和基本门电路的内容即可。本书将底层指令系统和微架构的基本内容与高级语言程序、操作系统的部分概念、编译和链接的基本内容有机联系在一起,作为一门完整的课程进行教学,不仅能缩减大量课时,还可以通过该课程的讲授为学生的系统能力培养打下坚实基础。因为课程内容较多,建议开设为一学年课程,第一学期学习第1~5章,第二学期学习第6~12章。每学期总学时数为64左右。
• 第二种课程适合计算机工程、计算机系统等偏系统或硬件的专业。可以在该课程前或该课程后,开设一门将“数字逻辑电路”和“计算机组成原理”的内容合并的课程,专门介绍数字逻辑和微架构设计技术;也可以在该课程之前先开设“数字逻辑电路”课程,之后再开设“计算机组成与系统结构”课程。建议开设为一学期课程,根据带*的章节内容是否讲解,总学时数为60~80。
• 第三、四和五种课程,适合其他与计算机相关的非计算机专业或大专类计算机专业,在学时受限的情况下,可以选择一些基本内容进行讲授。建议开设为一学期课程,总学时数为60~80。
用书教师可登录https://g.cmptt.com/7LJ5S,注册后加入本书的数字教研室,获得本书的教学资源、申请电子样书、参与教学交流等。
4.如何阅读本书
本书的出发点是将计算机系统每个抽象层中涉及的重要概念以程序的开发和运行过程为主线串起来,因而本书中所有问题和内容都从程序出发,这些内容涉及程序中数据的表示及运算、程序对应的机器级表示、多个程序模块的链接、程序的加载及运行、程序执行过程中的异常中断事件、程序中的I/O操作等。本书从读者熟悉的程序开发和运行过程出发,介绍计算机系统的基本概念,可以使读者将新学的概念与已有的知识建立关联,不断拓展和深化知识体系。因为所有内容都从程序出发,所以所有内容都可以通过具体程序进行验证,读者可边学边干,使所学知识转化为实践能力。
本书虽然涉及内容较广,但所有内容之间都具有非常紧密的关联,因而建议读者在阅读本书时采用“整体性”学习方法,通过第1章的学习先建立一个粗略的计算机系统整体框架,然后通过后续章节的学习,不断将新的内容与前面的内容关联起来,逐步细化计算机系统框架内容,最终形成比较完整的、相互密切关联的计算机系统整体概念。
本书提供了大量的例题和课后习题,这些题目大多是具体的程序示例,通过对这些示例的分析或验证性实践,读者可以对基本概念有更加深刻的理解。因此,在阅读本书时,若遇到一些难以理解的概念,可以先不用仔细琢磨,而是通过具体程序的反汇编代码对照基本概念和相关手册中的具体规定来理解。
本书提供的小贴士对理解书中的基本概念很有用,但是,由于篇幅有限,这些补充资料不可能占用很大篇幅,大多是简要内容。如果读者希望了解更多的细节,可以自行到互联网上查找。
本书内容虽然涉及高级语言程序设计、数字逻辑电路、汇编语言程序、计算机组成与系统结构、操作系统、编译器和链接器等,但主要讲解它们之间的关联,而不提供其细节,如果读者想要了解更详细的内容,还要阅读关于这些内容的专门书籍。不过,若读者学完本书后再去阅读这些书籍,则会轻松很多。
本书第1~9章由袁春风编写,第10章由余子濠编写,第11、12章由朱光辉编写,全书由袁春风和余子濠负责内容组织与统稿。
5.致谢
衷心感谢在本书的编写过程中给予我们热情鼓励和中肯建议的各位专家、同事和同学。在本书的编写过程中,我们得到了国防科技大学的王志英教授、北京航空航天大学的马殿富教授、西北工业大学的周兴社教授、武汉大学的何炎祥教授、北京大学的陈向群教授、国防科技大学的罗宇教授等各位专家的悉心指导和热情鼓励;浙江大学城市学院的杨起帆教授对本书的前三章进行仔细审阅,提出了许多宝贵的修改意见;西安邮电大学的陈莉君教授、山东大学的杨兴强教授和中国石油大学(华东)的张琼声副教授从书稿的篇章结构到内容各个方面都提出了许多宝贵的意见;中国海洋大学的蒋永国教授对本书的编写和修改提出了很好的建议;中国石油大学(华东)的范志东同学对本书第9章的部分内容提出了宝贵的修改意见,并提供了第5章中某可执行文件程序头表中的部分信息。
本书以我们在南京大学讲授的“计算机组成与系统结构”和“计算机系统基础”两门课程的部分讲稿内容为基础,感谢南京大学各位同人和各届同学对讲稿内容与教学过程所提出的宝贵反馈和改进意见,这使本书的内容得以不断改进和完善。唐杰副教授和蒋炎岩副教授等课程主讲老师对本书的内容和篇章结构提出了宝贵的意见,并提供了部分编程实例;2015级唐瑞泽和谢旻晖等同学为本书提供了有益的素材;2018级陈璐同学为本书中的hello程序运行过程的综述给出了初始文稿。
6.结束语
本书广泛参考了国内外相关的经典教材和教案,在内容上力求做到取材先进并反映技术发展现状,在内容的组织和描述上力求概念准确、语言通俗易懂、实例深入浅出,并尽量利用图示和实例来解释和说明问题。但是,由于计算机系统相关技术在不断发展,新的思想、概念、技术和方法不断涌现,加之作者水平有限,在编写中难免存在不当或遗漏之处,恳请广大读者对本书的不足之处给予指正,以便在后续的版本中予以改进。
作者于南京
2024年4月