如何用Y86×64语言实现linux 读写寄存器PC寄存器

深入理解计算机系统4.1X86的孪生兄弟,Y86指令体系结构_博客园
当前位置: >
>深入理解计算机系统4.1X86的孪生兄弟,Y86指令体系结构
深入理解计算机系统4.1X86的孪生兄弟,Y86指令体系结构
& 作者:左潇龙 & 来源: 博客园-zuoxiaolong &
会太陌生,LZ这里就不仔细的解释了,下面我们只简单的把每个指令的作用过一遍。
  halt:这个指令将会终止指令的执行。
  nop:这是一个占位指令,它不做任何事情,后续为了实现流水线,它有一定的作用。
  xxmovl:这是一系列的数据传送指令,其中r代表寄存器,m代表存储器,i代表立即数。比如rrmovl指令,则代表将一个寄存器的值,赋给另外一个寄存器。
  opl:操作指令,比如加法,减法等等。
  jxx:条件跳转指令,根据后面的条件进行跳转。
  cmovxx:条件传送指令,后面的xx代表的是条件。特别的是,条件传送只发生在两个寄存器之间,不会将数据传送到存储器。
  call与ret:方法的调用和返回指令。一个将返回地址入栈,并跳到目标地址。一个将返回地址入PC,并跳到返回地址。
  push与pop:入栈和出栈操作。
  这里LZ还要说的一点是,在图的右边,是指令所占的字节数或者说编码。一般两个寄存器占用一个字节,存储器则占用四个字节,指令的编码和功能占用一个字节。因此可以看到,比如rrmovl指令,它的字节长度是2,其中第一个字节代表了指令rrmovl,第二个字节代表了两个寄存器。
  对于opl、jxx、cmovxx指令来说,都有一个fn标识,占用4个二进制位(半个字节)。这个便是指令的功能部分,这个是由于它们的指令编码一样,但功能有所不同所造成的。比如对于opl,就有加、减、与、异或等操作,那么它们的指令编码第一个字节就分别为十六进制的60、61、62、63。
  对于寄存器的表示,是使用4个二进制位表示的,这是一个ID标识。所有的寄存器可以看做是一个寄存器文件,其中的ID标识就类似于它们的地址。对于一些只需要一个寄存器的指令来说,另一个寄存器标识位使用0xF表示。
  还有的指令需要一个字的常数,比如irmovl指令,call指令等等。这种指令,将把常数放在最后的四个字节当中,顺序按照大端法或小端法表示(与机器和OS有关)。对于call指令来说,这四个字节就是一个地址,这个地址就是绝对地址,指向了存储器当中的某一个位置,这个位置存储着代码。采用绝对地址是为了描述简单,真实当中,是采取的基于PC的相对地址。
  对于Y86来说,程序猿可见的状态中就有stat状态码,它标识了程序执行的状态。Y86需要有能力根据stat去做一些处理。不过为了简单起见,这里除了正常执行之外,都将停止指令的执行。真实当中,会有专门的异常处理程序。
  Y86有四种不同的状态码,AOK(正常)、HLT(执行halt指令)、ADR(非法地址)和INS(非法指令)。
  书中给出了一个示例程序,来说明X86和Y86的区别,这里LZ就不详细分析这些汇编指令了,这种事情在第三章已经做的很多了,各位猿友可以私底下自己分析一下。其实两者是非常相似的,毕竟Y86就是根据X86的结构YY出来的。区别就在于,有的时候Y86需要两条指令来达到X86一条指令就可以达成的目的。
  比如对于X86指令中的 addl $4,%ecx 这样的指令,由于Y86当中的addl指令中不包含立即数,所以Y86需要先将立即数存入寄存器,即使用irmovl指令,然后再使用addl来处理加法运算。
  总的来说,Y86就是一个X86的缩减版,它的目的是以简单的结构实现一个处理器,帮助我们了解处理器的设计和实现。有兴趣的猿友可以去观摩一下Y86程序生成的汇编代码,并进行逐一的分析,实际上,这与X86是十分类似的。
  本文的难度并不高,只是简单的介绍了一个类X86的指令集结构。接下来的内容需要我们了解一下具体的设计是如何进行的,以及如何使用硬件控制语言HCL。后面的内容相对来说会比较难理解,LZ在读的时候也是有点一知半解,尽管现在已经基本摸清了套路,但还是希望各位猿友在看的过程当中最好有自己的理解。
