CSAPP Lab6 解题分析

Malloc Lab,据说是最难的一个lab。在看完第九章之后,因为要旅游,没有直接做lab,而是继续看书,结果回来了,书还剩1章,又顺势看完了剩余的部分。在整本书都读完了以后,才回过头来做Malloc Lab。 介绍需要完成mm.c里的内容,材料中需要完成的是 int mm_init(void) void *mm_malloc(size_t size) void mm_free(void *ptr) 其他的mm_realloc源码中已经填写好了。 这里,我是用书中的隐式空闲链表方法,先完成实验。     Continue Reading
Xin Qiu's avatar
Xin Qiu Aug 11, 2016

CSAPP Lab5 解题分析

这个实验是要实现一个简易的shell程序,主要考虑的是异常和信号的处理。 前期工作解压缩shlab-handout.tar,执行make clean | make,就可以得到编译好的文件。 文件夹中的tshref是正确的结果,可以用来验证。与其用 ./sdriver.pl -t trace01.txt -s ./tsh -a "-p" 来测试,我觉得实验手册里提到的另一种方法更好用, make test01 这是对自己写的tsh进行测试,要想对tshref进行测试,只需要在后面的test前面添加一个r即可,也就是make rtest01。     Continue Reading
Xin Qiu's avatar
Xin Qiu Jul 12, 2016

CSAPP Lab4 解题分析

MathJax.Hub.Config({ tex2jax: {inlineMath: [['$','$'], ['\\(','\\)']]} }); Lab4 的Cache Lab 的说明资料太少了,csim.c 里面空空的,惊了。身为弱渣的我只好先拿别人的代码来参考参考。这里选取的代码csim.c。 Part A: Writing a Cache Simulator需要些一个Cache模拟器,将 valgrind 内存访问记录作为参数,模拟是否命中缓存。输出命中,不命中,移除。 lab里提供了一个写好的程序 csim-ref ,使用LRU(least-recently used)替换原则,模拟缓存命中情况。 实验指导上给出了命令行参数 Usage: ./csim-ref [-hv] -s <s> -E <E> -b <b> -t <tracefile> -h: Optional help flag that prints usage info -v: Optional verbose flag that displays trace info -s <s>: Number of set index bits ($ S = 2^{s} $ is the number of sets) -E <E>: Associativity (number of lines per set) -b <b>: Number of block bits ($ B = 2^{b} $ is the block size) -t <tracefile>: Name of the valgrind trace to replay 所以在 csim.c 里也可以写个打印帮助的函数 void printUsage(){ printf("Usage: ./csim [-h] [-v] -s <s> -E <E> -b <b> -t <tracefile>\n"); printf("-s: number of set index(2^s sets)\n"); printf("-E: number of lines per set\n"); printf("-b: number of block offset bits\n"); printf("-t: trace file name\n"); }     Continue Reading
Xin Qiu's avatar
Xin Qiu Jun 07, 2016

CSAPP Lab3 解题分析

首先,使用tar xvf命令解压文件后,会有3个可执行的二进制文件bufbomb,hex2raw,makecookie。参考write-up。 Level 0Bufbomb程序运行会读一个字符串,使用一下函数getbuf: /* Buffer size for getbuf */ #define NORMAL_BUFFER_SIZE 32 int getbuf() { char buf[NORMAL_BUFFER_SIZE]; Gets(buf); return 1; } Gets函数和标准库的gets功能比较相似,是读取字符串。因为Gets没有办法判断是否buf足够大,所以要用一个函数去判断长度是否小于32。将字符串传入getbuf函数中,若字符串小于32,则返回1. 080491f4 <getbuf>: 80491f4: 55 push %ebp 80491f5: 89 e5 mov %esp,%ebp 80491f7: 83 ec 38 sub $0x38,%esp 80491fa: 8d 45 d8 lea -0x28(%ebp),%eax 80491fd: 89 04 24 mov %eax,(%esp) 8049200: e8 f5 fa ff ff call 8048cfa <Gets> 8049205: b8 01 00 00 00 mov $0x1,%eax 804920a: c9 leave 804920b: c3 ret getbuf是由函数test调用: void test() { int val; /* Put canary on stack to detect possiblecorruption */ volatile int local = uniqueval(); val = getbuf(); /* Check for corruption stack */ if (local != uniqueval()) { printf("Sabotaged!: the stack has beencorrupted\n"); } else if (val == cookie) { printf("Boom!: getbuf returned0x%x\n", val); validate(3); } else { printf("Dud: getbuf returned0x%x\n", val); } } 其中,Smoke源码: void smoke(){ puts("Smoke!: You calledsmoke()"); validate(0); exit(0); } level 0 的任务是让getbuf在执行后返回时,执行smoke函数,而不是返回test函数中。     Continue Reading
Xin Qiu's avatar
Xin Qiu Mar 30, 2016

CSAPP Lab2 解题分析

Lab2 的 Bomb是个非常有意思的实验,比起之前耗脑的Lab1,这个Lab主要是学习反汇编。 这里我的环境是OS X EI Capitan,Lab2是[Updated 1/12/16]. Phase1在Mac上是默认没有GDB的,可以使用LLDB来代替。 进入lldb lldb bomb 使用disassemble进行反汇编,参考bomb.c文件,可以知道主要的几个函数名。 首先是Phase_1 (lldb) disas -n phase_1 得到以下汇编代码 bomb`phase_1: bomb[0x400ee0] <+0>: subq $0x8, %rsp bomb[0x400ee4] <+4>: movl $0x402400, %esi bomb[0x400ee9] <+9>: callq 0x401338 ; strings_not_equal bomb[0x400eee] <+14>: testl %eax, %eax bomb[0x400ef0] <+16>: je 0x400ef7 ; <+23> bomb[0x400ef2] <+18>: callq 0x40143a ; explode_bomb bomb[0x400ef7] <+23>: addq $0x8, %rsp bomb[0x400efb] <+27>: retq 这段代码还是挺好理解的,保存Stack pointer,将$0x402400传给%esi,调用位于0x401338的strings_not_equal函数,比较%eax是否为0,不为零则调用explode_bomb函数,为零则返回。 所以关键要找出字符串是什么。根据上述的汇编代码,可以发现字符串被保存在0x402400这个内存里,所以使用x/s来查看。 (lldb) x/s 0x402400 得到 0x00402400: "Border relations with Canada have never been better." 所以第一关的答案是Strings_Not_Equal     Continue Reading
Xin Qiu's avatar
Xin Qiu Feb 10, 2016

读书笔记——CSAPP第二章

CSAPP(Computer Systems: A Programmer’s Perspective ),中文书名为深入理解计算机系统。这本书的好不需多言。为了锻炼英文阅读能力,我特地买的是英文原版。第一章比较简短,简单的从一段Hello World C程序,慢慢深入计算机底层的运行机制。可以说这一章就是本书的框架。以下是从第二章开始,记录了我遇到的困惑,一些简单的就不再介绍,书上已经写的很详细。     Continue Reading
Xin Qiu's avatar
Xin Qiu Sep 27, 2015