3.6k3 分钟

CSAPP 的全称是 Computer Systems: A Programmer's Perspective ,中文翻译为 《深入理解计算机系统》 。这本书以 hello world 程序的运行贯穿始终,可以作为应用级别程序员一窥底层概貌的显微镜,也可以作为系统方向研究者的研究的方向概览。下面我们从第一章出发,进入计算机系统的世界。 # 信息 = 位 + 上下文 计算机系统 = 硬件 + 系统软件 hello 从源程序开始 -> 所有信息都用位表示 -> 8 个位一组 -> 字节 —> ASCII 标准编码字节 —> 文本字符
36k33 分钟

# 准备工作 文件夹中的几个重要文件如下: cookie.txt: 8 个 16 进制数字的码,用于唯一标记 ctarget: 准备用于 code injection attack farm.c: 用于 return oriented programming attacks hex2raw: 用于生成攻击的二进制文件 README.txt: 介绍了文件夹中文件的内容 rtarget: 准备用于 return oriented programming attacks 实验分为 5 个 phase,其中 Phase 1 到 phase 3 是使用 code injection attack,p
50k45 分钟

# 前言 我看见网上非常多的教程里面是一边使用 gdb 调试(过程中可能引爆炸弹),一边探索结果的。他们可能多次启动了 GDB 来完成实验。但是我在 bomb.c 中看到了如下指示: No VICTIM may debug, reverse-engineer, run "strings" on, decompile, decrypt, or use any other technique to gain knowledge of and defuse the BOMB. 并且在 CSAPP 3e 的 handout 中也写的很清楚,不应该多次启动 gdb 来通过输入
15k14 分钟

部分的题目我参考了一下网上的内容(出处已注明),其他的均为自己实现(有的题目的实现过程可能会有些繁琐),部分 dlc 检测出来可能会报些 error,但是 btest 均能过。 没有 TA 可太难了!自己实现了一天多,终于苟完了。不算完美,但也能看吧。 # bitXor /* * bitXor - x^y using only ~ and & * Example: bitXor(4, 5) = 1 * Legal ops: ~ & * Max ops: 14 * Rating: 1 */int bitXor(int x, int
1.9k2 分钟

进入课程网页的时候意外发现这个 Project 的代码已经被填完了。所以没什么好做的。 # Overview 多线程网络服务器大致功能:简单的搜索和文件浏览 Part A: 实现服务器读取文件,统计文件中的单词个数 Part B: 实现网络连接和 HTTP 请求响应 Part C: 将 A 和 B 两部分结合起来 # Part A # FileReader.cc 简单的文件阅读器 在构建时读入文件名, read_file 将整个文件读入一个 string 可以使用 POSIX , C 接口或者 C++ 文件流实现 # WordIndex.h & WordIndex.c
4.7k4 分钟

# 要求 实现一个只含有基本命令和 Pipe (不含重定向符及其他符号) 的 Shell。 # 指南 # 相关文件 pipe_shell.cc : 在其中实现 shell 程序 sh.cc : 传入一个附带参数的程序, fork() 子程序然后 execvp() 去执行它 stdin_echo.cc : 从 stdin 中读取,输出读取的内容,直到获取 EOF ,然后停止 example_tests/ : 其中含有示例输入和对应输出 solution_binaries/ : 官方答案执行码 # 具体要求 程序一次从标准输入读取一行命令 一行命令包括命令本身和连接
30k27 分钟

# Overview 本作业要求实现: Page 对象: 若 Page 不在 memory 中,那么它的数据被存储在磁盘上的 swap file 部分。在 swap file 中,每一页都有对应的顺序存储的数据。 可以使用 C++ fstream 类进行 I/O 读写。尤其是 read() 和 write() 方法。 PageTable 对象 包含多个 page 以及 swap file 这里主要要求实现 LRU 算法 # 相关文件 # Page Page.h Page.cc PageTemplates.cc # PageTable PageTabl
8.2k7 分钟

# 前言 最近学习了 C++ STL, 想着自己使用 C++ 实现一个贪吃蛇的小游戏,锻炼一下 C++ 代码能力和软件工程能力。完整代码参见:贪吃蛇小游戏 ——C++ 实现 # 贪吃蛇的基本规则 首先,有一块场地,场地周围是墙,场地内的部分是墙,部分是食物,部分是蛇。贪吃蛇没吃到任何东西,就正常移动;吃到食物,尾巴会增长;如果吃到了自己的尾巴或者撞了墙,游戏结束。 # 游戏基本设定 场地内部墙的个数在 [1,min (height-2,width-2)] 之间 1 次只出现一个食物 用户输入场地规格必须大于 3 默认蛇的移动方向向右,初始位置随机生成 如果贪吃蛇吃到了食物,会在新的地方生成食
3.1k3 分钟

# 前言 我们在课程中写的都是代码量不大的小文件,但是在实际工程开发中,情况可就不一样了。但是那么多的代码,我们不可能将它们放在同一个文件中,肯定要分成不同的源文件。但是如何分解程序?如何实现程序之间的交流,就成了一个问题。本节中我们将探讨如何将一个大的工程分成不同的源程序,并且实现这些源程序之间的交流。我们首先介绍 C++ 的编译模型,也就是 C++ 源程序是如何编译成为机器可理解的二进制代码的。然后,我们讨论如何将一个大的工程分解为多个小的源程序,并且实现他们之间的交流。最后,我们探讨 C++ 的预处理器的工作模式。 # C++ 编译模型 C++ 是一种编译型的语言,即通过编译器将源代码转
7451 分钟

最近在学习斯坦福的 CS106L,学习标准 C++。在阅读 Course Reader 的 Introduction 部分时,作者介绍了 C++ 的诞生故事,对我颇有启发。 C++ 的创始人在剑桥大学读 PhD 时,主要研究的是分布式系统。在当时,他使用了一种叫 Simula 的面向对象语言。他在 Simula 中初始化电脑对象和网络对象,来模拟系统之间通过网络的交互。但是在开发的过程中,他发现,虽然使用 Simula 来对整个过程进行模拟,非常的快速,但是 Simula 的执行速度非常慢。而后,他又尝试通过一种名为 BCPL 的语言进行开发。但是新的问题又出现了,这种语言是一种较底层的系统语