计算机系统(基于RISC-V+Linux平台)

计算机系统(基于RISC-V+Linux平台)

作 者袁春风 余子濠 陈璐
单 位南京大学
内容提要
本书是计算机领域本科教育教学改革试点工作(简称“101计划”)系列教材之一。本书主要介绍计算机系统相关知识体系。全书共分10章,主要内容包括计算机系统概述、数据的类型及机器级表示、数据的运算及运算部件、指令系统及程序的机器级表示、程序的链接、中央处理器、存储器层次结构、进程与异常控制流、I/O操作的实现、并行处理系统等。 本书内容详尽,概念清楚,通俗易懂,实例丰富,并提供了大量典型习题供读者练习。本书可以作为高等学校计算机及相关专业本科计算机系统课程的基础性教材,也可以作为有关专业研究生或计算机技术人员的参考书。
前言

基于大数据处理的人工智能时代的到来,使得原先基于PC而建立起来的专业教学内容已经远远不能反映现代社会对计算机专业人才的培养需求,对计算机专业人才的培养从强调“程序”设计已变为更强调“系统”设计。这需要我们重新规划教学课程体系,调整教学理念和教学内容,加强对计算机系统能力的培养,使读者能够深刻理解计算机系统的整体概念,更好地掌握软硬件协同设计和程序设计技术,从而培养出更多能满足业界需求的各类计算机专业人才。不管培养计算机系统哪个层面的计算机技术人才,计算机专业教育都要重视学生“系统观”的培养。

本书是为加强计算机类专业学生的“系统观”而编写的、面向计算机系统基础类课程教学的教材。

1.本书的写作思路和内容组织

本书从程序员视角出发,以高级语言程序的开发和运行过程为主线,将该过程中每个环节涉及的硬件和软件基本概念关联起来,试图使读者建立一个完整的计算机系统层次结构框架,了解计算机系统全貌和相关知识体系,初步理解计算机系统中每一个抽象层及其相互转换关系,建立高级语言程序、指令集体系结构、底层微架构、操作系统、编译器、链接器等之间的相互关联;对指令在硬件上的执行过程以及指令的底层硬件执行机制有较深入的认识和理解,在增强读者的程序调试和程序性能优化及程序移植等方面能力的同时,也培养其对CPU等底层硬件的设计能力,并为后续操作系统、编译技术、计算机体系结构等课程的学习打下坚实基础。

本书在总结和借鉴国内外高校教材、教案、教学理念和教学方法的基础上,力图以“培养学生现代计算机系统设计能力”为目标,贯彻“从程序设计视角出发、强调软硬件关联与协同、以CPU设计为核心”,以系统化观点全面介绍计算机系统各抽象层之间的关联关系以及计算机组成与系统结构相关内容。

本书的具体内容包括程序中处理的数据在机器中的表示、数据的运算及其运算电路、指令系统、程序中各类控制语句对应的机器级代码结构、可执行目标代码的链接生成、可执行目标代码中的指令序列在机器上的执行过程、CPU设计、存储访问过程、打断程序正常执行的机制、程序中I/O操作功能的实现、并行处理涉及的基本问题等。

本书以高级语言程序为出发点来组织内容,按照“自顶向下”的方式,遵循高级语言程序→汇编语言程序→机器指令序列→CPU设计的顺序,展现程序从程序设计、编译转换、链接,到最终运行的整个过程。

本书共有10章,分四部分。第1章作为导引部分,基于一个简单模型机概要介绍计算机系统的内容;第2~5章为第一部分———程序的表示和可执行文件的生成,主要围绕程序的编译、汇编和链接进行介绍;第6、7章为第二部分———可执行文件的执行与存储访问,主要围绕程序在CPU中的执行过程和在存储器中的访问过程进行介绍;第8、9章为第三部分———硬件与操作系统之间的协同机制,主要介绍进程的上下文切换、进程控制、异常和中断处理、程序中I/O操作的底层实现机制,最终通过hello程序加载执行过程综述对系统各层次关联内容进行归纳、总结;第10章为第四部分———并行处理系统,简要介绍几类典型并行处理计算系统的基本结构。