相关阅读:
来源:(微信/QQ:,微信公众号:makaidong-com) &&&&&& 欢迎分享本文,转载请保留出处!
&&&&&& 【原文阅读】:
上一篇:没有了
【相关文章】
每日最新文章
每日最热文章
本周最热文章
本月最热文章
本年最热文章
Powered by
Copyright &
www.makaidong.com, All Rights Reserved本目录推荐
中野猛,常娜,陈新
利波瓦卡,李亚舟,宋方睿
帕克,牛化成
Simon,姜斐祚
扫描二维码,在手机中查看本页
Copyright (C) 读书网 www.dushu.com , All Rights Reserved. 鄂ICP备号-2《深入理解计算机系统(原书第3版)计算机系统解析/电脑系统教程书应用程》【摘要 书评 试读】- 京东图书
深入理解计算机系统(原书第3版)计算机系统解析/电脑系统教程书应用程
与行业相比
京 东 价 &
[定价 &¥]
PLUS会员专享价
您购买此商品可享受专属价
增值业务 &
重  量 &
搭配赠品 &
加载中,请稍候...
加载中,请稍候...
加载中,请稍候...
加载中,请稍候...
加载中,请稍候...
规格与包装
商品介绍加载中...
下载客户端,开始阅读之旅
出版社机械工业出版社
丛书名深入理解计算机系统原书第3版
权利声明:京东上的所有商品信息、客户评价、商品咨询、网友讨论等内容,是京东重要的经营资源,未经许可,禁止非法转载使用。
注:本站商品信息均来自于合作方,其真实性、准确性和合法性由信息拥有者(合作方)负责。本站不提供任何保证,并不承担任何法律责任。
印刷版次不同,印刷时间和版次以实物为准。
价格说明:
京东价:京东价为商品的销售价,是您最终决定是否购买商品的依据。
划线价:商品展示的划横线价格为参考价,该价格可能是品牌专柜标价、商品吊牌价或由品牌供应商提供的正品零售价(如厂商指导价、建议零售价等)或该商品在京东平台上曾经展示过的销售价;由于地区、时间的差异性和市场行情波动,品牌专柜标价、商品吊牌价等可能会与您购物时展示的不一致,该价格仅供您参考。
折扣:如无特殊说明,折扣指销售商在原价、或划线价(如品牌专柜标价、商品吊牌价、厂商指导价、厂商建议零售价)等某一价格基础上计算出的优惠比例或优惠金额;如有疑问,您可在购买前联系销售商进行咨询。
异常问题:商品促销信息以商品详情页“促销”栏中的信息为准;商品的具体售价以订单结算页价格为准;如您发现活动商品售价或促销信息有异常,建议购买前先联系销售商咨询。
价 格: 到
   
