答案仅供参考

7.12

解题思路是模仿链接器的行为:使用重定位记录来识别位置然后使用图7.9中的算法计算重新定位的绝对地址,或者简单地从图7.10中的重定位指令中提取它们。有两点需要注意的是第8行的movl指令包含两个需要重定位的引用。第5行和第8行的指令包含对buf[1]的引用,初始值为Ox4,重定位的地址计算为ADDR(buf) +4。

  • 第一次重定位是mov 0x0,%edx,对应于图7-10中的15行,将swap.o中偏移量为3-6的位置上的0x0重定位于运行时的真实地址0x80483c8+3=0x80483cb,其值为0x804945c
  • 第二次重定位是mov 0x4,%eax,在图中16行,将swap.o中偏移量为8-b位置上的0x4重定位与运行时的真实地址0x80483c8+8=0x80483d0,其值为0x8049458
  • 第三次和第四次重定位在movl $0x4,0x0,对应于图7-10的18行,将swap.o中偏移量为10-13的0x0和偏移量为14-17的0x4重定位于运行时的地址0x80483c8+10=0x80483d8和0x80483c8+14=0x80483dc,并将movl $0x4,0x0修改为movl $0x8049458,0x8049548
  • 第五次重定位是mov 0x0,%eax,在图7-10的23行,将偏移量为1f-22的0x0重定位于地址0x80483c8+1f=0x80483e7上的值0x8049548

结果如下表所示:

图7-10中的行号 地址
15 0x80483cb 0x004945c
16 0x80483d0 0x0049458
18 0x80483d8 0x0049548
18 0x80483dc 0x0049458
23 0x80483e7 0x0049548

7.13

A

在.text的节的节偏移12处调用了函数,在节偏移为19处发生了值的传递,并且值为0x0,则要被重定位。结合c代码可知在此处将调用p3()的返回值放在edx寄存器中,再和*xp相加,然后再在偏移为21的位置发生函数p2()的调用。所以三次重定位的节偏移分别为12,19,21,分别对指令call 12<p1+0xa>、指令mov 0x0,%eax和指令call 21<p1+0x19>进行重定位。 或者直接使用objdump反汇编也可以得到相同结果。

结果如下表所示:

节偏移 重定位类型 符号名字
0x12 R_386_PC32(相对引用) p3
0x19 R_386_32(绝对引用) xp
0x21 R_386_PC32(相对引用) p2

B

.data 节中修改了xp的值,重定位于x的地址。所以 .data 节只有一次重定位, 节偏移为0x4,重定位类型是重定位绝对引用,符号名字是xp。

节偏移 重定位类型 符号名字
0x4 R_386_32(绝对引用) xp

8.23

父进程接收并捕获第一个信号,当处理程序还在处理第一个信号时,第二个信号传来被添加到待处理集合中,此时被处理程序阻塞了就还不会被接收,当第三个信号传来,由于类型和第二个信号相同就会被丢弃,第4、5个信号也是如此。当第一个信号处理完毕后,内核注意到还有一个待处理信号(信号2)就会强迫父进程接收,然后执行处理程序,第二次处理完毕后,没有待处理的信号了,就结束。所以只会接收处理两个信号,counter值只会是2,而不是5。

8.24

题目的要求是在子进程中对只读文本段进行写操作,这会导致段错误,所以第二个要求是要输出段错误。而判断异常终止可以使用WIFSIGNALED来判断,若为非0则发生异常终止,修改后的代码如下:

#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <signal.h>
#include <errno.h>
#include <stdio.h>
#include <stdlib.h>
#define N 2int main()
{int status,i;pid_t pid;for(i = 0;i < N;i++)if((pid = fork()) == 0){int *pt = 0x0;*pt = 15213;exit(100+i);}     while((pid = waitpid(-1,&status,0)) > 0){if(WIFEXITED(status))printf("child %d terminated normally with exit status = %d\n",pid,WEXITSTATUS(status));else if(WIFSIGNALED(status)){fprintf(stderr,"child %d terminated by signal %d",pid,WTERMSIG(status));psignal(WTERMSIG(status)," ");}elseprintf("child %d terminated abnormally\n",pid);}if(errno != ECHILD)printf("waitpid error\n");exit(0);
}

输出如下:

9.11

A. 虚拟地址为0x027c,转换成二进制:00 0010 0111 1100

13 12 11 10 9 8 7 6 5 4 3 2 1 0
0 0 0 0 1 0 0 1 1 1 1 1 0 0

B .按照9.6.4节的假设,VPO为地址的0位到5位,本题为111100,VPN为6位到13位,本题为00001001,即0x9,TLBI是6-7位为0x1,TLBT为8-13位为0x2。查表可知索引位0x1、标记位为0x2,不命中,MMU需要从页表中的PTE中取出PPN,得到有效的PPN为0x17,没有缺页。