本书各章的主要内容说明如下。

第1章计算机系统概述本章主要介绍计算机的基本工作原理、程序的开发与执行过程、计算机系统的基本组成、计算机系统层次结构。

第2章数据的类型及机器级表示本章主要介绍各类数据在计算机中的表示。从C程序中变量和常量的类型及表示引出本章的主要内容,包括无符号整数和带符号整数的表示、浮点数的表示和非数值数据的表示,以及数据表示和存储中涉及的数据宽度单位、排列顺序和类型转换等。

第3章数据的运算及运算部件本章主要介绍计算机中的基本算术运算和运算电路,包括各类基本定点运算部件和浮点数运算。计算机中的算术运算与现实中的算术运算有所区别,例如,一个整数的平方可能为负数,两个正整数的乘积可能比乘数小,浮点数运算时可能不满足结合律。计算机算术运算的这些特性使有些程序可能产生意想不到的结果,甚至造成安全漏洞,许多程序员为此感到困惑和苦恼。本章从数据的基本运算电路层面解释计算机算术运算的本质特性,从而使程序员能够清楚地理解由于计算机算术的局限性而造成的异常程序行为。

第4章指令系统及程序的机器级表示计算机硬件只能理解机器语言程序,机器语言标准规范是位于软件和硬件交界面指令集体系结构,即指令系统。本章主要介绍指令系统以及C程序中的过程调用和控制语句(如选择、循环等结构语句)以及各类数据结构(如数组、指针、结构、联合等)元素的访问所对应的机器级代码。通过本章学习读者将会明白诸如以下一些问题:过程调用时按值传参和按地址传参的本质差别是什么?缓冲区溢出漏洞是如何造成的?为何递归调用会耗内存?指针操作的本质是什么?

第5章程序的链接本章主要介绍如何将多个程序模块链接成一个可执行文件。通过介绍与链接相关的目标文件格式、符号解析、重定位、静态库和共享库等内容,使读者清楚了解为何不能出现同名全局变量、为何可出现同名静态变量等编程问题。

第6章中央处理器可执行文件被加载后就开始在计算机中执行,计算机采用“存储程序”工作方式,能自动从主存取出一条条指令执行。专门用来执行指令的部件称为中央处理器(CPU)。在CPU中控制指令执行的部件称为控制器,指令执行过程中数据所经过的路径,包括路径上的部件称为数据通路。本章主要介绍CPU的基本功能和基本组成、单周期处理器中控制器和数据通路、多周期处理器及其硬连线控制器和微程序控制器、指令流水线的工作原理、流水线数据通路、指令流水线中各种冲突(冒险)现象及其解决方法,并简要介绍一些高级流水线技术。

第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程序加载执行过程的描述将前9章的内容进行关联和总结。

第10章并行处理系统为了追求更高的计算性能,出现了各种不同的并行处理系统。通过对多个功能部件、多个处理器核、多个CPU或多台计算机的互连,一个系统同时进行多条指令、多个数据、多个线程或多个任务的处理,从而实现计算速度和计算能力的大幅提升。本章主要介绍几类典型的并行处理计算系统的基本硬件结构,并简要介绍几种并行处理编程模式。

2.本书的主要特色

不管构建一个计算机系统的硬件和软件有多大的差别,其计算机系统的构建原理以及在计算机系统上的程序转换和执行机理都是相通的,因而,本书主要结合一种特定计算机系统平台介绍相关内容。本书所用的平台为RISC-V+Linux+GCC+C语言,即底层指令集体系结构以64位RISC-V架构(即RV64)为主。

本书基于“RISC-V+Linux”平台进行内容组织,有以下几个特色。

(1)紧扣国家自主创新技术人才培养的需求RISC-V是免费开放的指令集架构,基于RISC-V架构的开源芯片开发方兴未艾,开源软硬件开发方式是加快我国计算机系统核心技术自主创新的一种有效手段,基于新兴开放指令集和开源操作系统进行教学,可以加快和深化我国计算机系统核心技术自主创新人才的培养步伐。

