计算机系统基础错题本

数据的机器级表示与处理

对于一个补码表示n位的数,其模为2^(n);

如果一个int转换为double类型,其位数不超过24位,则不会发生有效位丢失,再转换为int也不会发生错误;对于浮点数转换为int之后小数部分被舍弃,再转换回去会发现与之前的值不同;float转换为double也不会丢失精度。

一个地址存储一个字节。

溢出标志与只与alu运算单元有关。

两个单精度浮点数运算,只要阶码之差的绝对值大于等于25位就无需后续处理。

程序的转换及机器级表示

静态变量不能分配在栈帧中,因为如果放在栈帧中会随着过程调用消失,而静态变量要从头到尾存在于整个生命周期中。

非静态局部变量可以和全局变量同名,是因为它们被分配在不同存储区。

因为非静态变量被分配在栈中,所以其作用域仅在过程体内。

不同过程中的非静态局部变量可以同名,是因为它们被分配在不同的栈帧中。

b,w,l,q,分别对应1/2/4/8字节操作数。

 

标志寄存器

在8086中标志寄存器有16位,每一位都有专门的含义;

ZF标志

零标志位,记录相关指令执行后,结果是否为0。能改变其值的大多是运算指令,如:add,sub,mul,div,inc,or,and等,传送指令无法设置ZF。

PF标志

奇偶标志位,记录相关指令执行后,其结果的所有bit位中1的个数是否为偶数。若1的个数为偶数,PF = 1,否则为0。

SF标志

符号标志位,记录相关指令执行后,结果是否为负。若结果为负,SF = 1,否则为0。

CF标志

进位标志位,在进行无符号运算时,它记录了运算结果的最高有效位向更高有效位的进位值,或从更高位的借位值。

OF标志

溢出标志位,记录了补码运算的结果是否发生了溢出,如果溢出OF = 1,否则为0.

我们要注意一件事,在讨论OF或CF时,请简单考虑各自的场景,不要混淆!比如在判断OF时,FF + FF这种运算在无符号运算看来 已经超出了最大位数了(假设在8位下相加),所以 CF = 1;而在有符号运算看来 -1 + -1 = -2 并没有发生溢出,所以 OF = 0

再看个例子,50H + 60H无符号数运算看来 并没有超过最大位数,所以 CF = 0;而在有符号运算看来 两个正数相加变成了负数,发生了溢出,所以 OF = 1

简而言之,溢出标志位只需要考虑 两个数相加后,逻辑上是否符合正常思想(就是正数+正数=正数;负数+负数=负数的正常逻辑),如果违反了(比如正数+正数=负数,负数+负数=正数),那么就一定会产生溢出了,那么有同学可能就会问了 负数+正数 的情况呢?请问,一个固定位数的寄存器里面,最大的负数能有多少?更何况是加上一个正数呢!所以负数+正数,这辈子都不可能产生溢出!

adc

ax = ax + bx +CF

sbb

ax = ax - bx -CF

cmp

cmp的本质就是做一个减法(此减法没有副作用),然后改变标志位。由于有符号数和无符号数的减法产生的结果各不相同(因为有符号数会产生溢出),所以cmp指令也分无符号数有符号数

程序的链接

可重定位和可执行两种目标文件中的数据都是二进制表示的补码形式。(×)(查阅资料没有结果只能背下来了)

ELF头以一个十六字节的序列开始,描述了生成该文件的系统的字的大小和字节顺序。剩下的部分包括ELF头的大小、目标文件的类型、机器类型、节头部表的文件偏移,以及节头部表中条目的大小和数量

节头部表描述不同节的位置和大小,其中目标文件的每个节都有一个固定大小的条目。

程序头部表描述了可执行文件连续的片连续的内存段的映射。在程序头部表,可执行目标文件的内容初始化两个内存段,第一个段有读/执行访问权限,包括:ELF头、程序头部表、.init、.text、.rodata节,第二个段有读/写访问权限。

局部符号指的是仅由该模块定义和引用的本地符号,如带static的C函数和全局变量。链接器局部符号不是指程序中的局部变量(分配在栈中的临时变量),链接器不关心这种局部变量。

牢记小端方式存储(被MIPS毒害的小孩)

重定位的最后一步是对引用处的地址进行重定位,重定位的方式有多种。

重定位信息在汇编阶段生成,只有在汇编阶段生成机器指令时才知道需要进行重定位的位置,因为这些需要重定位的位置在机器指令中。

可执行目标文件的加载通过execve()函数调用的加载器完成。

加载器通过可执行目标文件中的程序托镖对可装入段进行加载。

任何可执行目标文件中的可装入段被映射到一个统一的虚拟地址空间。

启动并加载可执行目标文件的正确步骤:

  1. 读入命令(可执行文件名)及参数;
  2. 构造argv和envp;
  3. 调用fork()系统调用函数;
  4. 调用execve()系统调用函数

程序的执行

某个寄存器对于汇编语言程序员来说是透明的,是指汇编程序员在使用汇编指令编写程序时,无法感知这个寄存器的存在。汇编程序员无需知道MAR、MDR和IR是否存在,更无需了解这些寄存器跟程序是什么关系。但是程序员知道如何改变PC的内容。

