算法系列:CSAPP 推荐
转载自:https://book.douban.com/review/6093947/
如果你觉得这本书过于厚重担心看不下来的话,不妨跟着coursera的Hardware/Software Interface这门课程去听一听。这本书虽然是这门课的超集,但是其中的关键与精华都在课程中有讲到。其实更关键的是,coursera的课将原书中最为精彩的lab移植了过来,在做这些作业时很难感到枯燥。下面把这门课的lab列出来,以及一些提示:
Lab1:位运算,我觉得这是最无聊也是最有趣的一个Lab,看你怎么看它。说其无聊主要是指没有成就感(相对于其他的Lab来说),说其有趣是指也许这是你第一次用这么少的代码实现这么多的功能。甚至可以只用与或非来实现三目运算符
Lab2:BinaryBomb,拆炸弹,非常经典的Lab。一共有6个Phase,每个Phase都需要你打开GDB(懒人可以用DDD),打各种断点,查看各种寄存器内存状态,分析汇编语句,整理出结构。6个Phase从易到难,分别是简单的比较(助教已经演示)、循环(这个可以算是最耗时间的,一旦你通过了这个Phase,剩下的就好说了)、switch语句(注意计算offset)、递归(嗯,fib什么的)、指针数组(注意跟踪过程,一定要有纸笔)、链表(排序算法什么的)。这个Lab是整门课最精彩的Lab,因为时刻伴随着你在一步步地逼近真相的神秘感与快感。当这个Lab做完后,你会发现GDB调试功力大涨,对于操作系统的调用过程也很熟悉了。
Lab3:内存攻击,最邪恶的Lab没有之一,这个Lab是要你去利用内存溢出的漏洞去攻击给你提供的可执行程序。这个Lab也有好几个Phase,最后一个Phase是直接注入自己的汇编代码。sendmail真是被黑出翔
Lab4:不透明的Cache,又是类似于Lab2的黑箱Lab,通过给几个虚拟的Cache提供输入,以及Cache给你返回的Hit/Miss信息判断Cache的规格。对了解Cache的结构很有帮助
Lab5:手写一个malloc,嗯,你没看错。不过其中最痛苦的块合并功能已经给你写好了,你只要知道malloc、free的流程就可以了,侯捷老师课上学的东西终于能派上用场了
这就是全部的5个lab,设计的精巧程度自然不用多说,关键是,之前有可能只是抽象的学过这些概念,比如Cache、比如内存溢出攻击,这次就可以实际观察、演练。
这门课的最后一章还讲了一些JVM与Intel架构的不同之处,对Java有些了解的同学可以听一听。
最后还要说,尽管这本书和这门课很精彩,但毕竟是体系结构入门的教材,在大多数方面还是和操作系统、组成原理的深度是比不了的。所以我觉得这本书大三之前还值得看(最好在操作系统前看),到大三之后,除非是为了面试临时复习抱佛脚,否则这本书还是讲的有些浅了。不过如果是作为汇编的入门,倒是很好的教材。
算法系列:CSAPP 推荐的更多相关文章
- 【C#实现漫画算法系列】-判断 2 的乘方
微信上关注了算法爱好者这个公众号,有一个漫画算法系列的文章生动形象,感觉特别好,给大家推荐一下(没收过广告费哦),原文链接:漫画算法系列.也看到了许多同学用不同的语言来实现算法,作为一枚C#资深爱好的 ...
- 编程作业1.1——sklearn机器学习算法系列之LinearRegression线性回归
知识点 scikit-learn 对于线性回归提供了比较多的类库,这些类库都可以用来做线性回归分析. 我们也可以使用scikit-learn的线性回归函数,而不是从头开始实现这些算法. 我们将scik ...
- JAVA算法系列 冒泡排序
java算法系列之排序 手写冒泡 冒泡算是最基础的一个排序算法,简单的可以理解为,每一趟都拿i与i+1进行比较,两个for循环,时间复杂度为 O(n^2),同时本例与选择排序进行了比较,选择排序又叫直 ...
- JAVA算法系列 快速排序
java算法系列之排序 手写快排 首先说一下什么是快排,比冒泡效率要高,快排的基本思路是首先找到一个基准元素,比如数组中最左边的那个位置,作为基准元素key,之后在最左边和最右边设立两个哨兵,i 和 ...
- javascript实现数据结构与算法系列:栈 -- 顺序存储表示和链式表示及示例
栈(Stack)是限定仅在表尾进行插入或删除操作的线性表.表尾为栈顶(top),表头为栈底(bottom),不含元素的空表为空栈. 栈又称为后进先出(last in first out)的线性表. 堆 ...
- 三白话经典算法系列 Shell排序实现
山是包插入的精髓排序排序,这种方法,也被称为窄增量排序.因为DL.Shell至1959提出命名. 该方法的基本思想是:先将整个待排元素序列切割成若干个子序列(由相隔某个"增量"的元 ...
- Atitit s2018.6 s6 doc list on com pc.docx Atitit s2018.6 s6 doc list on com pc.docx Aitit algo fix 算法系列补充.docx Atiitt 兼容性提示的艺术 attilax总结.docx Atitit 应用程序容器化总结 v2 s66.docx Atitit file cms api
Atitit s2018.6 s6 doc list on com pc.docx Atitit s2018.6 s6 doc list on com pc.docx Aitit algo fi ...
- 玩转算法系列--图论精讲 面试升职必备(Java版)
第1章 和bobo老师一起,玩转图论算法欢迎大家来到我的新课程:<玩转图论算法>.在这个课程中,我们将一起完整学习图论领域的经典算法,培养大家的图论建模能力.通过这个课程的学习,你将能够真 ...
- 数据结构与算法系列——排序(4)_Shell希尔排序
1. 工作原理(定义) 希尔排序,也称递减增量排序算法,是插入排序的一种更高效的改进版本.但希尔排序是非稳定排序算法. 希尔排序的基本思想是:先将整个待排序的记录序列分割成为若干子序列分别进行直接插入 ...
- 数据结构与算法系列2 线性表 使用java实现动态数组+ArrayList源码详解
数据结构与算法系列2 线性表 使用java实现动态数组+ArrayList源码详解 对数组有不了解的可以先看看我的另一篇文章,那篇文章对数组有很多详细的解析,而本篇文章则着重讲动态数组,另一篇文章链接 ...
随机推荐
- NFS和mount常用参数详解
NFS权限参数配置 ro 只读访问 rw 读写访问 sync 所有数据在请求时写入共享 async NFS在写入数据前可以相应请求 secure NFS通过1024以下的安全TCP/IP端口发送 in ...
- cocoapods for xcode怎么用
一.概要 iOS开发时,项目中会引用许多第三方库,CocoaPods(https://github.com/CocoaPods/CocoaPods)可以用来方便的统一管理这些第三方库. 二.安装 由于 ...
- git rebase简介(基本篇)
原文: http://gitbook.liuhui998.com/4_2.html 一.基本 git rebase用于把一个分支的修改合并到当前分支. 假设你现在基于远程分支"origin& ...
- [转]IntelliJ Idea 常用快捷键 列表(实战终极总结!!!!)
IntelliJ Idea 常用快捷键 列表(实战终极总结!!!!) ntelliJ Idea 常用快捷键 列表(实战终极总结!!!!) 1. -----------自动代码-------- 常用的有 ...
- Gitlab的Gravatar头像无法显示的问题
通过gitlab搭建的git仓库,由于Gravatar被墙了,导致Gravatar头像无法显示.总觉得怪怪的. 社区版gitlab解决办法: vi /var/opt/gitlab/gitlab-rai ...
- Java使用for循环打印乘法口诀(正倒左右三角形)
代码1: public void test1(){ for(int i = 1; i < 10 ; i ++){ for(int k = 1; k < i ; k ++){ System. ...
- ios UITextView 计算文字内容大小
先设置好 textView的内容文字,再调用以下代码,就能够得到文字内容的size,其中参数表示最大的size的尺寸,通常,高度应该不限制,宽度是控件的宽度. let newSize = statem ...
- 搭建Solr集群的推荐方案
之前介绍过2篇SolrCloud的部署流程,第一个是使用安装脚本的方式进行抽取安装,启动比较方便,但是会创建多个目录,感觉比较乱:第二个是官方教程上提供的方法,使用比较简单,直接释放压缩包即可,并且启 ...
- Java for LeetCode 216 Combination Sum III
Find all possible combinations of k numbers that add up to a number n, given that only numbers from ...
- Java for LeetCode 212 Word Search II
Given a 2D board and a list of words from the dictionary, find all words in the board. Each word mus ...