(2)RISC-V适合指令集对比教学RISC-V是在对所有其他传统的指令集架构进行深入研究的基础上提出来的新兴指令集架构,具有其他指令集架构不具备的一些特点,非常适合与传统指令集架构进行对比教学。

(3)RISC-V适合微架构设计方面的教学RISC-V架构复杂度适中,特别适用于微架构设计方面的教学,我们从2009年开始编写出版过基于MIPS、IA-32/x86-64、RISC-V、ARM等主流指令集架构的多套计算机系统类教材,对这些架构做过比较深入的分析与比较,对于处理器设计方面的教学来说,RISC-V架构在复杂度方面比较适中。

(4)RISC-V适用于系统层面的教学RISC-V基础指令集的小型浓缩化、功能指令集的模块化、代码长度的可缩性、访存指令的简洁与灵活性、过程调用的简洁性、特权模式的可组合性、异常/中断处理的简洁和灵活性,以及无分支延迟槽等很多特性,都使采用RISC-V架构进行相关教学更能阐述清楚上层软件与指令集架构之间、指令集架构与底层微架构之间的密切关系。

此外,中国科学院大学和中国科学院计算技术研究所共同推动的“一生一芯”计划,是探索我国计算机系统核心技术人才培养,特别是处理器芯片设计人才培养的一个开拓性项目,南京大学“计算机系统基础”课程大作业PA的设计者,也是本书的合著者余子濠博士作为“一生一芯”计划的教学方案设计者,把南京大学多门相关课程的实践项目运用于“一生一芯”计划的教学方案中,同时,又把在“一生一芯”计划实践过程中反馈获得的经验和想法,反过来不断优化南京大学相关课程的实践教学。目前已经成立由多名南京大学老师和“一生一芯”计划指导人员组成的相关实践项目设计开发小组,正在设计一套基于RISC-V架构包含虚拟FPGA板卡、数字逻辑电路、处理器设计、SoC、OS及应用程序的全系统实验,通过南京大学相关课程教学和“一生一芯”计划之间的不断迭代优化,最终将形成与本书配套的实践教程。在该实践教程中,还会介绍中国科学院计算技术研究所牵头的开源RISC-V高性能处理器“香山”、阿里平头哥的玄铁处理器和无剑SoC开发平台等内容以及相应实践项目。

3.读者所需的背景知识本书假定读者对C语言程序设计有一定的基础,已经掌握了C语言的语法和各类控制语句、数据类型及其运算、各类表达式、函数调用和C语言的标准库函数等相关知识。此外,本书对运算电路和中央处理器设计进行了介绍,这要求读者对布尔代数、基本组合逻辑和时序逻辑电路等有基本的了解。本书大多数C语言程序对应的机器级表示都基于RV64+Linux平台用GCC编译器生成,本书在介绍程序的机器级表示之前,先简要介绍了32位和64位RISC-V架构,包括其机器语言和汇编语言,因而读者无须任何指令系统和机器级语言的背景知识。

4.使用本书作为教材的课程传统的计算机类专业课程体系按计算机系统层次结构横向切分,自下而上分成数字逻辑电路、计算机组成原理、汇编程序设计、操作系统、编译原理、程序设计等课程,而且,每门课程都仅局限在本抽象层,相互之间很少关联,因而学生很难形成对完整计算机系统的全面认识。本书适合在完成程序设计基础课程后进行学习,内容贯穿计算机系统各抽象层,是关于计算机系统的最基础内容,因而使用本书作为教材开设的课程适用于所有计算机类相关专业。使用本书作为教材开设的课程名称可以是“计算机系统基础”“计算机系统导论”“计算机组成与系统结构”或类似名称,可以有以下多种安排方案。

对于以上教学安排说明如下。