数据通路就是指令执行过程中数据流动所经过的路径及其路径上的部件,这些部件或者是组合逻辑元件或者是时序逻辑元件,前者称为操作元件,后者称为状态元件。数据通路中一个重要的操作元件为ALU,用于执行各类算术和逻辑运算;另一个重要的元件为通用寄存器,属于状态元件。

层次结构存储系统

需要定时刷新的半导体存储芯片是DRAM。

系统的主存由RAM和ROM组成。

DDR3 SDRAM芯片内部I/O缓冲采用八位预取技术,存储器总线每个时钟传送两次数据。

正常编址看片选位在前,交叉编址片选信号由最低位确定。

相联存储器按内容指定方式进行寻址。

多模块存储器之所以能进行高速的读/写,是因为各模块有独立的读写电路。

读取时间 = 平均磁盘旋转等待时间(磁盘转一圈所用时间 / 2)+ 读出数据的时间 + 寻道时间

cache tag = 主存地址 - cache行号 - 块内地址偏移

cache一次缺失需要从主存读出一个主存块,所以看需要进行几次总线传输即可。

不是所有进程都可以访问页表。

看图,记住!

I/O操作的实现

键盘和鼠标都是字符型输入设备;

键盘和鼠标都以串行方式和主机通信;

键盘和鼠标都采用中断方式进行数据传送;

键盘和鼠标向主机传送的都是位置信息;

中断请求信号使控制接口通过中断控制器发送给CPU的。

统一编址方式中,I/O端口地址和主存单元地址统一编址。它们各自分配在不同的地址范围内,因此,I/O端口地址和主存单元地址一定不重号。

中断向量地址是指中断服务程序入口地址的地址。

保护断点由硬件完成。

DMA和CPU都要使用主线时,CPU的优先级不是更高的。

中断服务程序需要完成CPU于I/O接口之间的数据交换,因而要能够通过发送控制命令字来启动外设。

常用I/O控制方式

目前计算机中常用的I/O方式有程序直接控制、中断控制和DMA控制三种。

程序直接控制

程序直接控制方式分为无条件传送和条件传送方式。无条件传送方式利用定时传送数据,无需检测接口或设备的状态,适合于各类巡回检测或过程控制;条件传送方式也称为程序查询方式,CPU通过查询外设接口中的状态来控制数据的传送,有定时查询和独占查询两种,独占查询方式下,CPU在整个数据交换过程中,一直为设备的I/O服务。

中断控制方式

中断控制方式也是一种通过执行程序来进行数据交换的I/O方式。当外设准备好数据、准备好接收新数据、发生了特殊事件时,外设通过向CPU发送中断请求来使CPU转到相应的中断服务程序去执行,在中断服务程序中完成数据交换或处理特殊事件。中断方式下,由硬件和软件共同完成中断过程。首先,由I/O接口向CPU发中断请求,CPU每执行完一条指令都去采样中断请求线,一旦发现有中断请求,并处于开中断状态,CPU就进入中断响应周期,自动执行一条隐指令,完成关中断、保护断点、识别中断源三项任务,识别中断源的结果就是将中断服务程序的首地址送到PC中。中断响应周期结束,CPU就根据PC的值开始执行中断服务程序。在单极中断系统中,中断服务程序一直不会开中断,直到中断返回前才执行开中断指令;而在多级中断系统中,中断处理过程中可能被其他新中断打断。通过在每个中断服务程序中设置中断屏蔽字来实现是否允许打断。中断服务程序还要进行现场的保护和恢复。

DMA控制方式

DMA控制方式适合像磁盘一类的告诉设备以成批方式和主存直接交换数据。首先,要对DMA控制器进行初始化;其次,由DMA控制器控制总线在主存和高速设备之间进行直接数据交换;最后,DMA控制器发出DMA传送结束信号给外设接口,由外设接口发中断请求给CPU,由CPU执行响应的中断服务程序来进行数据校验等,最后完成DMA传送处理。

周期挪用

周期挪用法的基本思想是,当外设准备好一个数据时,DMA控制器就向CPU申请一次总线控制权,CPU在一个总线事务结束时,一旦发现有DMA请求,就立刻释放总线,让出一个周期给DMA控制器,由DMA控制器控制总线在主存和外设之间传送一个数据,传送结束后立即释放总线,下次外设准备好数据时,又重复上述过程,直到所有数据传送完毕。这种情况下,CPU的工作几乎不受影响,只是在万一出现访存冲突时,CPU挪出一个周期给DMA,由DMA访问主存,而CPU延迟访问主存。这里CPU挪出的是主存的存储周期。

异常控制流

这一章的错题还是很迷惑,让两位大学生都非常的迷惑,因此只记录答案的结论,是否正确有待商议。

错误命题:

机器代码及其数据被映射到统一的虚拟地址空间即形成一个进程。

用户空间的静态区由代码段和数据段组成,数据段由读写数据和只读数据组成。

加载器会把可执行目标文件从磁盘读到内存中,然后从第一条指令开始执行。

进程上下文切换和异常/中断响应处理都通过执行内核程序实现。

使用一个统一的查询程序按响应优先级查询异常和中断,并转到具体处理程序执行。

正确结论:

同一个程序如果处理不同的数据集就会对应很多不同的进程。

进程上下文切换后,CPU执行的是另一个进程的代码。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值