iframe(src='//www.googletagmanager.com/ns.html?id=GTM-T947SH', height='0', width='0', style='display: visibility:')《信息安全系统设计基础》第七周学习总结
教材学习内容总结
与x86-64相比,Y86-64指令集的数据类型、指令和寻址方式都要少一些。它的字节级编码也比较简单,机器代码没有相应的x86-64代码紧凑。
程序员可见状态
定义一个指令集体系结构(例如Y86-64)包括定义各种状态单元、指令集和它们的编码、一组编程规范和异常事件处理。
Y86程序中的每条指令都会读取或者修改处理器状态的某些部分。这称为程序员可见状态。
15个程序寄存器:%rax、%rcx、%rdx、%rbx、%rsp、%rbp、%rsi、%rdi、%r8-%r14。每个程序寄存器存储一个64位的字。%rsp被入栈、出栈、调用和返回指令作为栈指针。
有3个一位的条件码:ZF、SF和OF,它们保存最近的算术或逻辑指令所造成影响的有关信息。程序计数器(PC)存放当前正在执行指令的地址。
Y86-64程序用虚拟地址来引用内存位置。
序状态的最后一个部分是状态码Stat,它表明程序执行的总体状态。它会指示是正常运行,还是出现了某种异常。
Y86-64指令
Y86-64指令集基本上是x86-64指令集的一个子集。它只包括8字节整数操作,寻址方式较少,操作数也较少。
movq指令分成了4个不同的指令:irmovq、rrmovq、mrmovq和rmmovq。分别显示地指明源和目的的格式:
1.源操作数:立即数(i)、寄存器(r)或内存(m)。
2.目的操作数:寄存器(r)、内存(m)。
指令名字的第一个字母就表示了源的类型、指令名字的第二个字母指明了目的的类型。
两个内存传送指令中的存储器引用方式是简单的基址和偏移量形式。
在地址计算中,我们不支持第二变址寄存器和任何寄存器值的伸缩。
不允许从一个内存地址直接传送到另一个内存地址。也不允许将立即数传送到内存。
4个整数操作指令:addq、subq、andq和xorq。
7个跳转指令:jmp、jle、jl、je、jne、jge和jg,根据分支指令的类型和条件代码的设置来选择分支。
6个条件传送指令:cmovle、cmovl、cmove、cmovne、cmovge和cmovg。
call指令将返回地址入栈,然后跳到目的地址。ret指令从这样的过程调用中返回。
pushq和popq实现入栈和出栈的操作。
halt指令停止指令的执行。
执行halt指令会导致处理器停止,并将状态码设置为HLT。
每条指令的第一个字节表明指令的类型。这个字节分为两个部分,每部分4位:高4位是代码部分,低4位是功能部分。功能值只有在一组相关指令共用一个代码时才会有用。
指令的字节级编码规则:每条指令的第一个字节表明指令的类型。分为两个部分,高4位是代码部分,低4位是功能部分。代码值为0~0xB,功能值只有在一组相关指令共用一个代码时才有用。
15个程序寄存器当中,每个都有一个相对应的0~0xE之间的寄存器标识符。
程序寄存器存在CPU中的一个寄存器文件中,这个寄存器文件就是一个小的、以寄存器ID作为地址的随机访问存储器。
分支指令和call指令,就没有寄存器指示符字节。
只需要一个寄存器操作数的指令(irmovq、pushq、popq)将另一个寄存器指示符设为0xF。
指令集的一个重要性质就是字节编码必须有唯一的解释。
Y86-64异常
对Y86-64来说,程序员可见的状态码包括Stat,它描述程序执行的总体状态,这个代码可能的值如下:
遇到器执行halt指令
遇到非法地址
遇到非法指令
指令模拟器,称为YIS,他的目的是模拟Y86-64机器代码程序的执行,而不用试图模拟任何具体处理器实现的行为。
逻辑设计和硬件控制语言HCL
要实现一个数字系统需要的三个主要的组成部分:计算对位进行操作的函数的组合逻辑、存储位的存储器单元,以及控制存储器元素更新的时钟信号。
逻辑门是数字电路的基本单元。它们产生的输出,等于它们输入位值的某个布尔函数。
逻辑门只对单个位的数进行操作,而不是整个字。
逻辑门总是活动的。一旦一个门的输入变化了,在短时间内,输出就会相应变化。
将很多逻辑门组合成一个网,就能构建计算块,称为组合电路。构建这些网有几个限制:
1.每个逻辑门的输入必须连接到下述选项之一:(1)一个系统输入;(2)某个存储器单元的输入;(3)某个逻辑门的输入。
2.两个或多个逻辑门的输出不能连接在一起。否则可能使线上信号矛盾,可能会导致一个不合法的电压或电路故障。
3.这个网必须是无环的。否则会导致该网络计算的函数有歧义。
HCL表达式很清楚地表明了组合逻辑电路和c语言中逻辑表达式的对应之处。它们都是用到布尔操作来对输入进行计算的函数,但是,这两种表达计算的方法之间也是有区别的。
在HCL中,我们将所有字级的信号都声明为int,不指定字的大小。
HCL允许比较是否相等,与c的使用方法一样,‘=’表示赋值,‘==’表示相等。
处理器中会用到很多多路复用器,使得我们能够根据某些控制条件,从很多源中选出一个字。在HCL中,多路复用函数是用情况表达式来描述的。情况表达式的通用格式如下:
select1:expr1;
select2:expr2;
selectk:exprk
组合电路本质上讲,不存储任何信息。相反,它们只是简单的响应输入信号,产生等于输入的某个函数的输出。
时序电路:有状态并且在这个状态上进行计算的系统。
两类存储器设备:
(1)时钟寄存器(简称寄存器):储存储单个位或字,时钟信号控制寄存器加载输入值。
(2)随机访问存储器(简称内存):存储多个字,用地址来选择该读或者写哪个字。
Y86-64处理器会用时钟寄存器保存程序计数器(PC)、条件代码(CC)和程序状态(Stat)。
Y86-64的顺序实现
处理一条指令包括很多的操作。将他们组织成某个特殊的阶段序列,即使指令的动作差异很大,但所有的指令都遵循统一的序列。
六个阶段内执行的操作:
(1)取指;从内存读取指令字节,地址为程序计数器(PC)的值。抽取指令指示符字节两个四位部分,称为icode(指令代码)和ifun(指令功能)。有如下公式:vaIP(下一条指令的地址)=PC+已取出指令的长度。
(2)译码:从寄存器文件读入最多两个操作数,得到valA和/或valB。
(3)执行:算术/逻辑单元要么执行指令指明的操作,计算内存引用的有效地址,要么增加或减少栈指针。得到的值称为valE。
(4)访存:将数据写入内存,或从内存读出数据。读出的值为valM。
(5)写回:最多可以写两个结果到寄存器文件。
(6)更新PC:将PC设成下一条指令的地址。
处理器无限循环,执行这些阶段,在简化的实现中,一旦发生任何异常,处理器就会停止。
SEQ的实现包括组合逻辑和两种存储器设备:
(1)时钟寄存器、程序计数器和条件码寄存器,随机访问存储器。
(2)程序计数器、条件码寄存器。数据内存和寄存器文件。
通过一个时钟信号来控制,触发将新值装载到寄存器以及将值写到随机访问存储器。
每个时钟周期,程序计数器都会装载新的指令地址。
只有在执行整数运算指令时,才会装载条件码寄存器。
只有在执行rmovq、pushq或call指令时,才会写数据内存。
SEQ阶段的实现:
(1)取指阶段(包括指令内存硬件单元):以PC为第一个字节的地址,一次从内存读10个字节。
三个一位的信号:
instr_valid:用于发现不合法的指令
need_regids:是否包含寄存器指示符字节
need_valC:是否包括常数字
(2)译码和写回阶段:寄存器文件有四个端口,支持同时进行两个读和两个写。每个端口有一个地址连接(寄存器ID)和一个数据连接(64根线路),既可以作为寄存器文件的输出字,又可以作为它的输入字。
(3)执行阶段:包括算数/逻辑单元(ALU),输出为valE信号。
(4)访存阶段:读或者写程序数据。两个控制块产生内存地址和内存输入数据的值。另外两个块产生表明应该执行读还是写操作的控制信号。当执行读操作时,数据内存产生valM。
(5)更新PC阶段:SEQ的最后一个阶段会产生程序计数器的新值,依据指令的类型和是否要选择分支,新的PC可能是valC、valM或者valP。
在实验楼构建YIS
新建两个文件夹,并进入,输入命令wget http://labfile.oss.aliyuncs.com/courses/413/sim.tar tar -xvf sim.tar成功会显示已保存
输入指令tar -xvf sim.tar,进入sim文件夹,输入指令sudo apt-get install tk,解析完成后输入sudo ln -s
/usr/lib/x86_64-linux-gnu/libtk8.6.so /usr/lib/libtk.so,再输入sudo ln -s
/usr/lib/x86_64-linux-gnu/libtcl8.6.so /usr/lib/libtcl.so,以及make指令。
进行YIS测试,进行汇编,由于已经都是.yo,所以不用进行汇编运行所有代码,查看asuml.yo,如下图
Y86模拟器安装
首先安装词法分析工具,在终端输入sudo apt-get install bison flex,使用命令sudo apt-get install tcl8.5-dev tk8.5-dev tcl8.5 tk8.5安装Tcl/Tk 支持图形界面。
下载并解压sim.tar压缩包,下载的网址我用的是实验楼的网址( ),输入命令wget http://labfile.oss.aliyuncs.com/courses/413/sim.tar下载,在终端输入命令tar -xvf sim.tar以解压sim压缩包。
打开sim中的Makefile,修改mkaefile文件,如下:
#GUIMODE=-DHAS_GUI----&GUIMODE=-DHAS_GUI
TKLIBS=-L/usr/lib/ -ltk -ltcl----&TKLIBS=-L/usr/lib/ -ltk8.5 -ltcl8.5 // 注意根据libtcl.so和libtk.so的路径以便gcc能找到库,在我的电脑中只要加上8.5
TKINC=-isystem /usr/include/tcl---&TKINC=-I /usr/include/tcl8.5
编译:进入sim目录:cd sim,
在sim目录下终端输入:make clean,
在sim目录下终端输入:make.
运行图形界面:
以pism为例:进入pipe目录,运行图形界面:./psim -t -g ../y86-code/asum.yo,如下图:
练习教材中p265的代码,得到如下图
教材学习中的问题和解决过程
(一个模板:我看了这一段文字 (引用文字),有这个问题 (提出问题)。 我查了资料,有这些说法(引用说法),根据我的实践,我得到这些经验(描述自己的经验)。 但是我还是不太懂,我的困惑是(说明困惑)。【或者】我反对作者的观点(提出作者的观点,自己的观点,以及理由)。 )
问题1:在实际操作时只能使用IA32的movl指令以及IA32寄存器,为什么教材上介绍的是x86-64寄存器呢
问题1解决方案:上网搜索,没有查到什么可用的信息,待解决。
代码调试中的问题和解决过程
问题1:在安装Y86时出现下图所示错误。
问题1解决方案:通过上网搜索并且多次尝试各种方法,最后通过输入命令sudo rm /var/cache/apt/archives/locksudo rm /var/lib/dpkg/lock,以及sudo rm /var/lib/dpkg/lock之后成功解除占用。
问题2:在练习教材p265的代码,获得.yo文件时,出现了下图所示问题
问题2解决方案:查看刚刚编写的p265.ys,将所有的irmovq改为irmovl等,使用IA32的movl指令,将寄存器改为IA32寄存器,如下图。成功解决。
上周考试错题总结
未公布答案
结对及互评
点评模板:
博客中值得学习的或问题:
代码中值得学习的或问题:
本周结对学习情况
- [](https://home.cnblogs.com/u/0831j/)
- ![](http://images2017.cnblogs.com/blog/711/38-.jpg)
- 结对学习内容
其他(感悟、思考等,可选)
这周学习了第四章,下载了Y86模拟器,在模拟器中还可以让它运行显示栈的变化,还是很神奇的,总的来说,这周接触的东西还是比较新鲜的,学习效率也还可以。
学习进度条
尝试一下记录「计划学习时间」和「实际学习时间」,到期末看看能不能改进自己的计划能力。这个工作学习中很重要,也很有用。
耗时估计的公式
:Y=X+X/N ,Y=X-X/N,训练次数多了,X、Y就接近了。
计划学习时间:20小时
实际学习时间:23小时
改进情况:
(有空多看看)
《深入理解计算机系统V3》学习指导
阅读(...) 评论()扫一扫下载手机客户端
扫描我,关注团购信息,享更多优惠
||网络安全
| | | | | | | | | | | | | | | |
||电子电工
汽车交通| | | | | | | | | |
||投资理财
| | | | | | | | | | | | | | | | |
| | | | | | |
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | |
||外语考试
| | | | | | | | |
| 视频教程|
深入理解计算机系统(原书第3版)
程序员必读的经典著作!理解计算机系统首选书目,10余万程序员的共同选择。第二版销售突破100000册,第三版重磅上市!
定价:¥139.00
校园优惠价:¥111.20 (80折)
促销活动:
商品已成功飞到您的手机啦!快登录手机站看看吧!
下载客户端
> 微信关注“互动出版网”,便捷查询订单,更多惊喜天天有
原书名:Computer Systems: A Programmer’s Perspective, Third Edition
ISBN:7上架时间:出版日期:2016 年11月开本:16开版次:1-1
所属分类:
770)this.width=770;' />
  1.第二版销售突破100000册,第三版重磅上市!2.理解计算机系统首选书目, 10余万程序员的共同选择3.卡内基-梅隆、北京大学、清华大学、上海交通大学等国内外众多知名高校选用指定教材4.从程序员视角全面剖析的实现细节,使读者深刻理解程序的行为,将所有计算机系统的相关知识融会贯通。5.新版本全面基于X86-64位处理器6.全新的阅读和学习体验:由国内名师录制章前导读,使读者可以了解各章的重点内容和知识关联,形成关于计算机系统的知识架构。并开设了本书的网络社区,读者可加入社区,获得本书相关学习资源,了解活动信息。
本书从程序员的视角详细阐述计算机系统的本质概念,并展示这些概念如何实实在在地影响应用程序的正确性、性能和实用性。全书共12章,主要包括信息的表示和处理、程序的机器级表示、处理器体系结构、优化程序性能、存储器层次结构、链接、异常控制流、虚拟存储器、系统级I/O、网络编程、并发编程等内容。书中提供了大量的例子和练习题,并给出部分答案,有助于读者加深对正文所述概念和知识的理解。
本书适合作为高等院校计算机及相关专业本科生、研究生的教材,也可供想要写出更快、更可靠程序的程序员及专业技术人员参考。
Randal E.Bryant 1973年于密歇根大学获得学士学位,随即就读于麻省理工学院研究生院,并在1981年获计算机科学博士学位。他在加州理工学院做了三年助教,从1984年至今一直是卡内基梅隆大学的教师。这其中有五年的时间,他是计算机科学系主任,有十年的时间是计算机科学学院院长。他现在是计算机科学学院的院长、教授。他同时还受邀任职于电子与计算机工程系。
他教授本科生和研究生计算机系统方面的课程近40年。在讲授计算机体系结构课程多年后,他开始把关注点从如何设计计算机转移到程序员如何在更好地了解系统的情况下编写出更有效和更可靠的程序。他和OHallaron教授一起在卡内基梅隆大学开设了15-213课程“计算机系统导论”,那便是此书的基础。他还教授一些有关算法、编程、计算机网络、分布式系统和VLSI(超大规模集成电路)设计方面的课程。
Bryant教授的主要研究内容是设计软件工具来帮助软件和硬件设计者验证其系统正确性。其中,包括几种类型的模拟器,以及用数学方法来证明设计正确性的形式化验证工具。他发表了150多篇技术论文。包括Intel、IBM、Fujitsu和Microsoft在内的主要计算机制造商都使用着他的研究成果。他还因他的研究获得过数项大奖。其中包括Semiconductor Research Corporation颁发的两个发明荣誉奖和一个技术成就奖,ACM颁发的Kanellakis理论与实践奖,还有IEEE颁发的W.R.G.Baker奖、Emmanuel Piore奖和Phil Kaufman奖。他还是ACM院士、IEEE院士、美国国家工程院院士和美国人文与科学研究院院士。
David R.OHallaron 卡内基梅隆大学计算机科学和电子与计算机工程系教授。在弗吉尼亚大学获得计算机科学博士学位,年为Intel匹兹堡实验室主任。
20年来,他教授本科生和研究生计算机系统方面的课程,例如计算机体系结构、计算机系统导论、并行处理器设计和Internet服务。他和Bryant教授一起在卡内基梅隆大学开设了作为本书基础的“计算机系统导论”课程。2004年他获得了卡内基梅隆大学计算机科学学院颁发的Herbert Simon杰出教学奖,这个奖项的获得者是基于学生的投票产生的。
O’Hallaron教授从事计算机系统领域的研究,主要兴趣在于科学计算、数据密集型计算和虚拟化方面的软件系统。其中最著名的是Quake项目,该项目是一群计算机科学家、土木工程师和地震学家为提高对强烈地震中大地运动的预测能力而开发的。2003年,他同Quake项目中其他成员一起获得了高性能计算领域中的最高国际奖项――Gordon Bell奖。他目前的工作重点是自动分级(autograding)概念,即评价其他程序质量的程序。
出版者的话
中文版序一
中文版序二
第1章 计算机系统漫游1
1.1 信息就是位+上下文1
1.2 程序被其他程序翻译成不同的格式3
1.3 了解编译系统如何工作是大有益处的4
1.4 处理器读并解释储存在内存中的指令5
1.4.1 系统的硬件组成5
1.4.2 运行hello程序7
1.5 高速缓存至关重要9
1.6 存储设备形成层次结构9
1.7 操作系统管理硬件10
1.7.1 进程11
1.7.2 线程12
1.7.3 虚拟内存12
1.7.4 文件14
  译者序:
  本书第1版出版于2003年,第2版出版于2011年,去年发行的已经是原书第3版了。第3版还是采用以下组合方式:在经典的x86架构机器上运行Linux操作系统,采用C语言编程。这样的组合经受住了时间的考验。这一版的一个明显变化就是从讲解IA32和x86-64转变为完全以x86-64为基础,相应地修改了第3、4、5、6和7章。同时,还改写了第2章,使之更易读、好懂;用近期的新技术更新了第6、11和12章。这些变化使得本书既和新技术保持了同步,又保留了描述系统本质的内容以及从程序员角度出发的特色。
  除了翻译本书,我们也开始以本书为教材讲授“计算机系统基础”课程,对这本书的理解也随之越来越深入,意识到除了阅读之外,动手实践更是学习计算机系统的必经之路。本书的官网提供了很多实验作业(Lab Assignment),其中不乏有趣且有一定难度的实验,比如Bomb Lab。有兴趣的读者除了阅读本书的内容之外,还应该试着去完成这些实验,让纸面上的内容在实际动手中得到巩固和加强。本书的官方博客也不断更新着有关这本书和配套课程的最新变化,这也是对本书的有益补充。
  第3版从翻译的角度来说,我们尽量做到更流畅,更符合中文表达的习惯。对于一些术语,比如memory,以前怕出错就统一翻译成存储器,现在则尽可能地按照语境去区分,翻译成内存或者存储器。
  在此,要感谢本书的编辑朱隆⒁僖约昂途玻兴堑闹С帧⒐睦湍托南钢碌墓ぷ鳎拍苋帽臼槿缙谟攵琳呒妗
  由于本书内容多,翻译时间紧迫,尽管我们尽量做到认真仔细,但还是难以避免出现错误和不尽如人意的地方。在此欢迎广大读者批评指正。我们也会一如既往地维护勘误表,及时在网上更新,方便大家阅读。(另外,本版第1次印刷时,我们已经根据官网日前发布的勘误进行了修正,就不在中文勘误中再翻译了。)
  龚奕利贺莲
  2016年5月于珞珈山
  本书(简称CS:APP)的主要读者是计算机科学家、计算机工程师,以及那些想通过学习计算机系统的内在运作而能够写出更好程序的人。
  我们的目的是解释所有计算机系统的本质概念,并向你展示这些概念是如何实实在在地影响应用程序的正确性、性能和实用性的。其他的系统类书籍都是从构建者的角度来写的,讲述如何实现硬件或系统软件,包括操作系统、编译器和网络接口。而本书是从程序员的角度来写的,讲述应用程序员如何能够利用系统知识来编写出更好的程序。当然,学习一个计算机系统应该做些什么,是学习如何构建一个计算机系统的很好的出发点,所以,对于希望继续学习系统软硬件实现的人来说,本书也是一本很有价值的介绍性读物。大多数系统书籍还倾向于重点关注系统的某一个方面,比如:硬件架构、操作系统、编译器或者网络。本书则以程序员的视角统一覆盖了上述所有方面的内容。
  如果你研究和领会了这本书里的概念,你将开始成为极少数的“牛人”,这些“牛人”知道事情是如何运作的,也知道当事情出现故障时如何修复。你写的程序将能够更好地利用操作系统和系统软件提供的功能,对各种操作条件和运行时参数都能正确操作,运行起来更快,并能避免出现使程序容易受到网络攻击的缺陷。同时,你也要做好更深入探究的准备,研究像编译器、计算机体系结构、操作系统、嵌入式系统、网络互联和网络安全这样的高级题目。
  读者应具备的背景知识
  本书的重点是执行x86-64机器代码的系统。对英特尔及其竞争对手而言,x86-64是他们自1978年起,以8086微处理器为代表,不断进化的最新成果。按照英特尔微处理器产品线的命名规则,这类微处理器俗称为“x86”。随着半导体技术的演进,单芯片上集成了更多的晶体管,这些处理器的计算能力和内存容量有了很大的增长。在这个过程中,它们从处理16位字,发展到引入IA32处理器处理32位字,再到最近的x86-64处理64位字。
  我们考虑的是这些机器如何在Linux操作系统上运行C语言程序。Linux是众多继承自最初由贝尔实验室开发的Unix的操作系统中的一种。这类操作系统的其他成员包括Solaris、FreeBSD和MacOS X。近年来,由于Posix和标准Unix规范的标准化努力,这些操作系统保持了高度兼容性。因此,本书内容几乎直接适用于这些“类Unix”操作系统。
  文中包含大量已在Linux系统上编译和运行过的程序示例。我们假设你能访问一台这样的机器,并且能够登录,做一些诸如切换目录之类的简单操作。如果你的计算机运行的是Microsoft Windows系统,我们建议你选择安装一个虚拟机环境(例如VirtualBox或者VMWare),以便为一种操作系统(客户OS)编写的程序能在另一种系统(宿主OS)上运行。
  我们还假设你对C和C++有一定的了解。如果你以前只有Java经验,那么你需要付出更多的努力来完成这种转换,不过我们也会帮助你。Java和C有相似的语法和控制语句。不过,有一些C语言的特性(特别是指针、显式的动态内存分配和格式化I/O)在Java中都是没有的。所幸的是,C是一个较小的语言,在Brian Kernighan和Dennis Ritchie经典的“K&R”文献中得到了清晰优美的描述\[61\]。无论你的编程背景如何,都应该考虑将K&R作为个人系统藏书的一部分。如果你只有使用解释性语言的经验,如Python、Ruby或Perl,那么在使用本书之前,需要花费一些时间来学习C。
  本书的前几章揭示了C语言程序和它们相对应的机器语言程序之间的交互作用。机器语言示例都是用运行在x86-64处理器上的GNU GCC编译器生成的。我们不需要你以前有任何硬件、机器语言或是汇编语言编程的经验。
  给C语言初学者关于C编程语言的建议
  为了帮助C语言编程背景薄弱(或全无背景)的读者,我们在书中加入了这样一些专门的注释来突出C中一些特别重要的特性。我们假设你熟悉C++或Java。
  如何阅读此书
  从程序员的角度学习计算机系统是如何工作的会非常有趣,主要是因为你可以主动地做这件事情。无论何时你学到一些新的东西,都可以马上试验并且直接看到运行结果。事实上,我们相信学习系统的唯一方法就是做(do)系统,即在真正的系统上解决具体的问题,或是编写和运行程序。
  这个主题观念贯穿全书。当引入一个新概念时,将会有一个或多个练习题紧随其后,你应该马上做一做来检验你的理解。这些练习题的解答在每章的末尾。当你阅读时,尝试自己来解答每个问题,然后再查阅答案,看自己的答案是否正确。除第1章外,每章后面都有难度不同的家庭作业。对每个家庭作业题,我们标注了难度级别:
  只需要几分钟。几乎或完全不需要编程。
  可能需要将近20分钟。通常包括编写和测试一些代码。(许多都源自我们在考试中出的题目。)
  需要很大的努力,也许是1~2个小时。一般包括编写和测试大量的代码。
  一个实验作业,需要将近10个小时。
  文中每段代码示例都是由经过GCC编译的C程序直接生成并在Linux系统上进行了测试,没有任何人为的改动。当然,你的系统上GCC的版本可能不同,或者根本就是另外一种编译器,那么可能生成不一样的机器代码,但是整体行为表现应该是一样的。所有的源程序代码都可以从csapp.cs.cmu.edu上的CS:APP主页上获取。在本书中,源程序的文件名列在两条水平线的右边,水平线之间是格式化的代码。比如,图1中的程序能在code/intro/目录下的hello.c文件中找到。当遇到这些示例程序时,我们鼓励你在自己的系统上试着运行它们。
  图1一个典型的代码示例
  中文版序一
  中国科学院院士
  发展中国家科学院院士/梅宏
  华章公司温莉芳女士邀我为即将出版的《Computer Systems:A Programmers Perspective》第3版的中文译本《深入理解计算机系统》写个序,出于两方面的考虑,欣然允之。
  一是源于我个人的背景和兴趣。我长期从事软件工程和系统软件领域的研究,对计算机学科的认识可概括为两大方面:计算系统的构建和基于计算系统的计算技术应用。出于信息时代国家掌握关键核心技术的重大需求以及我个人专业的本位视角,我一直对系统级技术的研发给予更多关注,由于这种“偏爱”和研究习惯的养成,以至于自己在面对非本专业领域问题时,也常常喜欢从“系统观”来看待问题和解决问题。我自己也和《深入理解计算机系统》有过“亲密接触”。2012年,我还在北京大学信息科学技术学院院长任上,学院从更好地培养适应新技术、发展具有系统设计和系统应用能力的计算机专门人才出发,在调查若干国外高校计算机学科本科生教学体系基础上,决定加强计算机系统能力培养,在本科生二年级增设了一门系统级课程,即“计算机系统导论”。其时,学校正在倡导小班课教学模式,这门课也被选为学院的第一个小班课教学试点。为了体现学院的重视,我亲自担任了这门课的主持人,带领一个18人组成的“豪华”教学团队负责该课程的教学工作,将学生分成14个小班,每个小班不超过15人。同时,该课程涉及教师集体备课组合授课、大班授课基础上的小班课教学和讨论、定期教学会议、学生自主习题课和实验课等新教学模式的探索,其中一项非常重要的举措就是选用了卡内基梅隆大学Randal E.Bryant教授和David R.OHallaron教授编写的《Computer Systems:A Programmers Perspective》(第2版)作为教材。虽然这门课程我只主持了一次,但对这本教材的印象颇深颇佳。
  二是源于我和华章公司已有的良好合作和相互了解。2000年前后,我先后翻译了华章公司引进(机械工业出版社出版)的Roger Pressman编写的《Software Engineering:A Practitioners Approach》一书的第4版和第5版。其后,在计算机学会软件工程专业委员会和系统软件专业委员会的诸多学术活动中也和华章公司及温莉芳女士本人有不少合作。近二十年来,华章公司的编辑们引进出版了大量计算机学科的优秀教材和学术著作,对国内高校计算机学科的教学改革起到了积极的促进作用,本书的翻译出版仍是这项工作的延续。这是一项值得褒扬的工作,我也想借此机会代表计算机界同仁表达对华章公司的感谢!
  计算机系统类别的课程一直是计算机科学与技术专业的主要教学内容之一。由于历史原因,我国的计算机专业的课程体系曾广泛参考ACM和IEEE制订的计算机科学与技术专业教学计划(Computing Curricula)设计,计算机系统类课程也参照该计划分为汇编语言、操作系统、组成原理、体系结构、计算机网络等多门课程。应该说,该课程体系在历史上对我国的计算机专业教育起了很好的引导作用。
  进入新世纪以来,计算技术发生了重要的发展和变化,我国的信息技术和产业也得到了迅猛发展,对计算机专业的毕业生提出了更高要求。重新审视原来我们参照ACM/IEEE计算机专业计划的课程体系,会发现存在以下几个方面的主要问题。
  1) 课程体系中缺乏一门独立的能够贯穿整个计算机系统的基础课程。计算机系统方面的基础知识被分成了很多门独立的课程,课程内容彼此之间缺乏关联和系统性。学生学习之后,虽然在计算机系统的各个部分理解了很多概念和方法,但往往会忽视各个部分之间的关联,难以系统性地理解整个计算机系统的工作原理和方法。
  2) 现有课程往往偏重理论,和实践关联较少。如现有的系统课程中通常会介绍函数调用过程中的压栈和退栈方式,但较少和实践关联来理解压栈和退栈过程的主要作用。实际上,压栈和退栈与理解C等高级语言的工作原理息息相关,也是常用的攻击手段Buffer Overflow的主要技术基础。
  3) 教学内容比较传统和陈旧,基本上是早期PC时代的内容。比如,现在的主流台式机CPU都已经是x86-64指令集,但较多课程还在教授80386甚至更早的指令集。对于近年来出现的多核/众核处理器、SSD硬盘等实际应用中遇到的内容更是涉及较少。
  4) 课程大多数从设计者的角度出发,而不是从使用者的角度出发。对于大多数学生来说,毕业之后并不会成为专业的CPU设计人员、操作系统开发人员等,而是会成为软件开发工程师。对他们而言,最重要的是理解主流计算机系统的整体设计以及这些设计因素对于应用软件开发和运行的影响。
  这本教材很好地克服了上述传统课程的不足,这也是当初北大计算机学科本科生教学改革时选择该教材的主要考量。其一,该教材系统地介绍了整个计算机系统的工作原理,可帮助学生系统性地理解计算机如何执行程序、存储信息和通信;其二,该教材非常强调实践,全书包括9个配套的实验,在这些实验中,学生需要攻破计算机系统、设计CPU、实现命令行解释器、根据缓存优化程序等,在新鲜有趣的实验中理解系统原理,培养动手能力;其三,该教材紧跟时代的发展,加入了x86-64指令集、Intel Core i7的虚拟地址结构、SSD磁盘、IPv6等新技术内容;其四,该教材从程序员的角度看待计算机系统,重点讨论系统的不同结构对于上层应用软件编写、执行和数据存储的影响,以培养程序员在更广阔空间应用计算机系统知识的能力。
  基于该教材的北大“计算机系统导论”课程实施已有五年,得到了学生的广泛赞誉,学生们通过这门课程的学习建立了完整的计算机系统的知识体系和整体知识框架,养成了良好的编程习惯并获得了编写高性能、可移植和健壮的程序的能力,奠定了后续学习操作系统、编译、计算机体系结构等专业课程的基础。北大的教学实践表明,这是一本值得推荐采用的好教材。
  该书的第3版相对于第2版进行了较大程度的修改和扩充。第3版从一开始就采用最新x86-64架构来贯穿各部分知识,在内存技术、网络技术上也有一系列更新,并且重组了之前的一些比较难懂的内容。我相信,该书的出版,将有助于国内计算机系统教学的进一步改进,为培养从事系统级创新的计算机人才奠定很好的基础。
  中文版序二
  上海交通大学软件学院院长
  2002年8月本书第1版首次印刷。一个月之后,我在复旦大学软件学院开设了“计算机系统基础”课程,成为国内第一个采用这本教材授课的老师。这本教材有四个特点。第一,涉及面广,覆盖了二进制、汇编、组成、体系结构、操作系统、网络与并发程序设计等计算机系统最重要的方面。第二,具有相当的深度,本书从程序出发逐步深入到系统领域的重要问题,而非点到为止,学完本书后读者可以很好地理解计算机系统的工作原理。第三,它是面向低年级学生的教材,在过去的教学体系中这本书所涉及的很多内容只能在高年级讲授,而本书通过合理的安排将计算机系统领域最核心的内容巧妙地展现给学生(例如,不需要掌握逻辑设计与硬件描述语言的完整知识,就可以体验处理器设计)。第四,本书配备了非常实用、有趣的实验。例如,模仿硬件仅用位操作完成复杂的运算,模仿tracker和hacker去破解密码以及攻击自身的程序,设计处理器,实现简单但功能强大的Shell和Proxy等。这些实验既强化了学生对书本知识的理解,也进一步激发了学生探究计算机系统的热情。
  以低年级开设“深入理解计算机系统”课程为基础,我先后在复旦大学和上海交通大学软件学院主导了激进的教学改革。必修课时被大量压缩,现在软件工程专业必修课由问题求解、计算机系统基础、应用开发基础、软件工程四个模块9门课构成。其他传统的必修课如操作系统、编译原理、数字逻辑等都成为方向课。课程体系的变化,减少了学生修读课程的总数和总课时,因而为大幅度增加实验总量、提高实验难度和强度、增强实验的综合性和创新性提供了有力保障。现在我的课题组的青年教师全部是首批经历此项教学改革的学生。本科的扎实基础为他们从事系统软件研究打下了良好基础,他们实现了亚洲学术界在操作系统旗舰会议SOSP上论文发表零的突破,目前研究成果在国际上具有较大的影响力。师资力量的补充,又为全面推进更加激进的教学改革创造了条件。
  基于该教材的北大“计算机系统导论”课程实施已有五年,得到了学生的广泛赞誉,学生们通过这门课程的学习建立了完整的计算机系统的知识体系和整体知识框架,养成了良好的编程习惯并获得了编写高性能、可移植和健壮的程序的能力,奠定了后续学习操作系统、编译、计算机体系结构等专业课程的基础。北大的教学实践表明,这是一本值得推荐采用的好教材。本书第3版采用最新x86-64架构来贯穿各部分知识。我相信,该书的出版将有助于国内计算机系统教学的进一步改进,为培养从事系统级创新的计算机人才奠定很好的基础。
  ―― 梅 宏 中国科学院院士/发展中国家科学院院士
  以低年级开设“深入理解计算机系统”课程为基础,我先后在复旦大学和上海交通大学软件学院主导了激进的教学改革……现在我课题组的青年教师全部是首批经历此教学改革的学生。本科的扎实基础为他们从事系统软件的研究打下了良好的基础……师资力量的补充又为推进更加激进的教学改革创造了条件。
  ―― 臧斌宇 上海交通大学软件学院院长
  版权页:
  插图:
系列图书推荐 ¥79.00¥55.30
同类热销商品¥35.00¥24.50
订单处理配送
北京奥维博世图书发行有限公司 china-pub,All Rights Reserved}

我要回帖

更多关于 spi读写寄存器 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信