第①、②两种方案适合两学期课程。若课程体系中同时有“计算机系统导论”和“计算机组成与系统结构”课程,或者有两学期的“计算机系统导论”课程,则可以第一学期介绍前5章内容,围绕可执行文件的生成进行讲解,第二学期介绍第6~10章内容,围绕程序的执行和存储访问以及软硬件协同机制,依次介绍处理器设计、程序执行过程中的存储访问、进程的加载执行和异常处理、I/O操作的实现等内容。每学期总学时为64左右。

第③、④、⑤种方案适合一学期课程。若课程体系中后续还有使用其他教材的“计算机组成与系统结构”课程,则可以采用第③种方案先上一学期“计算机系统导论”课程。若课程体系中只有一门一学期的“计算机系统导论”或“计算机组成与系统结构”课程,则可以采用第④或第⑤种方案,若第④种方案教学学时不够,可跳过加部分,而第⑤种方案需要授课老师对各章节内容进行裁剪,选择最基础的内容进行讲解。

5.如何阅读本书

本书的出发点是试图将计算机系统每个抽象层中涉及的重要概念以程序开发和运行过程为主线串联起来,因而本书涉及的所有问题和内容都从程序出发,这些内容涉及程序中数据的表示及运算、程序对应的机器级表示、多个程序模块的链接、程序的加载及运行、程序执行过程中的异常/中断事件、程序中的I/O操作等。从读者熟悉的程序开发和运行过程出发介绍计算机系统的基本概念,可以使读者将新学的概念与已有的知识建立关联,不断拓展和深化知识体系。因为所有内容都从程序出发,因而所有内容都可以通过具体程序进行验证,在边学边干中将所学知识转化为实践能力。

本书虽然涉及内容较广,但所有内容之间具有非常紧密的关联,因而建议读者在阅读本书时采用“整体性”学习方法,通过第1章的学习先建立一个粗略的计算机系统整体框架,然后通过后续章节的学习,不断地将新的内容与前面内容关联起来,逐步细化计算机系统框架内容,最终形成比较完整的、密切关联的计算机系统整体概念。本书提供了大量的例题和课后习题,这些题目大多是具体的程序示例,通过对这些示例的分析或验证性实践,读者可以对基本概念有更加深刻的理解。因此,在阅读本书时,若遇到一些难以理解的概念,可以先不用仔细琢磨,而是通过具体程序的反汇编代码来对照基本概念和相关手册中的具体规定进行理解。

本书内容虽然涉及高级语言程序设计、数字逻辑电路、汇编语言程序、计算机组成与系统结构、操作系统、编译器和链接器等,但主要是讲解它们之间的关联,而不提供其细节,如果读者想要了解更详细的内容,还要阅读关于这些内容的专门书籍。不过,若读者学完本书后再去阅读这些书籍,则会轻松很多。

6.致谢

首先,特别感谢中国人民解放军国防科技大学王志英教授,他对本书进行了全面、细致的审阅,并对本书的编写和修改提出了很好的建议。非常感谢中国科学院计算技术研究所包云岗研究员,因为是通过他和他的学生了解了RISC-V指令集架构的魅力,也是通过他分享的一些RISC-V架构的资料,开始接触和学习RISC-V架构相关技术。同时,本书的第2作者余子濠和第3作者陈璐是在包云岗研究员的亲自指导下,直接从事RISC-V架构相关教学科研项目,因而为本书的编写和顺利出版打下了良好的基础。

非常感谢赛灵思(Xilinx)公司和阿里云计算有限公司对教育部产学合作协同育人项目的大力支持。同时,非常感谢江南大学柴志雷教授,感谢柴老师从最初的提议、鼓励到相关资料的提供与写作时的建言献策等给予的无私帮助。

在本书的编写过程中,得到了南京大学张福炎教授的悉心指导;同时得到了中国人民解放军国防科技大学王志英教授、西北工业大学周兴社教授、中国人民解放军国防科技大学罗宇教授等各位专家的悉心指导和热情鼓励;书中有关CPU设计的最初图稿和内容组织思路由南京大学陈贵海教授提供。在此对以上各位老师一并表示衷心的感谢。