完整表格为:

参数
VPN 0x9
TLB索引 0x1
TLB标记 0x2
TLB命中?(是/否)
缺页?(是/省)
PPN 0x17

C. 将得到的物理页帧号0x17( 01 0111 )作为实际物理地址的前6位,偏移量不变,仍为VPO( 11 1100 ),得到最终的物理地址: 0101 1111 1100

11 10 9 8 7 6 5 4 3 2 1 0
0 1 0 1 1 1 1 1 1 1 0 0

D. 将物理地址的6-11位的010111作为CT,其值为0x17,2-5位的1111作为CI其值为0xf,0-1位作为块偏移CO值为0x0。在高速缓存中找索引位0xf的组、标记位0x17的行、偏移为0x0的字节,由高速缓存表可知0xf的组无0x17标记的行,故不命中,无返回字节。 结果如下表:

参数
字节偏移 0x0
缓存索引 0xf
缓存标记 0x17
缓存命中?(是/否)
返回的缓存字节 -

9.12

A.虚拟地址为0x03a9,其二进制为00 0011 1010 1001

13 12 11 10 9 8 7 6 5 4 3 2 1 0
0 0 0 0 1 1 1 0 1 0 1 0 0 1

B. 按照9.6.4节的假设,VPO为地址的0位到5位,本题为101001,VPN为6位到13位,本题为0000 1110,即0xe,TLBI是6-7位为0x2,TLBT为8-13位为0x3。查表可知索引位0x2、标记位为0x3,由于有效位为0不命中,MMU需要从页表中的PTE中取出PPN,得到有效的PPN为0x11,没有缺页。
完整表格为:

参数
VPN 0xe
TLB索引 0x2
TLB标记 0x3
TLB命中?(是/否)
缺页?(是/省)
PPN 0x11

C. 将得到的物理页帧号0x11( 01 0001)作为实际物理地址的前6位,偏移量不变,仍为VPO( 10 1001 ),得到最终的物理地址: 0100 0110 1001

11 10 9 8 7 6 5 4 3 2 1 0
0 1 0 0 0 1 1 0 1 0 0 1

D:将物理地址的6-11位的010001作为CT,其值为0x11,2-5位的1010作为CI其值为0xa,0-1位作为块偏移CO值为0x1。在高速缓存中找索引位0xa的组、标记位0x11的行、偏移为0x1的字节,由高速缓存表可知0xa的组无0x11标记的行,故不命中,无返回字节。

完整表格:

参数
字节偏移 0x1
缓存索引 0xa
缓存标记 0x11
缓存命中?(是/否)
返回的缓存字节 -

9.13

A.虚拟地址为0x0040,其二进制为00 0000 0100 0000

13 12 11 10 9 8 7 6 5 4 3 2 1 0
0 0 0 0 0 0 0 1 0 0 0 0 0 0

B. 按照9.6.4节的假设,VPO为地址的0位到5位,本题为000000,,VPN为6位到13位,本题为0000 0001,即0x1,TLBI是6-7位为0x1,TLBT为8-13位为0x0。 当VPN=1时,有效位为0,PPN无。所以就没有物理地址。有缺页。

参数
VPN 0x1
TLB索引 0x1
TLB标记 0x0
TLB命中?(是/否)
缺页?(是/省)
PPN 0x11

C.缺页

D.缺页

9.14

代码如下

#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <sys/mman.h>
#include <fcntl.h>
int main(int argc, char const *argv[])
{  int fd;  if ((fd = open("hello.txt", O_RDWR)) == -1) {perror("Failed to open hello.txt");  exit(EXIT_FAILURE);  }  struct stat stat_of_file;  if (fstat(fd, &stat_of_file) == -1) { perror("Failed to get stat of hello.txt");  exit(EXIT_FAILURE);  }    char *p;  if ((p = mmap(NULL, stat_of_file.st_size, PROT_WRITE, MAP_SHARED, fd, 0)) == (void *)-1) {perror("Failed to mmap");  exit(EXIT_FAILURE);  }  p[0] = 'J';  munmap(p, stat_of_file.st_size);close(fd);return 0;
}

运行结果:

CSAPP家庭作业答案7 8 9章相关推荐

  1. 厦门大学c语言第七八章作业答案,数据结构第七章考试题库(含答案).doc

    数据结构第七章考试题库(含答案).doc 第七章 图一.选择题1图中有关路径的定义是( ).[北方交通大学 2001 一.24 (2分)]A由顶点和相邻顶点序偶构成的边所形成的序列 B由不同顶点所形成 ...

  2. 《深入理解计算机系统》第三版 第三章家庭作业答案

    简述 相信大部分人在做这些题的时候,因为书中没有给答案,而去网上找参考答案,比如那些高阅读量的博客和git.当然,我也是这样,但他们的答案中还是有好多错误,比如3.59他们几乎都没讲清楚提示中的公式怎 ...

  3. c语言第二章网上作业答案,c语言第二章课后习题答案

    第3章 数据类型.运算符与表达式 习 题 答 案 一. 选择题 1. 以下表示正确常量的是( ). (A) E-5 (B) 1E5.1 (C) 'a12' [答案]D (D) 32766L 2. 若有 ...

  4. c语言第九章课后作业答案,c语言第九章习题带答案

    c语言第九章习题带答案 - 1 - 练习9-1 答案 一.选择题 1.typedef unsigned long LONG 的作用是( D ). A.建立了一种新的数据类型 B .定义了一个整形变量 ...

  5. csapp家庭作业第十章

    10.6 文件关闭后的描述符也会被删除,故为4 0,1,2均固定为标准输入,标准输出,标准错误,故一般从3开始. 10.7 rio_readnb(rio_t *rp, void *usrbuf, in ...

  6. 西电软工计组II作业答案(2020-2021)

    西电软工计组II作业答案(2020-2021) 文章目录 西电软工计组II作业答案(2020-2021) 第六章 6.5 6.9 6.10 第七章 7.2 7.6 7.7 7.16 7.22 7.23 ...

  7. c语言第四章作业,大学C语言第四章作业答案

    大学C语言第四章作业答案,期末考试的题库,二级C语言的练习 第四章课后习题参考程序 三.编程 1.输入一个正整数,判断该数为奇数还是偶数. 参考程序:(1) #include int main() { ...

  8. 20135202闫佳歆-第二章家庭作业-2.69

    第二章家庭作业 选题:2.69 分值:三分 作业过程: 以下是rotate_right函数的代码: unsigned rotate_right(unsigned x, int n) {int endb ...

  9. 知道第一章计算机基础知识作业答案,大学计算机基础作业答案

    大学计算机基础作业答案 第一章 现代社会与计算机 1. 什么事信息,其主要特征是什么? 答:信息是可传递和共享的,可消除人们认知上的不确定因素,对人们的决策具有现实或潜在价值的知识. 特征:普遍性.依 ...

  10. c语言编程作业最大整数问题,C语言编程第六章作业答案.doc

    C语言编程第六章作业答案 1. 输入两个正整数m和n,求其最大公约数和最小公倍数. 辗除法--辗转相除法, 又名欧几里德算法(Euclidean algorithm)乃求两个正整数之最大公因子的算法. ...

最新文章

  1. 学习笔记(5)——实验室集群LVS监控Web界面配置
  2. 区块链开发公司能做什么?对企业未来市场有何帮助?
  3. wxPython 笔记(3)基本结构
  4. 2.5-冗余VLAN
  5. View和View的参数传递
  6. 别再说你不会ElasticSearch,都给你整理好了
  7. matlab线性拟合二元函数,求助:怎么用已知数据进行matlab二元二次函数拟合
  8. jsoncpp-src-0.5.0.tar.gz 源码错误!!!!
  9. Python gevent学习笔记 1
  10. android 加载系统私有库,Android 搭建私有maven仓库及上传项目
  11. 剑指offer面试题58 - II. 左旋转字符串(切片)(一行代码)
  12. ajax hacking,Ajax Hacking
  13. java之读取文本字符串
  14. Linux忘记开机密码
  15. 实数系与实数定理(下)
  16. chrome浏览器关闭更新弹窗
  17. 暴力破解Wi-Fi密码(Mac M1)
  18. simulink反差表
  19. 字节编程题 雀魂启动
  20. GIS影像数据格式说明

热门文章

  1. 360电脑网速怎么测试软件,360怎么测试网速,360如何测试网速
  2. 思科交换机接口配置trunk_思科交换机配置TRUNK的主要步骤
  3. oracle误删数据恢复
  4. PyTorch手写字体识别
  5. 科来网络分析系统2010v7.3.1.2436 激活注册汉化方法
  6. NTUSER.DAT
  7. 工作流初始错误 泛微提交流程提示_泛微协同办公平台E-cology8.0版本后台维护手册(11)–系统参数设置...
  8. AP 微积分 第12版 第4章参考答案
  9. 手机照片局部放大镜_拼音输入法哪个最好?百度手机输入法——最受年轻人喜爱...
  10. 秀米svg点击显示另一张图_SVG的雷,你踩过了没?