-
背景 动手实现一个简单的Lab,主要依赖于课本第八章的内容 感觉主要是05比较难。。发现执行的顺序不太对。。原因是SIGCHLD里面waitpid参数没写对。。 后面的就相对简单了 累计大概花了10个小时的样子 实现细节 built-in comamnd built-in command 指的是shell自身的命令,因此只有少数几个,比如pwd.在上使用which pwd的时候,会提示"pwd: shell built-in command" 测试文件的构成 以trace04.txt举例 1# 2# trace04.txt - Run a background job. 3# 4/bin/echo -e …
Read More -
背景 动手实现一个memory allocator,体会core到爆炸的乐趣(不是 trace file 结构分析 trace file 是对allocator的输入的描述,可以从mdriver.c中的 1static trace_t *read_trace(char *tracedir, char *filename); 看到Parse的逻辑,从而得到trace file的结构。 1 fscanf(tracefile, "%d", &(trace->sugg_heapsize)); /* not used */ 2 fscanf(tracefile, "%d", …
Read More -
背景 CSAPP:3e 的配套实验 地址 分成了两个部分,第一部分是模拟一下cache的miss,hit,evict的规则。第二部分是优化一个矩阵的转置,使得miss尽可能少。 PART A 给了一个标程csim-ref,要求实现一个程序,输出与该标程一致。 写的时候太心急了。。导致没看完作业要求就开始写了。。 然后就纠结了好久。。如果要访问的地址超过了一个block line的边界该怎么办。。 然而实际上题目里已经把这种情况排除了。。 For this this lab, you should assume that memory accesses are aligned properly, such that a single …
Read More -
背景 CSAPP:3e第四章配套的实验。 第四章是讲处理器架构的,章节的重点是实现一个六阶段流水线。 lab的内容也是,需要实现一个Y86-64的流水线,并进行性能调优。 准备工作 材料里面sim.tar解压之后,有可能是没办法编译通过的。 原因是tk(a windowing toolkit )在8.5版本的时候废弃了某个接口,与8.6版本不兼容。 因此需要安装tk 8.5或者更低的版本。 在archlinux/manjaro下可以通过aur安装tk85. use tk<=8.5,8.6 or above will not compile Modify the corresponding header file in …
Read More -
背景 CSAPP 处理器那章快看完了,猛然发现竟然还有个attacklab.. 之前以为每一章只有一个lab 这个lab是教大家如何找到程序的漏洞并实施攻击。 知道如何实施攻击,才能更好地写出安全的代码。 包含5个phase 前三个没有什么保护措施,栈地址是固定的,可以注入可执行代码,比较容易. 后两个加了随机栈地址以及栈上地址不可执行的保护措施,需要用Return-oriented_programming 的方式搞定. phase 1 第一个比较简单,利用buffer overflow 来将函数的返回地址,替换成一个已知函数的地址,达到执行特定函数的目的。 回忆一下函数调用的机器代码实现,需要先把函数的返回地址压栈,然后开辟栈空 …
Read More -
背景 疫情肆虐,在家百无聊赖,于是开始拆炸弹. 炸弹分为6个阶段,每个阶段必须输入一个特定的字符串,否则炸弹就会爆炸. 提供给我们的是一个.c文件和一个linux可执行文件bomb 1 2/*************************************************************************** 3* Dr. Evil's Insidious Bomb, Version 1.1 4* Copyright 2011, Dr. Evil Incorporated. All rights reserved. 5* 6* LICENSE: 7* 8* Dr. Evil …
Read More -
CSAPP第二章的内容以前组成原理基本都学过...所以就简单翻了翻。 对应的lab是用位运算实现各种有的没的... 题目基本都很tricky... 除了用到一些常规的位运算性质,还用到了一些奇怪的条件: * ~0x7FFFFFFF = 0x7FFFFFFF + 1 * 0xFFFFFFFF +1 = 0x00000000 * 0 == ~0+1 唯一让我觉得比较有趣的是how many bits这道题 题目要求是给一个32-bit signed int,问最少用多少位能得到它的补码表示。 考虑正数,显然,高位的连续的多个0是不必要的,只需要一个符号位的0即可。 那么对于负数,**高位的连续的多个1也是不必要的。 **原因 …
Read More