本书是作者在南京大学从事“计算机组成与系统结构”“计算机系统基础”两门课程教学所积累的部分讲稿内容的基础上编写而成的,感谢南京大学各位同仁和各届学生对讲稿内容和教学过程所提出的宝贵的反馈和改进意见,使本书的内容得以不断地改进和完善。

特别感谢本书合著者余子濠和陈璐的辛勤付出,他们对书中所有程序代码和数据通路结构等进行了设计和验证,对书中相关内容与对应手册中的规定进行了详细的审核和修订,通过给出hello程序加载执行的详细过程对系统各层次关联内容进行了归纳、总结,对全书的组织结构和书中一些关键内容提出了很好的修改意见,并对全书进行了多轮次的统稿和修订。特别地,本书中所有示例的反汇编代码均由第3作者陈璐在Ubuntu22.04+GCC11.3.0下生成,编译的命令及参数默认为“riscv64-linux-gnu-gcc-O1-fno-ipa-pure-const-fno-inline-functions-called-once-fno-stack-protector-Wall-Werror-march=rv64g-no-pie”,保证读者可在相同条件下复现书中示例的结果,为读者的学习提供便利。

7.结束语

本书广泛参考了国内外相关的经典教材和教案,在内容上力求做到取材先进并反映技术发展现状;在内容的组织和描述上力求概念准确、语言通俗易懂、实例深入浅出,并尽量利用图示和实例来解释和说明问题。但是,由于计算机系统相关技术在不断发展,新的思想、概念、技术和方法不断涌现,加之作者水平有限,在编写中难免存在不当或遗漏之处,恳请广大读者对本书的不足之处给予指正,以便在后续版本中予以改进。

目录

第 1 章 计算机系统概述

1.1 计算机系统基本工作原理

1.2 程序的开发与运行

1.3 计算机系统的基本组成

1.4 计算机系统的层次结构

1.5 本章小结

第 2 章 数据的类型及机器级表示

2.1 C 程序中的变量和常量

2.2 进位记数制和定点数表示

2.3 整数的表示

2.4 浮点数的表示

2.5 非数值数据的编码表示

2.6 数据的宽度、存储和转换

2.7 本章小结

第 3 章 数据的运算及运算部件

3.1 高级语言和机器指令中的运算

3.2 基本运算部件

3.3 定点运算及其运算部件

3.4 整数乘除运算

3.5 浮点数的运算

3.6 本章小结

第 4 章 指令系统及程序的机器级表示

4.1 指令格式

4.2 指令系统设计

4.3 RISC-V 指令系统

4.4 程序的机器级表示

4.5 复杂数据类型的分配和访问

4.6 本章小结

第 5 章 程序的链接

5.1 编译、汇编和静态链接

5.2 目标文件格式

5.3 符号表和符号解析

5.4 符号的重定位

5.5 动态链接

5.6 本章小结

第 6 章 中央处理器

6.1 CPU 概述

6.2 单周期处理器设计

6.3 多周期处理器设计

6.4 流水线处理器设计

6.5 流水线冒险及其处理

6.6 高级流水线技术

6.7 本章小结

第 7 章 存储器层次结构

7.1 存储器概述

7.2 半导体随机存取存储器

7.3 外部存储器

7.4 高速缓冲存储器

7.5 虚拟存储器

7.6 本章小结

第 8 章 进程与异常控制流

8.1 进程与进程的上下文切换

8.2 异常和中断

8.3 RISC-V 的异常和中断机制

8.4 RISC-V+Linux 中异常和中断机制

8.5 本章小结

第 9 章 I/O 操作的实现

9.1 I/O 子系统概述

9.2 用户空间 I/O 软件

9.3 内核空间 I/O 软件

9.4 I/O 硬件与软件的接口

9.5 hello 程序运行过程综述

9.6 本章小结

第 10 章 并行处理系统

10.1 并行处理系统概述

10.2 多处理器系统

10.3 多计算机系统

10.4 向量处理机和 SIMD 技术

10.5 并行处理编程模式简介

10.6 本章小结

App 下载
关注我们