2.2
1、下列几种存储器中,( A )是易失性存储器。
A. cache
B. EPROM
C. Flash Memory
D. CD-ROM
2、下面有关半导体存储器组织的叙述中,错误的是( D )。
A. 存储器的核心部分是存储阵列,由若干存储单元构成
B. 每个存储单元有一个编号,就是存储单元的地址
C. 存储单元由若干个存放0或1的记忆单元(cell)构成
D. 同一个存储器中,每个存储单元的宽度可以不同
解析: D、现代计算机的主存储器由半导体存储器构成,其中存放信息的地方称为存储阵列;每个存储阵列包含若干个存储单元,每个存储单元由若干个记忆单元(cell)构成,每个记忆单元存放一位信息(0或1)。
某一台计算机的主存储器编址方式,总是由其对应的指令集体系结构(ISA)确定的;现代通用计算机大多采用按字节编址方式,即主存储器中每个字节有一个地址,也即每个存储单元的宽度都是8位。
3、若某个内存条容量为1GB,则说明该内存条中可存储( B )个字节。
A. 10^9
B. 2^30
C. 2^9
D. 10^30
4、某32位计算机,主存地址为32位,按字节编址,则该计算机的主存地址范围是( A )。
A. 0~(4G-1)
B. 1~32G
C. 1~4G
D. 0~(32G-1)
解析: A、因为主存地址为32位,所以主存地址空间占2^32=4G个存储单元;因为按字节编址,因此,主存最大可存储的信息量为4GB=32Gbits。主存储器总是从0开始编号,因此存储单元的地址为0、1、2、……、2^32-1=4G-1。这里,4G-1=2^32-1=1 0000 0000 0000 0000 0000 0000 0000 0000 -1 = 1111 1111 1111 1111 1111 1111 1111 1111 = FFFF FFFFH。
5、假定主存地址空间大小为1024MB,按字节编址,每次读写操作最多可以一次存取32位。不考虑其它因素,则存储器地址寄存器MAR和存储器数据寄存器MDR的位数至少应分别为( B )
A. 28,8
B. 30,32
C. 28,32
D. 30,8
解析: B、因为1024M=2^30,所以MAR至少为30位。
6、采用行、列地址引脚复用的半导体存储器芯片是( D )。
A. SRAM
B. Flash Memory
C. EPROM
D. DRAM
7、下面有关ROM和RAM的叙述中,错误的是( A )。
A. 计算机系统的主存都用DRAM芯片实现
B. RAM是可读可写存储器,ROM是只读存储器
C. ROM和RAM都采用随机访问方式进行读写
D. 计算机系统的主存由RAM和ROM组成
8、下面有关半导体存储器的叙述中,错误的是( D )。
A. DRAM是半导体动态随机访问存储器,可用作主存
B. SRAM是半导体静态随机访问存储器,可用作cache
C. ROM芯片属于半导体随机存储器芯片
D. 半导体存储器都采用随机存取方式进行读写
解析: D、有些情况下,可用半导体存储器实现相联存储器,即按内容进行访问,而不是按地址进行随机读写。
9、存储容量为16K×4位的DRAM芯片,其地址引脚和数据引脚数各是( D )。
A. 7和1
B. 14和4
C. 14和1
D. 7和4
解析: D、因为DRAM芯片存储容量为16K×4位,故该芯片共有16K=2^14个存储单元,应该有14位地址,行、列地址引脚复用后,芯片的地址引脚数为7。每个存储单元占4位,因此芯片的数据引脚数为4。
10、假定用若干个16K×8位的存储器芯片组成一个64K×8位的存储器,芯片各单元交叉编址,则地址BFFFH所在的芯片的最小地址为( A )。
A. 0003H
B. 0002H
C. 0001H
D. 0000H
解析: A、用若干个16K×8位的存储器芯片构成64K×8位的存储器,需要64K×8位/(16K×8位)= 4个芯片。因为采用交叉编址方式,所以,存储单元地址对4取模后,低两位相同的存储单元在同一个芯片中。BFFFH的最低两位为11,显然,与0003H在同一个芯片中。
2.3
1、以下有关磁盘存储器信息存储原理的叙述中,错误的是( B )。
A. 磁盘片的两个面都可存储信息
B. 共有三种不同的磁化状态
C. 信息在磁盘表面以磁化状态形式存储
D. 每个磁化状态对应一位二进制信息
2、以下有关磁盘存储器结构的叙述中,错误的是( A )。
A. 磁盘驱动器的位置介于CPU和磁盘控制器之间
B. 磁盘操作包括寻道、旋转等待和读写三个步骤
C. 由存储介质、磁盘控制器和磁盘驱动器组成
D. 磁盘的信息存储介质就是磁盘盘面
3、以下有关硬磁盘的磁道和扇区的叙述中,错误的是( C )。
A. 每面有一个磁头,寻道过程中所有磁头同时移动
B. 磁头和磁盘做相对运动而形成的轨迹即为磁道
C. 一个磁道由若干扇区构成且磁盘各磁道信息位数总相同
D. 不同盘面上同一位置的多个磁道构成一个柱面
解析: C、早期的低密度磁盘中每个磁道信息位数总是一样,但是,现在的磁盘,其外道信息量比内道大
4、以下有关磁盘驱动器的叙述中,错误的是( C )。
A. 能对指定盘面的指定扇区进行数据的读或写操作
B. 能控制磁盘片转过指定的扇区,并发回“扇区符合”信号
C. 送到磁盘驱动器的盘地址由磁头号、盘面号和扇区号组成
D. 能控制磁头移动到指定磁道,并发回“寻道结束”信号
解析: C、因为每个盘面有一个磁头,所以磁头号就是盘面号。盘地址由柱面号(即磁道号)、盘面号(即磁头号)和扇区号组成。
5、假定一个磁盘存储器有10个记录面,用于记录信息的柱面数为5000,每个磁道上记录信息位数相同,磁盘片外径200mm,内径40mm,最内道位密度为200bpm(位/毫米),则该磁盘存储器的容量约为( D )。
A. 0.628GB
B. 17.7GB
C. 4.425GB
D. 0.157GB
解析: D、(10×5000×3.14×40×200)/8 B = 0.157GB。
6、假定一个磁盘存储器有4个盘片,用于记录信息的柱面数为2000,每个磁道上有3000个扇区,每个扇区512B,则该磁盘存储器的容量约为( A )。
A. 24GB
B. 12GB
- 24MB
- 12MB
解析: A、2×4×2000×3000×0.5KB≈24GB。
7、假定一个磁盘的转速为7200RPM,磁盘的平均寻道时间为10ms,内部数据传输率为1MB/s,不考虑排队等待时间。那么读一个512字节扇区的平均时间大约为 ( B )。
A. 14.17 ms
B. 14.67 ms
C. 18.33 ms
D. 18.83 ms
解析: B、10ms + (1/7200×60×1000)/2 + 0.5KB/1MB×1000≈14.67。
8、假定一个磁盘的转速为10000RPM,平均寻道时间为5.5ms,内部数据传输率为4MB/s,磁盘控制器开销为1ms,不考虑排队等待时间。那么读一个4KB扇区的平均时间大约为 ( A )。
A. 10.5 ms
B. 12.5 ms
C. 11.5ms
D. 13.5 ms
解析: A、1ms +5.5ms+ (1/10000×60×1000)/2 + 4KB/4MB×1000 = 10.5ms。
9、以下有关磁盘存储器读写操作的叙述中,错误的是( C )。
A. 采用直接存储器存取(DMA)方式进行输入/输出
B. 最小读写单位可以是一个扇区
C. 磁盘存储器可与CPU交换盘面上的存储信息
D. 按批处理方式进行一个数据块的读写
解析: C、磁盘存储器以成批方式进行数据读写,CPU中没有那么多通用寄存器用于存放交换的数据,所以,磁盘存储器通常直接和主存交换信息
10、磁盘存储器进行读写操作之前,CPU需要对磁盘控制器或DMA控制器进行初始化。以下选项中,不包含在初始化信息中的是( D )。
A. 传送方向(即读磁盘还是写磁盘?)
B. 传送信息所在的通用寄存器编号
C. 传送信息所在的主存起始地址
D. 传送数据个数或传送字节数
2.4
1、在存储器分层体系结构中,存储器速度从最快到最慢的排列顺序是(C)。
A.寄存器-主存-cache-辅存
B.寄存器-主存-辅存-cache
C.寄存器-cache-主存-辅存
D.寄存器-cache-辅存-主存
2、在存储器分层体系结构中,存储器从容量最大到最小的排列顺序是(B)。
A.辅存-主存-寄存器-cache
B.辅存-主存-cache-寄存器
C.主存-辅存-cache-寄存器
D.辅存-cache-主存-寄存器
3、在主存和CPU之间增加cache的目的是(B)。
A.提高内存可靠性
B.加快信息访问速度
C.增加内存容量,同时加快访问速度
D.增加内存容量
4、以下哪一种情况能很好地发挥cache的作用?(A)
A.程序具有较好的访问局部性
B.程序的大小不超过实际的内存容量
C.程序中含有较多的I/O操作
D.程序的指令间相关度不高
5、假定主存按字节编址,cache共有64行,采用直接映射方式,主存块大小为32字节,所有编号都从0开始。问主存第2593号单元所在主存块对应的cache行号是(A)。
A .17
B .34
C. 81
D .1
解析: A、因为按字节编址,主存块大小为32字节,所以块内地址占5位。采用直接映射方式,共64行,故行号占6位。因为2593=2048+512+32+1=0…01 010001 00001B,根据主存地址划分的结果,可以看出2593单元所在主存块对应的cache行号为010001B=17。
6、假定主存按字节编址,cache共有64行,采用4路组相联映射方式,主存块大小为32字节,所有编号都从0开始。问主存第2593号单元所在主存块对应的cache组号是(C)。
(1分)
A. 81
B. 17
C .1
D. 34
解析: C、因为按字节编址,主存块大小为32字节,所以块内地址占5位。采用4路组相联映射方式,共64行,分64/4=16组,故组号占4位。因为2593=2048+512+32+1=0…0101 0001 00001B,根据主存地址划分的结果,可以看出2593单元所在主存块对应的cache组号为0001B=1。
7、假定主存地址空间为256MB,按字节编址, cache共有64行,采用8路组相联映射方式,主存块大小为64B,则cache容量至少为(C)字节。
A. 4248
B. 4216
C. 4256
D. 4224
解析: C、因为按字节编址,256M=2^28,故主存地址位数为28位。采用8路组相联,共64行,分64/8=8组,故组号占3位。主存块大小为64B,块内地址占6位。因此,标志位占28-3-6=19位。Cache总容量为64×(1+19+64×8)位=4256字节。
8、假定CPU通过存储器总线读取数据的过程为:发送地址和读命令需1个时钟周期,存储器准备一个数据需8个时钟周期,总线上每传送1个数据需1个时钟周期。若主存和cache之间交换的主存块大小为64B,存取宽度和总线宽度都为4B,则cache的一次缺失损失至少为多少个时钟周期?(C)
A. 64
B .80
C .160
D. 72
9、假定用作cache的SRAM的存取时间为2ns,用作主存的SDRAM存储器的存取时间为40ns。为使平均存取时间达到3ns,则cache命中率应为(B)左右。
A .85%
B. 97.5%
C. 99.9%
D. 92.5%
解析: B、1-(3-2)/40=97.5%。
10、若主存地址32位,按字节编址,块大小为32字节,cache共有2K行,则以下叙述中,错误的是(B)。
A.关联度为2时,标志位共计34K位
B.全相联时,标志位共计64K位
C.关联度为8时,标志位共计38K位
D.关联度为1时,标志位共计32K位
解析: B、全相联时,标志位共计2K×(32-5)=54K位。
2.5
1、以下关于cache替换算法的叙述中,错误的是(C)。
A.组相联和全相联映射都必须考虑如何进行替换
B. LRU算法需要对每个cache行记录替换信息,即LRU位
C.先进先出算法无需对每个cache行记录替换信息
D.直接映射方式是多对一映射,无需考虑替换问题
解析: C、先进先出算法需要对每个cache行打一个时间戳,记录何时装入了一个新的主存块。
2、单选
以下关于LRU替换算法的叙述中,错误的是(C)。
A. LRU是Least-Recently Used的缩写,表示最近最少用
B .基于cache行有多久没有被访问来进行替换
C.全相联映射方式特别适合采用LRU替换算法
D.是一种栈算法,其命中率随组的增大而提高
解析: C、LRU替换算法需要为每个cache行设置一个计数器,用于记录对应行的使用情况。计数器的位数与组的大小有关,例如,对于2-路组相联,每组有两个cache行,计数器为1位;对于4-路组相联,计数器为2位。对于全相联,则组的大小等于cache行数,因而计数器的位数等于cache行号的位数,这样,不仅计数器所占容量开销大,而且对计数器进行修改的时间开销也大。因而LRU算法不适合应用于全相联映射方式。
3、以下关于写策略的叙述中,错误的是(C)。
A. 多个带cache的CPU共享主存时会出现写策略问题
B. 写策略问题也是cache一致性问题
C. 只有在写命中时才需考虑写策略问题,在写不命中时无需考虑
D .对于写命中,有直写(Write Through)和回写(Write Back)两种写策略
解析: C、写命中指要写的单元已经在cache中,写不命中指要写的单元不在cache中。不管是写命中还是写不命中,都需要考虑写策略问题。在写命中时,可以采用直写(Write Through)或回写(Write Back)方式。前者在写cache的同时也写主存;后者仅写cache,在被替换出去时再将整个主存块写入主存。在写不命中时,可以采用写分配方式,把主存块装入cache,然后采用写命中时的直写或回写策略进行处理,也可以采用非写分配(Not Write Allocate)方式,直接写主存而不写cache。
4、以下关于直写(Write Through)策略的叙述中,错误的是(D)。
A. 每次写操作都会写cache中的内容和在主存中的副本
B. 在写不命中时,若采用非写分配(Not Write Allocate)方式,则只能用直写替换策略
C. 通常在cache和主存之间设置写缓冲,以加快写操作速度
D. 通常在cache行中加“dirty bit”,以标识对应行是否被修改过
解析: D、因为直写(Write Through)策略会同时写cache和主存,因此,总能保持cache和主存的一致性,无需用“dirty bit”来标识cache行是否被修改。而回写(Write Back)策略仅写cache,在被替换出去时,需要根据dirty bit是否为1,以了解cache行中的主存块是否被修改,若被修改,则说明发生了cache和主存的不一致,需要将整个主存块写入主存。
5、假定主存地址位数为32位,按字节编址,主存和cache之间采用直接映射方式,主存块大小为1个字,每字32位,写操作时采用直写(Write Throght)方式,则能存放32K字数据的cache的总容量至少应有(D)位。
A. 1600K
B. 1504K
C. 1568K
D. 1536K
解析: D、cache共有32K字/1字=32K行,故行号占15位;每个主存块为1字=32位=4B,故块内地址占2位。因此,标志占32-15-2=15位。直接映射方式无需考虑替换算法,故没有替换信息;直写方式无需修改位(dirty bit)。因而cache总容量为32K×(1+15+32)=1536K位。
6、假定主存地址位数为32位,按字节编址,主存和cache之间采用直接映射方式,主存块大小为1个字,每字32位,写操作时采用回写(Write Back)方式,则能存放32K字数据的cache的总容量至少应有(B)位。
A. 1536K
B. 1568K
C. 1504K
D. 1600K
解析: B、cache共有32K字/1字=32K行,故行号占15位;每个主存块为1字=32位=4B,故块内地址占2位。因此,标志占32-15-2=15位。直接映射方式无需考虑替换算法,故没有替换信息;回写(Write Back)方式需1位修改位(dirty bit)。因而cache总容量为32K×(1+15+1+32)=1568K位。
7、假定主存地址位数为32位,按字节编址,主存和cache之间采用全相联映射方式,主存块大小为4个字,每字32位,采用回写(Write Back)方式和随机替换策略,则能存放32K字数据的cache的总容量至少应有(A)位。
A. 1264K
B. 5024K
C. 1256K
D. 5056K
解析: A、cache共有32K字/4字=8K行,每个主存块为4字=4×32位=16B,故块内地址占4位。因此,全相联映射方式下,标志占32-4=28位。随机替换算法没有替换信息;回写(Write Back)方式需1位修改位(dirty bit)。因而cache总容量为8K×(1+28+1+4×32)=1264K位。
8、假定主存地址位数为32位,按字节编址,主存和cache之间采用4-路组相联映射方式,主存块大小为4个字,每字32位,采用直写(Write Throght)方式和LRU替换策略,则能存放32K字数据的cache的总容量至少应有(B)位。
A. 4736K
B. 1184K
C. 1168K
D. 4672K
解析: B、cache共有32K字/4字=8K行,因为采用4-路组相联,因而共有8K/4=2K组,组号占11位;每个主存块为4字=4×32位=16B,故块内地址占4位。因此,标志占32-11-4=17位。4路组相联方式下,LRU替换算法需要每行有2位LRU位;直写(Write Throght)方式无需修改位(dirty bit)。因而cache总容量为8K×(1+17+2+4×32)=1184K位。
9、以下关于cache大小、主存块大小和cache缺失率之间关系的叙述中,错误的是(D)。
A. cache容量越大,cache缺失率越低
B. 主存块大小和cache容量无密切关系
C. 主存块大小通常为几十到上百个字节
D. 主存块越大,cache缺失率越低
解析: D、主存块太小,则不能很好地利用空间局部性,从而导致缺失率变高,但是,主存块太大,也会使得cache行数变少,即cache中可以存放主存块的位置变少,从而降低命中率。因此,主存块不可以太小,也不可以太大,通常为几十到上百个字节。
10、单选
某32位机按字节编址。数据cache有16行,主存块大小为64B,采用2-路组相联映射。对于以下程序A,假定编译时i, j, sum均分配在寄存器中,数组a按行优先方式存放,其首址为3200,则a[1][0]所映射的cache组号、程序A的数据cache命中率各是( B )、( )。
short a[256][256];
……
short sum_array() {
int i, j;
short sum=0;
for (i=0; i < 256; i++)
for (j=0; j < 256; j++)
sum+=a[i][j];
return sum;
}
A. 4, 15/16
B. 2, 31/32
C. 4. 31/32
D. 2, 15/16
解析: B、a[1][0]所映射的cache组号为[(3200+(1×256+0)×2)/64] mod (16/2) = 2。
程序A的数据cache命中率分析如下:a[0][0]位于主存第3200/64=50块的起始处,按照数组访问顺序a[0][0]、a[0][1]、……、a[0][255]、a[1][0]、a[1][1]、……、a[1][255]、……,总是每64B/2B=32个数组元素组成一个主存块,被轮流装入数据cache的第2、3、……、7、0、1、…….、7、0、……. 组内的cache行中,因而这每一块的32个数组元素中,总是第一次不命中,以后每次都命中,因而命中率为31/32。
2.6
1、以下有关早期分页存储管理(自动执行Overlay)方式的叙述中,错误的是(A)。
A.程序员编写程序时应将逻辑地址转换为主存物理地址
B.分页方式可以使程序员编写程序时无需考虑主存容量
C.分页方式主要解决程序文件比主存空间大的问题
D.程序员编写程序所用的地址空间称为逻辑地址空间
解析: A、早期的分页存储管理方式主要解决“程序很大而存放程序的主存很小”的问题。程序员在一个逻辑地址空间中编写程序,不用管主存有多大;运行程序时,由专门的分页管理程序,将程序中的逻辑地址转换为主存的物理地址,并实现程序块在主存的换入和换出操作。因此,地址转换的工作由管理程序自动完成,而不是由编写程序的程序员完成。
- 以下有关分页虚拟存储管理方式的叙述中,错误的是(B)。
A. 每个进程所占的地址空间称为虚拟地址空间,被划分成若干页面
B. 程序执行时,必须把程序所包含的所有代码和数据都装入主存中
C. 每条指令执行过程中,都需要把指令或数据的虚拟地址转换为物理地址
D. 主存地址空间称为物理(实)地址空间,被划分成大小相等的页框
解析: B、分页虚拟存储管理方式下,每个进程都有一个统一的虚拟地址空间,被划分成大小相等的页面,主存空间被划分成大小相等的页框,程序执行时,主要把正在执行的页面装入主存的页框中,其他还没有执行到的页面可以存放在磁盘中,这样,可以在较小的主存中运行大程序。因此,无需把所有代码和数据都装入主存才能运行程序。
- 以下是有关现代虚拟存储管理机制中地址转换的叙述,其中错误的是(A)。
A. 整个过程主要由操作系统实现
B. 地址转换过程中能发现是否缺页
C. 地址转换过程中要访问页表项
D. 缺页时将转相应异常处理程序执行
解析: A、虚拟存储管理机制中,地址转换是在指令执行过程中进行的,指令的执行由硬件实现,因而地址转换也由硬件完成,而不是由操作系统软件完成。操作系统生成并修改页表,而由硬件在地址转换过程中查询页表来进行地址转换,并检测是否发生缺页,在发生缺页时,硬件会发出“Page Fault”异常,从而调出相应的异常处理程序进行缺页处理。
- 下列命中组合情况中,一次访存过程中不可能发生的是(B)。
A. TLB命中、cache未命中、Page命中
B. TLB未命中、cache命中、Page未命中
C. TLB未命中、cache命中、Page命中
D. TLB未命中、cache未命中、Page命中
解析: B、Page未命中,说明相应信息不在主存,cache中信息是主存信息的副本,因而相应信息肯定不在cache,也就不会cache命中。
- 以下是有关虚拟存储管理机制中页表的叙述,其中错误的是(C)。
A. 页表中每个表项与一个虚页对应
B. 系统中每个进程有一个页表
C. 一个页表中的表项可以被所有进程访问
D. 每个页表项中都包含装入位(有效位)
解析: C、页表中的每个表项反映的是对应虚拟页面的位置和使用等信息,只能由操作系统和硬件进行访问,不能被任何用户进程访问。
- 以下是有关缺页处理的叙述,其中错误的是(C)。
A. 缺页处理过程中需根据页表中给出的磁盘地址去读磁盘数据
B. 若对应页表项中的有效位(或存在位)为0,则发生缺页
C. 缺页是一种外部中断,需要调用操作系统提供的中断服务程序来处理
D. 缺页处理完后要重新执行发生缺页的指令
解析: C、外部中断是指CPU以外的中断请求事件,而缺页是由CPU在执行指令过程中进行地址转换时发现的在CPU内部操作时检测到的异常事件,相应的处理工作由操作系统提供的缺页异常处理程序来完成。
- 以下是有关分页式存储管理的叙述,其中错误的是(B)。
A. 当从磁盘装入的信息不足一页时会产生页内碎片
B. 相对于段式存储管理,分页式更利于存储保护
C. 采用回写(Write Back)写策略,每页对应一个修改位(Dirty Bit)
D. 采用全相联映射,每个页可以映射到任何一个空闲的页框中
解析: B、因为分页方式将地址空间划分成大小相等的页面,因而可能有些页面中的有效信息一部分是代码一部分是数据,或者有效信息不足一页,前者不利于存储保护,后者容易造成页内碎片。而分段方式按代码和数据的不同类信息分段管理,显然易于存储保护。
分页方式采用全相联映射方式和Write Back写策略,只要主存中有空闲页框就可以存放任何一个页面,在每次写主存时,都不会同时写磁盘,只有当某一页从主存中替换到磁盘时才可能写磁盘。
- 以下有关快表(TLB)的叙述中,错误的是(D)。
A. 快表中存放的是当前进程的常用页表项
B. 快表是一种高速缓存,一定在CPU中
C. 引入快表的目的是为了加快地址转换速度
D. 在快表中命中时,在L1 cache中一定命中
解析: D、在快表中命中,是指当前正在进行地址转换的存储单元所在页面对应的页表项在TLB中,因此,可以直接从TLB中取到物理页框号,而立即生成对应的物理地址。不过,这个物理地址所在的主存块不一定在L1 cache中。
- 以下是有关段式存储管理的叙述,其中错误的是(C)。
A. 段是逻辑结构上相对独立的程序和数据模块,因此段是可变长的
B. 按程序中实际的段来分配主存,所以分配后的存储块是可变长的
C. 段表项中无需有效位(或存在位),因为每个段都在主存中
D. 每个段表项中必须记录对应段在主存的起始位置和段的长度
- 以下给出的事件中, 无需通过异常处理程序进行处理的是(A)。
A. cache缺失
B. 地址越界
C. 段不存在
D. 缺页故障
解析: A、cache缺失由硬件处理,无需调出操作系统中的异常处理程序来处理。
2.7
1、对于IA-32中的指令“movl 8(%edx, %esi, 4), %edx”,若R[edx]=0000 01B6H,R[esi]=0000 0008H,其源操作数的有效地址EA是( B )。
A. 0000 06E8H
B. 0000 01DEH
C. 0000 01F0H
D. 0000 01B6H
解析:B、源操作数的有效地址为
R[edx]+R[esi]*4+8=0000 01B6H+0000 0008H*4+8=0000 01DEH。
2、以下是有关IA-32段页式虚拟存储管理方式的叙述,其中错误的是( A )。
A. 32位线性地址构成的地址空间就是4GB主存地址空间
B. 逻辑地址由16位段选择符和32位段内偏移量组成
C. 进程的虚拟地址有48位逻辑地址和32位线性地址两种形式
D. 指令中隐含给出的32位有效地址就是32位段内偏移量
解析: A、32位线性地址空间是4GB的虚拟地址空间,也就是可执行目标程序(即进程)所在的虚拟地址空间,需要对其进一步进行分页存储管理,访问指令和数据时,应根据页面和页框之间的映射关系进行线性地址到物理地址的转换
3、以下是有关IA-32保护模式下地址转换过程的叙述,其中错误的是( D )。
A. 顺序为逻辑地址→线性地址→物理地址
B. 32位物理地址就是指32位主存地址
C. 地址转换前先计算出32位有效地址
D. 采用先分页、再分段的地址转换过程
解析: D、地址转换顺序是先通过分段方式将48位逻辑地址转换为32位线性地址,然后再通过分页方式将32位线性地址转换为32位物理地址。
4、以下有关IA-32段选择符的叙述中,错误的是( A )。
A. 程序的代码段和数据段共用同一个段选择符
B. CS寄存器中RPL字段表示当前特权级CPL
C. 段选择符存放在一个16位段寄存器中
D. 段选择符中的高13位为对应段表项的索引
解析: A、IA-32中提供了多个段寄存器,如代码段寄存器CS、数据段寄存器DS、堆栈段寄存器SS等,它们可以分别存放代码段、数据段和堆栈段的段选择符。
5、以下有关IA-32段描述符和段描述符表的叙述中,错误的是( A )。
A. 段基址低12位总是0,因此段描述符中的段基址字段占20位
B. 段描述符表就是段表,段描述符就是其中的段表项
C. 段描述符分普通段描述符和系统控制段描述符两类
D. 段描述符表分GDT(全局)、LDT(局部)和IDT(中断)三类
解析: A、段描述符中的段基址字段B31~B0占32位,而段限界字段L19~L0占20位。
以下是有关IA-32中逻辑地址向线性地址转换的叙述,其中错误的是( C )。
A. 从对应段描述符中取出段基址与段内偏移量相加可得到线性地址
B. GTD和LDT在内存的起始地址分别存放在CPU内不同的地方
C. 每次逻辑地址向线性地址转换都要访问内存中的GDT或LDT
D. 系统启动时操作系统先对GDT和LDT进行初始化
解析: C、为了加快IA-32的地址转换过程,CPU中专门设置了段描述符cache,对应每个段寄存器(CS、DS、SS、ES、FS和GS)都有相应的描述符cache。每次段寄存器装入新的段选择符时,就会将对应的段描述符装入描述符cache中,在逻辑地址到线性地址转换时,MMU直接用描述符cache中的信息,不必访问内存中的GDT和LDT。
7、以下是有关IA-32/Linux系统分段机制的叙述,其中错误的是( A )。
A. 内核段描述符在GDT中,而用户段描述符在LDT中
B. 段描述符中段存在位P为1,故不以段为单位分配内存
C. 将内核代码段和内核数据段的段基址都设为0
D. 将用户代码段和用户数据段的段基址都设为0
解析: A、Linux系统中,将内核代码段、内核数据段、用户代码段和用户数据段对应的段描述符都包含在全局描述符表GDT中,分别位于GDT的第12、13、14和15项。
8、已知变量y和数组a都是int型,a的首地址为0x8049b00。假设编译器将a的首地址分配在ECX中,数组的下标变量i分配在EDX中,y分配在EAX中,C语言赋值语句“y=a[i];”被编译为指令“movl (%ecx, %edx, 4), %eax”。在IA-32/Linux环境下执行该指令,则当i=150时,得到的存储器操作数的线性地址是( A )。
A. 0x8049d58
B. 0x8049b00
C. 0x8049b9a
D. 0x804a100
解析: A、Linux中将所有段的段基址都初始化为0,因而存储器操作数a[150]的线性地址=段基址+有效地址=0+R[ecx]+R[edx]*4=0x8049b00+150*4=0x8049b00+600=0x8049b00+0x258=0x8049d58。
9、以下是有关IA-32中线性地址向物理地址转换过程的叙述,其中错误的是( A )。
A. 每次地址转换都需要先访问页目录表,然后访问页表,根据页表项得到物理地址
B. 页目录表中的页目录项和页表中的页表项都占32位,且两者的结构完全相同
C. 32位线性地址分成10位页目录索引、10位页表索引和12位页内偏移量三个字段
D. 4GB线性地址空间被划分成1M个页面,每个页面大小为4KB
解析: A、IA-32中有TLB,因此,每次线性地址向物理地址转换时,总是先访问TLB,当TLB命中时,就无需访问主存中的页目录表和页表。
10、以下是有关IA-32存储管理控制寄存器的叙述,其中错误的是( B )。
A. CR3控制寄存器用于存放页目录表在主存的起始地址
B. 用户进程和操作系统内核都可以访问存储管理控制寄存器
C. CR2控制寄存器用于存放发生页故障(Page Fault)的线性地址
D. 若要启用分页机制,则CR0控制寄存器中的PE和PG都要置1
解析: B、IA-32中提供的存储管理控制寄存器用于操作系统内核进行存储管理,访问这些控制寄存器的相关指令都是特权指令,只能在内核态使用,而用户进程中不能使用这些特权指令,因而用户进程不能访问这些控制寄存器。
1-10
1.以下是有关使用GCC生成C语言程序的可执行文件的叙述,其中错误的是( D )。
A.第三步汇编,将汇编语言代码汇编转换为机器指令表示的机器语言代码
B.第四步链接,将多个模块的机器语言代码链接生成可执行目标程序文件
C.第一步预处理,对#include、#define、#ifdef等预处理命令进行处理
D.第二步编译,将预处理结果编译转换为二进制形式的汇编语言程序代码代码
2.以下是有关使用GCC生成C语言程序的可执行文件的叙述,其中错误的是( B )。
A.每个C语言源程序文件生成一个对应的可重定位目标文件
B.只要在链接命令中指定所有的相关可重定位目标文件就能生成可执行文件
C.预处理的结果还是一个C语言源程序文件,属于可读的文本文件
D.经过预处理、编译和汇编处理的结果是一个可重定位目标文件
3.以下是有关链接所带来的好处和不足的叙述,错误的是( B )。
A.使得公共函数库可以为所有程序共享使用,有利于代码重用和提高效率
B.使得所生成的可执行目标代码中包含了更多公共库函数代码,所占空间大
C.使得程序员可以分模块开发程序,有利于提高大规模程序的开发效率
D.使得程序员仅需重新编译修改过的源程序模块,从而节省程序开发时间
4以下关于ELF目标文件格式的叙述中,错误的是( C )。
A.可重定位和可执行两种目标文件中的代码都是二进制表示的指令形式
B.可执行目标文件是ELF格式的执行视图,由不同的段组成
C.可重定位和可执行两种目标文件中的数据都是二进制表示的补码形式
D.可重定位目标文件是ELF格式的链接视图,由不同的节组成
5以下关于链接器基本功能的叙述中,错误的是( B )。
A.将每个.o文件中的.data节、.text节和.bss节合并
B.确定每个符号(包括全局变量和局部变量)的首地址
C.将每个符号引用与唯一的一个符号定义进行关联
D.根据所定义符号的首地址对符号的引用进行重定位
6以下关于可重定位目标文件的叙述中,错误的是( B )。
A.在.节和.节中包含相应模块内所有可重定位信息
B.在.data节中包含相应模块内所有变量的初始值
C.在.text节中包含相应模块内所有机器代码
D.在.rodata节中包含相应模块内所有只读数据
7以下关于ELF目标文件的ELF头的叙述中,错误的是( D )。
A.包含了节头表和程序头表各自的起始位置和长度
B.包含了操作系统版本和机器结构类型等信息
C.数据结构在可重定位和可执行两种目标文件中完全一样
D.包含了ELF头本身的长度和目标文件的长度
8下关于ELF目标文件的节头表的叙述中,错误的是( A )。
A.每个表项用来记录某个节的内容以及相关描述信息
B.描述了每个可装入节的起始虚拟地址、对齐和存取方式
C.通过节头表可获得节的名称、类型、起始地址和长度
D.数据结构在可重定位和可执行两种目标文件中完全一样
9以下关于ELF可重定位和可执行两种目标文件格式比较的叙述中,错误的是( C )。
A.可执行目标文件中有程序头表(段头表),而在可重定位目标文件中则没有
B.可执行目标文件的ELF头中有具体程序入口地址,而在可重定位目标文件中则为0
C.可重定位目标文件中有初始化程序段.init节,而在可执行目标文件中则没有
D.可重定位目标文件中有可重定位节.和.,而在可执行目标文件中则没有
10以下关于ELF可执行目标文件的程序头表(段头表)的叙述中,错误的是( C )。
A.描述了每个可装入段的起始虚拟地址、存储长度、存取方式和对齐方式
B..text节和.rodata节都包含在只读代码段,而.data节和.bss节都包含在读写数据段
C.用于描述可执行文件中的节与主存中的存储段之间的映射关系
D.通过段头表可获得可装入段或特殊段的类型、在文件中的偏移位置及长度
1-11
1以下是链接过程中对符号定义的判断,其中错误的是(C )。
A.全局变量声明“int x, y;”中,x和y都是符号的定义
B.静态局部变量声明“static int x=*xp;”中,x是符号的定义
C.全局变量声明“int *xp=&x;”中,xp和x都是符号的定义
D.函数内的局部变量声明“short x=200;”中,x不是符号的定义
2若x为局部变量,xp、y和z是全局变量,则以下判断中错误的是( D )。
A.赋值语句“y=x+z;”中,y和z都是符号的引用
B.赋值语句“y=x+*xp;”中,y和xp都是符号的引用
C.静态局部变量声明“static int x=*xp;”中,xp是符号的引用
D.赋值语句“int y=x+z;”中,y和z都是符号的引用
3以下有关ELF目标文件的符号表的叙述中,错误的是( B )。
A.符号表定义在.symtab节中,每个表项描述某个符号的相应信息
B.符号表中包含了所有定义符号的描述信息,包括局部变量的相关信息
C.通过符号表可获得符号的名称、所在节及在节中偏移地址和长度
D.可重定位和可执行两种目标文件中都有符号表且数据结构一样
4以下是有关链接过程中符号解析(符号绑定)的叙述,其中错误的是( A )。
A.同一个符号名可能在多个模块中有定义,每个定义处的符号都须分配空间
B.全局符号(包括外部全局符号)需将模块内的引用与模块外的定义符号绑定
C.本地符号的解析比较简单,只要与本模块内定义的符号关联即可
D.符号解析的目的是将符号引用与某目标模块中定义的符号建立关联
5以下有关强符号和弱符号的符号解析的叙述中,错误的是( C )。
A.一个符号名可以有一个强符号和多个弱符号,强符号为其定义
B.一个符号名只能有一个强符号,否则符号解析失败
C.一个符号名可以仅出现在引用处或仅出现在定义处
D.一个符号名可以有多个弱符号,任选一个为其定义
6以下是两个源程序文件:
/* */ /* */
int p1(viod); static int main=1;
int main() int p1() { {
int p1= p1(); main++;
return p1; return main;
} }
对于上述两个源程序文件链接时的符号解析,错误的是( A )。
A.因为出现了两个强符号main,所以会发生链接错误
B.在m1中,对m2中定义的强符号p1的引用只有一处
C.在m1中,定义了一个强符号main和一个弱符号p1
D.在m2中,定义了一个强符号p1和一个局部符号main
7以下是两个源程序文件:
/* */ /* */
int p1; int main=1;
int main() int p1()
{ {
int p1= p1(); int p1=main++;
return p1; return main;
} }
对于上述两个源程序文件链接时的符号解析,错误的是( B )。
A.因为出现了两个强符号main,所以会发生链接错误
B.在模块m1的所有语句中,对符号p1的引用一共有三处
C.在m2中,定义了一个强符号p1和一个强符号main
D.在m1中,定义了一个强符号main和一个弱符号p1
8以下是两个源程序文件:
/* */ /* */
int x=100; float x;
int p1(viod); static main=1;
int main int p1() { {
x= p1(); int p1=main + (int) x;
return x; return p1;
} }
对于上述两个源程序文件链接时的符号解析,错误的是( D )。
A.m1中对x的两处引用都与m1中对x的定义绑定
B.虽然x、main和p1都出现了多次定义,但不会发生链接错误
C.m2中的变量p1与函数p1被分配在不同存储区
D.m2中对x的引用与m2中对x的定义绑定
9以下是两个源程序文件:
/* */ /* */
#include <>
int x=100; double x;
short y=1, z=2;
int main void p1()
{ {
p1(); x= -1.0;
printf(“x=%d, z=%d\n”, x, z); }
} 上述程序执行的结果是( B )。提示:1074790400=2^30+2^20,16400=2^14+2^4。
=-1, z=2
=0, z=-16400
=100, z=2
=-1074790400, z=0
解析: B、该题中变量x在中为强符号,在中为弱符号。在调用p1函数后,x处原来存放的100被替换,-1.0的double类型表示为1 0111 1111 111 00…0,十六进制表示为BFF0 0000 0000 0000。因为x、y和z都是初始化变量,同在.data节中,链接后空间被分配在一起,x占4B,随后y和z各占2B。因为IA-32为小端方式,所以,x的机器数为全0,y的机器数也为全0,z的机器数为BFF0H。执行printf函数后x=0, z=-(2^14+2^4)=-16400。
10假设调用关系如下:→和中的函数,→中的函数,和之间、和相互独立,则以下几个命令行中,静态链接发生错误的命令是( D )。
-static –o myfunc
-static –o myfunc
-static –o myfunc
-static –o myfunc
1-12
1以下有关重定位功能的叙述中,错误的是( D )。
A.重定位的第二步是确定每个段的起始地址,并确定段内每个定义处符号的地址
B.重定位的第一步应先将相同的节合并,且将具有相同存取属性的节合并成段
C.重定位的最终目标是重新确定各模块合并后每个引用所指向的目标地址
D.重定位的最后一步是将引用处的地址修改为与之关联(绑定)的定义处的首地址
解析: D、重定位最后一步是对引用处的地址进行重定位,重定位的方式有多种,只有绝对地址方式才是将引用处的地址修改为与之关联(绑定)的定义处的首地址,而对于其他重定位方式,就不一定是这样,例如,对于PC相对地址方式,引用处填写的是一个相对地址。
2以下有关重定位信息的叙述中,错误的是( D )。
A.重定位信息包含需重定位的位置、绑定的符号和重定位类型
B.指令中的重定位信息在可重定位目标文件的.节中
C.数据中的重定位信息在可重定位目标文件的.节中
D.重定位信息是由编译器在生成汇编指令时产生的
解析: D、重定位信息应该是在汇编阶段生成的,只有在汇编阶段生成机器指令时才知道需要进行重定位的位置,因为这些需重定位的位置在机器指令中,例如,CALL指令中的偏移地址等。
3假定“int buf[2]={10,50};”所定义的buf被分配在静态数据区,其首地址为0x8048930,bufp1为全局变量,被分配在buf随后的存储空间。以下关于“int *bufp1 = &buf[1];”的重定位的描述中,错误的是( A )。
A.在相应的重定位条目中,对bufp1和buf的引用均采用绝对地址方式
B.bufp1的地址为0x8048938,重定位前的内容为04H、00H、00H、00H
C.在可执行目标文件中,地址0x8048938开始的4个字节为34H、89H、04H、08H
D.在可重定位目标文件的.节中,有一个引用buf的重定位条目
解析: A、在重定位条目中只有对buf的引用,没有对bufp1的引用,这里bufp1是一个定义。 B、因为buf有2个数组元素,每个元素占4B,因此bufp1的地址为0x8048930+8=0x8048938,重定位时与引用绑定的符号是buf,即绑定的是&buf[0],而真正赋给bufp1的是&buf[1],引用的地址和绑定的地址相差4,所以重定位前的内容为十六进制数04 00 00 00。 C、可执行文件已经进行了重定位,所以,bufp1所在的地址0x8048938处,应该是重定位后的值,显然应该是buf[1]的地址。重定位时通过初始值加上buf的值得到,即4+0x8048930=0x8048934,小端方式下,4个字节分别为34H、89H、04H、08H。 D、因为“int *bufp1 = &buf[1];”是一个声明,也即是对变量bufp1的数据类型的定义和初始化,因此这个需要重定位的初始化值将被存储在.date节中,因而重定位条目在.节中,并且是绑定buf的一个引用,即引用buf的一个重定位条目。
4假定“int buf[2]={10,50};”所定义的buf被分配在静态数据区,其首地址为0x8048930,bufp1为全局变量,也被分配在静态数据区。以下关于“bufp1 = &buf[1];”的重定位的描述中,错误的是( C )。
A.在相应的重定位条目中,对bufp1和buf的引用均采用绝对地址方式
B.可用一条mov指令实现该赋值语句,该mov指令中有两处需要重定位
C.在可重定位目标文件的.节中,有一个与bufp1相关的重定位条目
D.在可重定位目标文件的.节中,有一个与buf相关的重定位条目
解析: A、赋值语句“ bufp1 = &buf[1];”用movl指令可以实现,其源操作数和目操作数都是绝对地址方式。 B、赋值语句“ bufp1 = &buf[1];”用movl指令可以实现,其源操作数和目操作数都需要重定位。 C、因为“bufp1 = &buf[1];”是一个赋值语句,而不是一个声明,因而不需要对.data节中的bufp1变量进行重定位,也即重定位条目不在.节中。 D、赋值语句“ bufp1 = &buf[1];”用movl指令可以实现,所以,对buf的引用出现在机器代码中,即.text节中,因而重定位条目在.节中。
5以下是有关在Linux系统中启动可执行目标文件执行的叙述,其中错误的是( C )。
A.可以通过在一个程序中调用execve()系统调用函数来启动可执行文件执行
B.可在CUI(命令行用户界面)中的命令行提示符后输入对应的命令来启动其执行
C.可在CUI(命令行用户界面)中双击可执行目标文件对应的图标来启动其执行
D.不管是哪种启动执行方式,最终都是通过调用execve()系统调用函数实现的
6以下是有关在Linux系统中加载可执行目标文件的叙述,其中错误的是( D )。
A.可执行目标文件的加载通过execve()函数调用的加载器来完成
B.任何可执行目标文件中的可装入段被映射到一个统一的虚拟地址空间
C.加载器通过可执行目标文件中的程序头表对可装入段进行加载
D.在可执行目标文件的加载过程中,其中的指令和数据被读入主存
7以下是在Linux系统中启动并加载可执行目标文件过程中shell命令行解释程序所做的部分操作:
① 构造构造argv和envp
② 调用fork()系统调用函数
③ 调用execve()系统调用函数
④ 读入命令(可执行文件名)及参数
启动并加载可执行目标文件的正确步骤是( C )。
A.①→②→③→④
B.②→④→①→③
C.④→①→②→③
D.④→①→③→②
8以下是有关动态链接及其所链接的共享库以及动态链接生成的可执行目标文件的叙述,其中错误的是( B )。
A.共享库在Linux下称为动态共享对象(.so),在Windows下称为动态链接库(.dll)
B.可执行目标文件由动态链接器对可重定位目标文件和共享库中部分信息进行链接而成
C.生成的可执行目标文件是部分链接的,也即,其中还有部分引用没有进行重定位
D.可执行目标文件在加载或执行时,系统将会调出动态链接器利用共享库对其进行动态链接
9以下是有关静态链接和动态链接比较的叙述,其中错误的是( D )。
A.静态库函数代码包含在进程代码段中,而共享库函数代码不包含在进程代码段中
B.静态库函数更新后需对程序重新编译和链接,而共享库函数更新后程序无需重新编译和链接
C.静态库函数代码包含在可执行目标文件中,而共享库函数代码不包含在可执行目标文件中
D.静态链接情况下静态库函数在加载时被链接,动态链接情况下共享库函数可在加载或运行时被链接
10一个共享库文件(.so文件)由多个模块(.o文件)生成。在生成共享库文件的过程中,需要对.o文件进行处理,以生成位置无关代码。以下有关位置无关代码(PIC)生成的叙述中,错误的是( A )。
A.模块间函数调用需要动态链接器进行重定位,重定位时在GOT和PLT中填入相应内容
B.模块内数据的引用无需动态链接器进行重定位,因为引用与定义间相对位置固定
C.模块内函数之间的调用可用PC相对地址实现,无需动态链接器进行重定位
D.模块外数据的引用需要动态链接器进行重定位,重定位时在GOT中填入外部数据的地址
3.1
1、以下有关计算机程序和进程的描述中,错误的是(A)。
A. 机器代码及其数据被映射到统一的虚拟地址空间即形成一个进程
B. 机器代码通常以可执行目标文件或共享库文件形式保存在磁盘中
C. 同一个程序如果处理不同的数据集合就会对应很多不同的进程
D. 用高级语言编写的程序必须转换为机器代码才能在计算机中运行
解析: A、程序需要被启动执行后才能成为进程,机器代码和数据被映射到统一的虚拟地址空间这件事是链接程序完成的,链接后只能生成一个可执行文件或共享库文件,不能形成一个进程。
2、以下关于引入进程好处的叙述,其中错误的是( B )。
A. 每个进程具有确定的逻辑控制流,不会因为进程被打断执行而改变
B. 每个进程须独占使用处理器,以保证每次运行都有同样的运行结果
C. 每个进程各自占用不同的主存区域,便于操作系统实现存储保护
D. 每个进程具有独立的虚拟地址空间,便于编译、链接、共享和加载
解析: B、处理器可以被不同的进程轮流使用或并行使用,在一个进程的整个生命周期中,通常不会独占使用处理器,在某个进程执行遇到异常、中断和I/O操作时,操作系统会调度其他进程使用处理器。
3、以下是关于进程的逻辑控制流的叙述,其中错误的是(A)。
A. 进程的逻辑控制流在其对应机器代码被链接生成时就已经确定
B. 不同进程的逻辑控制流中有可能会存在相同的地址序列
C. 进程的逻辑控制流指其运行过程中执行指令的虚拟地址序列
D. 不同进程的逻辑控制流在时间上交错或重叠的情况称为并发
解析: A、因为进程的逻辑控制流指其运行过程中执行指令的虚拟地址序列,而每个进程的虚拟地址空间都是一样的,例如,IA-32/Linux系统中每个进程的虚拟地址空间都是0000 0000~FFFF FFFFH,因此,不同进程的逻辑控制流中可能存在相同的指令地址序列。链接时可以确定每条指令和每个数据在虚拟地址空间中的地址,但是,不能确定条件转移指令的条件是否满足,因而也就不能确定具体执行的是哪些指令,因而链接时不能确定将来执行时的逻辑控制流。
4、以下关于进程上下文切换的叙述中,错误的是(B)。
A. 进程上下文指进程的代码、数据以及支持进程执行的所有运行环境
B. 进程上下文切换过程中必须将换下进程的代码和数据从主存保存到磁盘上
C. 进程上下文切换过程中必须保存换下进程在切换处的程序计数器PC的值
D. 进程上下文切换机制实现了不同进程在一个处理器中交替运行的功能
解析: B、进程上下文切换仅是把正在处理器上执行的进程换下,让另一个进程占用处理器执行指令,因而没有必要把换下进程的代码和数据从主存保存到磁盘上,只要在栈中保存换下进程的上下文信息即可。
5、以下关于IA-32/Linux进程虚拟地址空间的叙述中,错误的是(C)。
A. 用户空间从0x8048000开始,由高地址的动态区和低地址的静态区组成
B. 分为内核空间和用户空间两大块,各占高地址1GB和低地址3GB空间
C. 用户空间的静态区由代码段和数据段组成,数据段由读写数据和只读数据组成
D. 用户空间的动态区由栈和堆组成,栈从高地址向低地址生长而堆则相反
解析: C、用户空间的静态区由只读代码段和可读可写数据段组成,只读代码段由代码区和只读数据区组成,可读可写数据段由已经初始化的数据区和没有进行初始化的数据区组成。
6、以下关于IA-32/Linux进程内核空间的叙述中,错误的是(C)。
A. 包含进程标识信息和控制信息,如进程标识符、页表等
B. 包含进程现场信息,如寄存器(硬件)上下文等
C. 包含所有进程可以动态链接的共享库映射区
D. 包含内核程序的代码及其所用的数据信息
解析: C、动态链接的共享库映射区不属于内核信息,因而存储在用户空间,通常位于栈和堆之间。
7、以下关于内核态和用户态的叙述中,错误的是(B )。
A. IA-32系统中,特权级别由代码段寄存器CS中的最后两位指定
B. shell命令行解释程序实现程序的加载和运行,因而它运行在内核态
C. 只有在内核态才能执行内核程序代码,其中可包含特权指令
D. 用户态也称目标程序状态,用户态下只能执行用户进程
解析: B、Shell命令行解释程序本身运行在用户态,它通过调用fork()、execve()等系统调用封装函数实现程序的加载和运行,在执行这些系统调用函数的过程中,会通过int 0x80指令陷入内核,从而在内核态由内核代码实现相应的子进程创建、程序加载等工作。
8、以下是关于Linux系统中shell命令行解释器如何进行程序加载和运行的叙述,其中错误的是( C )。
A. shell命令行解释器可以通过调用execve()函数来启动加载器进行程序加载
B. shell命令行解释器根据输入的命令行信息获得程序名及参数和环境变量
C. 加载器会把可执行目标文件从磁盘读到内存中,然后从第一条指令开始执行
D. 调用execve()函数前shell命令行解释器先调用fork()函数创建一个子进程
解析: C、加载器只会根据可执行文件的程序头表等信息建立新加载进程的一些初始数据结构,如对页表信息进行初始化等,而不会从磁盘中把可执行文件中的代码和数据读到内存。只有在发生缺页(page fault)异常时才会把代码和数据从磁盘读到内存。
3.2
1、以下关于异常/中断机制与进程上下文切换机制比较的叙述中,错误的是(D)。A. 进程上下文切换和异常/中断响应两者都会产生异常控制流
B. 响应异常/中断请求后,CPU执行的是内核程序的代码
C. 进程上下文切换后,CPU执行的是另一个进程的代码
D. 进程上下文切换和异常/中断响应处理都通过执行内核程序实现
解析: D、进程上下文切换由操作系统内核程序实现,而异常/中断响应的过程则由CPU这个硬件完成的,而不是由内核程序实现的。
2、以下选项中,不属于“故障”类的异常是(D)。
A.缺页
B.非法指令操作码
C.整除时除数为0
D.断点设置
解析:D、断点设置指令是一种事先设定好的“陷阱”指令,不属于“故障”类异常。
3、故障类异常分为可修复的和不可修复的两类,以下“故障”类异常中,可以修复的异常是(B)。
A. 整数运算溢出
B. TLB缺失
C. 存储访问违例
D. 存储访问越权
4、以下关于“陷阱”类异常的叙述中,错误的是(D)。
A. 单步跟踪状态下,每一条执行的指令都是陷阱指令
B. 是一种事先安排好的或以某种条件触发的“事件”
C. 通常通过陷阱指令或设置单步跟踪状态来触发异常
D. INTO是一条陷阱指令,一旦执行该指令则陷入内核态执行
解析: D、执行到INTO指令时,CPU将检测OF是否为1。若OF为1,则说明当前发生了溢出,需要陷入内核进行溢出处理。在IA-32架构中,若没有INTO指令,即使发生溢出也不会处理溢出异常。
5、以下关于异常/中断响应的叙述中,错误的是(A)。
A. CPU检测到异常事件后所做的处理和检测到中断请求后所做的处理完全一样
B. 中断请求检测由CPU在每条指令执行结束、取下条指令之前进行
C. CPU在中断响应过程中会保存断点和程序状态、关中断并转中断服务程序执行
D. 异常事件检测由CPU在执行每一条指令的过程中进行
解析: A、异常事件是CPU执行指令过程中发生的与当前执行指令有关的意外事件,而中断请求则是CPU外部的I/O部件或时钟等向CPU发出的与当前执行指令无关的意外事件。CPU对于异常和中断的响应处理在大的方面基本一致,都需要保存断点和程序状态并转到相应的处理程序去执行。但有些细节并不一样,例如,在检测到中断请求后,CPU必须通过“中断回答”信号启动中断控制器进行中断查询,以确定当前发出的优先级最高的中断请求类型,并通过数据线获取相应的中断类型号。而对于内部异常,CPU则无需进行中断回答。
6、断点是指异常处理或中断服务结束后返回到被中断原程序继续执行的指令处的地址。以下关于断点的叙述中,错误的是(C)。
A.“陷阱”类异常的断点为陷阱指令下一条指令的地址
B.“故障”类异常的断点为当前发生异常的指令的地址
C. 外部中断请求事件的断点总是当前刚刚执行完的指令的地址
D.“终止”类异常的断点可以是当前指令或下条指令的地址
解析: C、外部中断请求信号的检测总是在一条指令执行完、取下条指令之前,因此,如果检测到有外部中断请求,那么响应中断请求并转到中断服务程序执行后,应该返回到原来被中断的程序中已经完成执行的指令的下条指令执行,而不是返回到刚刚执行完的指令执行。
7、以下关于向量中断方式的叙述中,错误的是(B)。
A.异常处理程序和中断服务程序的首地址称为中断向量,按序存放在一个中断向量表中
B.使用一个统一的查询程序按响应优先级查询异常和中断,并转具体处理程序执行
C.每个异常和中断都被设定一个中断类型号,中断向量存放的位置与对应的中断类型号相关
D.与程序查询中断方式相比,向量中断方式可以在更短的时间内转到对应的中断服务程序执行
8、以下关于外部中断的叙述中,错误的是(B)。
A.分为可屏蔽中断和不可屏蔽中断两类
B.可屏蔽中断比不可屏蔽中断优先级高
C.中断事件主要来源于外部设备或时钟
D.中断事件与当前正在执行的指令无关
3-3
1单选(1.25分)
以下关于x86实地址模式下异常/中断机制的叙述中,错误的是( D )。
A.中断向量地址为中断类型号乘以4
B.采用向量中断方式识别中断源
C.中断向量表固定在0~3FFH的内存区域
D.中断服务程序首地址占8个字节
解析:D、实地址模式下,每个中断向量占4个字节,由16位段地址和16位段内偏移量组成,通过对段地址左移4位然后加上段内偏移量,以得到20位的中断服务程序首地址。
2以下关于x86系统启动过程的叙述中,错误的是( B )。
程序在主存中设置中断向量表
B.进入保护模式后中断向量表中被填入新的中断向量
C.与输入/输出相关的操作通过执行int指令由中断服务程序实现
D.开机后系统首先在实地址模式下工作
解析: B、系统启动结束时进入保护模式,此时,不再使用主存0~3FFH区域内的中断向量表,而是通过专门的中断描述符表来获得中断服务程序或异常处理程序的入口地址。
3以下关于IA-32的异常/中断机制的叙述中,错误的是( B )。
A.最多可以有256种异常和中断类型,每种类型有一个中断号i(0≤i≤255)
B.中断向量表和中断描述符表中都有256个表项,每个表项都占8个字节
C.在保护模式下通过中断描述符表获取异常处理程序和中断服务程序的首地址
D.在实地址模式下使用中断向量表保存异常处理程序和中断服务程序的首地址
解析: B、实地址模式下,每个中断向量表的表项占4个字节,由16位段地址和16位段内偏移量组成。
4以下选项中,不属于中断描述符表中表项内容的是( A )。
A.调用门描述符
B.陷阱门描述符
C.中断门描述符
D.任务门描述符
5以下关于IA-32的中断门描述符的叙述中,错误的是(D )。
A.每个中断门描述符占64位,与一个中断类型号对应
B.包含对应中断服务程序首地址(段选择符和偏移地址)
C.包含DPL字段,用于表示访问本段时的CPL所要求的最低特权级
D.包含存在位(字段P),用于表示对应中断类型是否存在1.25/1.25
解析: D、存在位P用于表示对应段(即异常处理程序或中断服务程序所在的段,通常就是指内核代码段)是否存在,而不是表示对应中断类型是否存在。
6以下给出的IA-32指令中,不属于陷阱指令的是( D )。
$0x80
解析: D、陷阱指令是指在用户程序中事先设定好的、能引起从用户态“陷入”到内核态的一种指令,而iret指令是在异常处理程序或中断服务程序中的最后一条指令,用于结束异常处理或中断服务过程并返回到原断点继续执行。
7单选(1.25分)
以下关于IA-32保护模式下异常和中断响应过程的叙述中,错误的是( C )。
A.处理器根据中断类型号i访问IDTi,再根据IDTi中段选择符访问指定段描述符
B.处理器在检测到异常事件或中断请求后,获得中断类型号并进入响应阶段
C.异常和中断响应处理结束前CPU将对应IDTi中的段选择符送SS,偏移地址送ESP
D.处理器获取内核栈栈顶指针送SS/ESP,并在内核栈保存SS/ESP、EFLAGS、CS/EIP
解析: C、异常和中断响应处理结束前,CPU将对应IDTi中的段选择符送CS,偏移地址送EIP,以便跳转到中断服务程序或异常处理程序执行。
8以下关于IA-32保护模式下iret指令执行过程的叙述中,错误的是( A )。
A.会从内核栈中弹出异常/中断响应时保存的用户栈指针SS/ESP
B.执行iret指令后使得CPU回到异常/中断处理之前的断点执行
C.会从内核栈中弹出异常/中断响应时保存的CS/EIP和EFLAGS
D.会检查异常/中断响应前、后系统是否处于同一个特权级
解析: A、如果检查出异常/中断响应前、后系统处于同一个特权级(也即异常/中断是在内核程序执行时发生的),则不需要从内核栈中弹出用户栈指针SS/ESP,因为,在这种情况下,异常/中断响应时并没有在内核栈中保存用户栈栈顶指针。
3-4
1.以下关于IA-32/Linux异常/中断处理的叙述中,错误的是(B )。
A.中断服务程序和异常处理程序属于Linux内核部分
完全按照IA-32的门描述符类型构造了三种门描述符
-32硬件负责对异常事件和中断请求进行检测和响应
D.在系统启动过程中由Linux负责对IDT的初始化
解析: B、IA-32规定IDT的每个表项可以是三种门描述符中的一种:中断门(TYPE=1110B)、陷阱门(TYPE=1111B)和任务门(TYPE=0101B)。而Linux通过对TYPE和DPL的组合构造了5种门描述符:中断门、系统门、系统中断门、陷阱门和任务门。
2单选(1.25分)
根据Linux对IDT中每种门描述符的初始化构建,以下指令中,不能在用户态执行的是( A )。
20
3
$0x80
解析: A、Linux通过对TYPE和DPL的组合构造了5种门描述符:中断门、系统门(DPL=3,TYPE=1111B)、系统中断门(DPL=3,TYPE=1110B)、陷阱门(DPL=0,TYPE=1111B)和任务门。类型4(into)和128(int $0x80)初始化为系统门,类型3(int 3)初始化为系统中断门,这两种门描述符的DPL都为3。所有未定义的类型(如20~31)都属于陷阱门,即DPL为0。
在异常/中断响应过程中,对于编程异常(由INT n等陷阱指令引起的异常),若IDT中的DPL<CPL,则产生13号异常。into、int $0x80和int 3三条指令执行时,DPL=CPL=3,故可在用户态执行;若在用户态执行INT n (n=20~31)指令,则DPL<CPL,产生13号异常,因此不能在用户态执行。
3以下关于IA-32/Linux异常/中断处理的叙述中,错误的是( D )。
需要针对IA-32的256个中断设置IDT对应表项的内容,即进行IDT的初始化
中对中断的处理不采用发送信号给用户进程的方式,而是对相应中断进行具体处理
对大多数异常的处理方式是发送相应信号给用户进程以尽快结束异常处理过程
中异常处理的C函数名由do_前缀和处理程序名组成,与相应信号处理程序名相同
解析: D、在Linux系统中,信号处理程序名和异常处理程序名不相同,例如,对于0号“除法错”异常和16号“浮点错误”异常,它们的信号名都为SIGFPE,因而相应的信号处理程序名相同,但是,它们默认的异常处理程序名各为divide_error()和coprocessor_error()。
4以下关于IA-32/Linux对14号页故障(page fault)处理的叙述中,错误的是( D )。若发生访问越级(用户进程访问了内核空间),则发送SIGSEGV信号
A.若发生访问越权(例如对只读代码区进行写),则发送SIGSEGV信号
B.若发生访问越级(用户进程访问了内核空间),则发送SIGSEGV信号
C.若发生访问越界(例如访问无信息的空洞页面),则发送SIGSEGV信号
D.若发生所需页面不在主存(页表中存在位为0),则发送SIGSEGV信号
解析: D、若异常不能修复,则发送相应信号给发生异常的进程;若异常可以修复,则进行故障修复后回到发生异常的指令继续执行。显然,所需页面不在主存的情况是可以修复的,因而不会发送SIGSEGV信号。
5以下关于IA-32/Linux异常处理程序的叙述中,错误的是( C )。
A.准备阶段会在内核栈中保存通用寄存器的内容
B.最后一条指令为iret,用于完成异常处理的返回工作
C.准备阶段会在内核栈中保存EFLAGS的内容
D.处理阶段执行的C函数名的形式为“do_处理程序名”
解析: C、EFLAGS寄存器是在异常/中断响应过程中保存在内核栈的,而不是在异常处理程序中被保存。
6IA-32/Linux系统中一次中断过程为( A )。
A.中断源向PIC请求(IRQi)→ PIC向CPU请求(INTR)→ CPU中断回答(INTA)→ PIC中断查询 →CPU读取中断类型号并访问IDT获得中断服务程序入口地址 → Linux内核进行中断处理
B.中断源向PIC请求(IRQi)→ PIC中断查询 → PIC向CPU请求(INTR)→ CPU中断回答(INTA)→ CPU读取中断类型号并访问IDT获得中断服务程序入口地址 → Linux内核进行中断处理
C.中断源向PIC请求(IRQi)→ PIC中断查询 → CPU读取中断类型号并访问IDT获得中断服务程序入口地址 → PIC向CPU请求(INTR)→ CPU中断回答(INTA)→ Linux内核进行中断处理
D.中断源向PIC请求(IRQi)→ PIC向CPU请求(INTR)→ PIC中断查询 → CPU中断回答(INTA)→ CPU读取中断类型号并访问IDT获得中断服务程序入口地址 → Linux内核进行中断处理
7以下关于IA-32/Linux系统调用的叙述中,错误的是( D )。
A.所有系统调用有统一的入口,即系统调用处理程序system_call第一条指令地址
B.执行陷阱指令过程中所完成的操作类似于异常/中断响应过程中完成的任务
C系统调用使用陷阱指令实现,Linux系统中可执行int $0x80指令进行系统调用
D.系统调用是一种特殊的异常类型,IA-32中把它的中断类型号设定为1281.25/1.25
解析: D、系统调用使用陷阱指令实现,因而是一种特殊的异常类型。Linux系统中可执行int $0x80指令进行系统调用,因此,系统调用对应的中断类型号为0x80=128,不过,这是Linux操作系统设定的,而不是由IA-32设定的。例如,Windows操作系统中通过执行int $0x2e指令发出系统调用,因此对应的中断类型号为0x2e=46。
8以下是关于IA-32/Linux中call指令和int $0x80指令比较的叙述,其中错误的是( A )。
指令和int $0x80指令执行前,都会由mov指令将参数值传送到栈中保存
指令和int $0x80指令执行过程中,都会将下一条指令的地址保存在栈中
指令和int $0x80指令都有对应返回指令,前者是ret指令,后者是iret指令
指令为同一特权级过程调用,而int $0x80指令实现对内核服务例程的调用
解析: A、int $0x80指令执行前,参数由mov指令送到对应的寄存器中,例如,调用号送到EAX,其他参数从左到右依次在EBX、ECX、EDX、ESI、EDI和EBP中,而call指令前传递的参数是送到栈中保存的。
3-5
1与计算机系统一样,I/O子系统也采用层次结构,从最上层提出I/O请求的应用程序到最下层的I/O硬件之间的顺序是( B )。
A.应用程序→设备驱动程序→中断服务程序→与设备无关的I/O软件→I/O硬件
B.应用程序→与设备无关的I/O软件→设备驱动程序→中断服务程序→I/O硬件
C.应用程序→中断服务程序→与设备无关的I/O软件→设备驱动程序→I/O硬件
D.应用程序→与设备无关的I/O软件→中断服务程序→设备驱动程序→I/O硬件
2操作系统在I/O子系统中承担极其重要的作用,这主要是由于I/O子系统的三个特性决定的。以下选项中,不属于I/O子系统特性的是( B )。
A.异步性:I/O设备速度较慢,CPU等待I/O期间需由专门的程序调度其他进程使用CPU
B.独占性:应用程序在运行期间只能独占使用某个I/O设备,OS应保证I/O设备被独占使用
C.共享性:I/O资源被所有进程共享,需由专门的程序统一调度和管理I/O资源
D.复杂性:I/O设备控制复杂,应由专门程序来控制I/O设备,从而对应用程序员屏蔽细节
3以下选项给出的程序中,不在内核态运行的是( D )。
A.中断服务程序
B.设备驱动程序
C.系统调用服务例程
D.命令行解释程序
4以下选项给出了几个在Linux系统的程序中使用的函数,其中在内核态运行的是( B )。
A._fillbuf()
B.sys_read()
()
()
解析: B、在给出的几个函数中,fread()是C语言标准库函数,在用户编写的C语言程序中使用,因而不是在内核态运行的函数。read()函数是对read系统调用进行封装的函数,其中包含若干条用于传递系统调用参数的mov指令和int $0x80指令等,该函数在用户态执行,当执行到int $0x80指令时从用户态陷入内核态。sys_read()函数是read系统调用服务例程,是内核中专门用于进行read系统调用处理的函数,因而是在内核态执行的函数。_fillbuf是实现C语言标准库函数或宏定义时所调用的基本函数,用于从文件中读入一块数据到缓冲中,因而也是在用户态执行的函数。
5假定有一个事务处理系统A,其处理器的速度为每秒钟执行5千万条指令,每个事务需要5次I/O操作,每次I/O操作需要10 000条指令。如果系统A每秒钟最多发出1000次I/O操作。则它每秒钟处理的事务数最多能达到( B )个。(忽略延迟并假定事务可以不受限制地并行处理)
A.1000
B.200
C.10000
D.2000
解析: B、从系统A的能力来看,它每秒钟能够处理的事务数为50 000 000/(10 000×5)=1000。但是,因为系统A每秒钟最多发出1000次I/O操作,因而每秒钟所包含的事务数最多仅有1000/5=200个。
6以下关于文件基本概念的叙述中,错误的是(A )。
标准I/O库函数参数中直接用文件描述符fd标识表示某文件
B.根据可读性分,普通文件分成ASCII码文件和二进制文件
系统级I/O函数的参数中用一个非负整数表示某文件
D.有三种标准输入/输出文件,它们都属于ASCII码文本文件
解析: A、C标准I/O库函数的参数中出现的文件是用一个指向文件流缓冲区FILE结构的指针fp标识的。FILE中封装了文件描述符fd,因此,在C标准I/O库函数的参数中并不能直接用fd表示某文件。
7以下是关于C语言头文件中FILE结构的叙述,其中错误的是(D )。
A. FILE描述的文件为流式文件,以字节为单位,通过指针进行读写
结构描述的是某文件在内存的一个输入或输出缓冲区
C.通常FILE缓冲区通过malloc()申请空间,首地址被记录在FILE结构中
D.同一个FILE缓冲区中可能同时缓存了两个不同文件中的信息
正确答案:D你选对了
解析: D、FILE中封装了文件描述符fd,每个FILE缓冲区只能缓存指定文件fd中的信息。
8以下关于I/O操作函数的叙述中,错误的是( C )。
A.使用C标准I/O库函数的程序通用性好,可以在不同系统平台上执行
系统和Windows系统会提供不同的系统级I/O函数或API函数
系统级I/O函数实现了对C标准库函数的封装,对应一个或多个系统调用
D.带输出缓冲区的设备文件当缓冲区已满或遇到/n时将缓冲区信息写到文件
解析: C、应该是反过来,C标准I/O库函数封装了Linux系统级I/O函数。C标准I/O库函数中用指向FILE结构类型的指针表示文件,而FILE结构封装了I/O系统级函数中所用的文件描述符fd。系统级I/O函数通过对若干条指令的封装实现相应的系统调用,其中有一条int $0x80指令,实现从用户态陷入内核态的功能。
3-7
1以下是有关程序直接控制(查询)I/O方式的叙述:
① 无条件传送接口中不记录状态,无需状态查询,可直接定时访问
② 条件传送接口中有“就绪”、“完成”等状态,可定时查询或独占查询
③ 通过CPU执行相应的无条件传送程序或查询程序来完成数据传送
④ 适合于巡回检测采样系统或过程控制系统,以及非随机启动的字符型设备
以上叙述中,正确的有( D )。
A.仅①和②
B.仅①和③和④
C.仅①和②和③
D.全部
2下列选项中, 不属于外部中断的事件是( A )。
A.无效操作码
B.采样定时到
C.键盘缓冲满
D.打印机缺纸
解析: A、无效操作码是由CPU在对某条指令译码的时候发现的,因而是内部异常,而不是外部中断。定时采样中的定时时间到、打印机缺纸、键盘缓冲慢都是与任何指令的执行无关的、由CPU外部的中断源发出的外部中断请求事件。
3下列选项中,能引起外部中断请求的事件是( A )。
A.一次DMA 操作结束
B一条指令执行结束
C.一次中断处理结束
D.一次总线传输结束
解析: A、外部中断请求事件通常是由于外部设备完成I/O任务或遇到像打印机缺纸之类的异常情况需要CPU进行处理时向CPU发出的一种请求信号,CPU在每条指令执行结束时会检测这个请求信号。显然,一条指令执行结束、一次总线传输结束和一次中断处理结束都不可能引起外部请求事件,而DMA操作结束时需要CPU进行数据校验等处理,因而会引起外部中断请求事件。
4以下( A )情况出现时,会引起CPU自动查询有无中断请求,进而可能进入中断响应周期。
A.一条指令执行结束
B.一次DMA 操作结束
C.一次中断处理结束
D.一次 I/O 操作结束
解析: A、CPU在每条指令执行结束时会检测中断请求信号,若该信号有效时,则CPU进入中断响应周期。
5以下操作中,不是通过执行指令而是由硬件完成的是( B )。
A.保护现场
B.保护断点
C.从I/O接口取数
D.设置中断屏蔽字
解析: A、现场信息是指通用寄存器的内容,通用寄存器组包含有几个或几十个寄存器,保存这些寄存器的内容涉及到多次访问存储器,不适合在中断响应过程中完成,否则会大大延长中断响应过程。通常的做法是在中断服务程序中用压栈指令来保护现场。 B、护断点的工作只能在中断响应期间由硬件(CPU)完成,否则,一旦进入到中断服务程序执行,则断点(PC的值)就会因为执行指令而改变,导致断点被破坏。 C、从I/O接口中的数据缓冲寄存器取数或向其中写入数据,是在中断服务程序中用输入或输出指令实现的。 D、设置中断屏蔽字的工作在中断服务程序中用指令实现,用输出指令(如IA-32中的OUT指令)直接将屏蔽字输出到中断屏蔽寄存器。
6设置中断屏蔽字可以动态地改变( C )优先级。
A.中断响应
B.中断返回
C.中断处理
D.中断查询
解析: A、一旦启动中断查询,则中断控制器中的判优电路就会把所有未被屏蔽的中断请求源进行并行判优,选择优先级最高的中断源类型号送给CPU予以响应,这里的优先级指中断响应优先级,即表示被CPU优先响应的顺序。 B、不存在中断返回优先级的概念。中断返回是指中断服务程序执行结束后返回到被中断程序执行的过程,这个过程是通过执行中断服务程序的最后一条指令(例如,IA-32中的IRET指令)来实现的。 C、中断处理优先级反映的是正在处理的中断是否比新发生的中断的处理优先级低(即:屏蔽位为“0”,对新中断开放),如果是的话,就中止正在处理的中断,转到新中断服务程序去执行,处理完后回到原被中止的中断服务程序继续执行。中断处理优先级可以由中断屏蔽字来动态改变。 D、不存在中断查询优先级的概念。中断查询过程是在CPU检测到中断请求信号(INTR)后向中断控制器发出“中断回答”信息所启动的。
7以下是有关对DMA方式的叙述:
① DMA控制器向CPU请求的是总线使用权
② DMA方式可用于键盘和鼠标器的数据输入
③ DMA方式下整个I/O过程完全不需要CPU介入
④ DMA方式需要用中断处理进行辅助操作
以上叙述中,错误的是( A )。
A.仅②和③
B.仅③和④
C.仅②和④
D.仅①和②
解析: A、叙述①显然是正确的。DMA控制器向CPU提出DMA请求,是希望CPU让出总线控制权,由DMA控制器控制总线,完成外设和主存之间的数据传送。
叙述②显然是错误的。DMA方式适合用于进行块传送的高速设备。
叙述③是错误的。DMA方式下,在DMA控制器进行具体的数据传送之前,需要CPU执行初始化程序,来对DMA控制器进行初始化处理,包括设置传送数据个数、内存起始地址等参数。
叙述④是正确的。DMA方式下,当DMA控制器完成具体的数据传送之后,会向CPU发送“DMA结束”中断请求,CPU执行相应的中断服务程序,进行数据校验等后处理工作。
8以下关于I/O子系统的描述中,错误的是( C )。
A.内核空间I/O软件包含设备无关软件、设备驱动程序和中断服务程序
/O子系统包含I/O软件和I/O硬件两大部分
C.直接控制I/O硬件的是设备驱动程序,而不是中断服务程序
/O软件包含用户空间I/O软件部分和内核空间I/O软件部分
解析: C、中断服务程序需要完成CPU与I/O接口之间的数据交换,因而要能够通过发送控制命令字来启动外设,也即中断服务程序能够直接控制I/O硬件。驱动程序和中断服务程序都属于和设备相关的I/O软件部分。