本项目是一个笔者对自己自学CSAPP过程的一个记录,主要包括集合CSAPP学习的相关资源,分享课程的记录,以及分享实验过程。
- 课程地址
- 实验资源
- 课程pdf
- 十分钟计算机:可以帮助理解计算机结构,更好地学习CSAPP课程
- 关于总线部分的介绍视频
- 05:23 课程主题Abstraction is Good But Don’t Forget The Reality
- 07:22 课程目标 1.让你更有效率;2.给你十分有用的工具;
- 07:35 课程内容和课程意义
- 09:13 #1 Ints和Floats (gdb)
- 17:03 #2 Assembly汇编语言
- 18:37 #3 内存的重要性
- 25:23 #4 底层优化
- 28:59 #5 I/O的重要性和网络
- 29:07 课程意义部分
- 30:31 builder角度和程序员角度
- 34:44 关于北大旁书店的笑话 还蛮好笑的
- 38:49 学术诚信:高层次可以,低层次不行
- 46:14 学习策略,每次阅读每章三次,然后做练习题
- 51:16 课程邮箱,FAQ
- 1:02:08 数据实验
- 1:03:24 炸弹实验
- 1:06:09 攻击实验
- 1:07:11 缓存实验
- 1:09:27 Shell实验
- 1:09:55 malloc实验
- 1:12:20 proxy实验
- 位表示
- 位级别的操作
- 整数
-
- 表示:无符号和有符号
-
- 约定和转换
-
- 扩展和截断
-
- 加法,减法,乘法,移位
-
- 内存,指针,字符串的表示
- 总结
- 02:13 bit比特
- 04:49 编码一个字节以及16进制表示
- 06:39 C中数据类型的长度
- 08:50 布尔代数和操作符
- 11:10 对向量操作的布尔代数
- 12:07 使用布尔代数表示和操作集合
- 14:30 逻辑操作和位操作的对比
- 18:44 移位操作
- 21:09 数字表示
- 26:37 数字表示的范围
- 35:58 位表示到两者的转换
- 37:16 有符号数和无符号数的相互转换
- 41:46 C中有符号数和无符号数
- 55:57 有符号数和无符号数的转换
- 57:53 关于无符号数的两个问题
- 1:01:03 有符号数的扩展
- 1:06:04 扩展和截断的总结
- 02:32 无符号数的加法
- 06:19 无符号运算加法的可视化
- 06:42 补码的加法
- 13:42 补码加法的可视化
- 15:02 无符号数的乘法
- 17:20 C中有符号数的乘法
- 24:33 2的指数幂乘法和左移等价
- 26:32 2的指数幂除法和右移等价
- 28:48 逻辑移位和算术移位应用
- 36:03 不要使用无符号数的原因
- 39:03 如果使用无符号数的规范
- 44:22 使用无符号数的原因
- 44:56 内存,指针,字符串的表示
- 48:00 内存的结构梳理
- 49:39 机器的字长
- 53:14 面向字节的内存结构
- 【这里关于内存,需要推荐一下另一门课《十分钟计算机科学-内存部分》,看完对这部分会有更好的理解】
- 57:05 小端序和大端序
- 1:01:19 数据表示的例子
- 1:08:38 字符串部分「很简单地略过」
- 1:09:58 整数问题的小测验
- 2:44 二进制分数的表示,浮点数“浮点”的来源
- 08:07 IEEE floating point
- 08:25 浮点数的表示
- 10:56 规格化的值
- 20:20 解释exp阶码部分,这个地方其实解释有误;如果看书的话,可以发现很明显exp是不等于255的
- 23:53 非规格化的值
- 26:14 特殊值
- 28:29 浮点数编码的可视化
- 29:49 浮点数编码的简单例子
- 39:56 浮点数编码的属性
- 41:34 浮点数运算的基本思想(运算后舍入)
- 44:25 舍入的方法
- 51:33 二进制的舍入
- 54:56 浮点数的乘法
- 56:30 浮点数的加法
- 56:54 浮点数加法和乘法的数学性质
- 62:59 C中的浮点数
- 67:20 浮点数的练习题
- 01:49 课程学习方法
- 03:54 intel处理器的历史和架构
- 06:25 RISC和CISC的历史
- 08:12 英特尔架构的里程碑
- 12:51 Corei7的架构
- 14:28 竞争对手AMD的历史
- 15:35 64位的转变
- 17:49 ARM处理器
- 19:35 C,assembly,machine code
- 22:02 Machine/Assembly code的视角
- 25:19 将C代码翻译为目标代码的过程
- 30:12 C代码到汇编代码的例子,-O优化
- 34:36 汇编代码的特性
- 34:48 数据类型
- 35:56 操作
- 36:54 sumstore的例子
- 39:14 Disassembling反汇编器:objdump和gdb
- 47:50 Assembly基础:寄存器,操作数,move指令
- 48:12 X86-64寄存器
- 53:38 move指令
- 56:59 Simple Memory Addressing Modes
- 58:09 简单寻址的例子
- 56:59 Complex Memory Addressing Modes
- 65:12 寻址的例子
- 66:15 算术和逻辑操作
- 66:40 lea指令
- 73:02 总结
- 04:00 处理器的状态(关于当前运行程序的信息,rax,rsp,rip)
- 05:51 条件码
- 07:55 比较指令(cmp,test)
- 11:46 读状态码(setx,)
- 20:14 状态分支
- 20:36 跳转指令(这里还提及了+=的来源)
- 26:54 C中goto语句(尽量还是不要用,不清晰)
- 29:05 通用条件表达的转换(使用分支)
- 31:41 条件移动
- 35:48 条件移动的例子
- 36:49 条件移动不适合的情况
- 38:27 循环
- (总的来说就是把各种形式的循环归并成一种形式)
- 38:29 "Do while"的例子(C语言)
- 40:44 "Do while"的例子(编译结果)
- 41:05 通用的"Do while"的Goto版本
- 41:21 通用的"While"的Goto版本(1)
- 44:07 "While"的例子
- 45:34 通用的"While"的Goto版本(2)
- 46:26 "For Loop"的形式
- 47:38 "For" -> "While Loop"的转换
- 50:10 Switch语句
- 51:01 Switch语句的例子
- 53:44 Switch的解释(不是if-else的组合!!!超酷的)
- 1:12:31 总结
-
Procedures
- Stack Structure
- Calling Conventions
- Passing control
- Passing data
- Managing local data
- Illustration of Recursion
-
2:45 ABI
- 3:50 Procedures的机制
- 7:34 X86-64Stack
-
ABI中调用的约定
- 14:38 过程中的控制
- 15:32 过程中的控制(例子)
- 21:43 过程中的数据(参数传递)
- 23:06 过程中的数据(例子)
- 26:19 过程中的局部变量管理
- 26:22 栈帧
- 31:15 一个具体的例子
- 34:42 X86-64/Linux栈帧的结构
- 39:06 Calling incr的例子
- 过程调用中寄存器的使用
- 46:29 Register保存的约定
- 49:38 不同寄存器的用途
- 51:17 被调用者保存寄存器的使用示例及其工作原理
- 递归部分的解释
- 54:31 递归的例子
- 1:03:40 递归部分的总结
- 14:38 过程中的控制
- 数组
- 04:16 数组声明
- 05:14 数组访问
- 14:38 数组的例子
- 21:49 数组和指针的不同(C语言部分,可看书)
- 39:47 嵌套数组
- 45:32 嵌套数组的访问
- 51:04 多层数组的元素访问
- 54:58 N*N的矩阵
- 56:41 16*16数组访问的例子
- 结构
- 59:24 结构体的表示
- 1:00:16 指向结构体成员的指针
- 1:05:34 结构体和对齐的概念
- 1:07:03 对齐的原则
- 1:11:15 节省内存
- 浮点数
- 1:13:00 浮点数的历史
- 1:14:44 SSE3编程
- 1:16:01 Scalar和SIMD(真的好感动,实习时用过)
- 1:17:13 FP运算的知识
- 其实这里应该提及多个浮点数一起运算的加速效果
- 内存布局
- 2:14 最大寻址大小的解释(47位)(limit)
- 10:30 内存布局的解释(stack,heap,data,text/shared lib)
- 12:07 内存分配的例子
- 缓冲区溢出
- 17:54 缓冲区问题介绍
- 19:39 String库的缓冲区例子-gets,strcpy,strcat
- 23:26 缓冲区问题例子
- 32:15 缓冲区问题(缓存区溢出攻击例子)
- 33:31 代码注入攻击解释(很有意思)
- 36:47 当你替换代码是,如何确定注入的代码提供了准确的地址
- 38:09 Buffer overflows的历史
- 42:30 蠕虫和病毒的区别
- 43:09 避免缓冲区攻击的手段
- 43:24 避免程序中的缓冲区溢出
- 45:28 系统级别的防御:ASLR,权限,canary(啊啊啊啊啊,canary我遇到过)
- 1:03:51 关于这三种手段的老师的评价
- 1:10:59 attack lab讲解
- 1:12:59 联合体
- 1:13:40 联合体内存分布
- 1:15:40 字节顺序的问题
- 01:09 内存的层级结构
- 01:54 Cache的概念
- 04:42 Cache的组织结构
- 07:30 Cache读
- 07:30 Cache的寻址方式
- 10:38 Direct Mapped Cache(E = 1)
- 20:58 E-way Set Associative Cache(E = 2)
- 35:38 Cache写
- write hit
- 36:11 wrtie through and write back(脏位)
- write miss
- 37:47 write-allocate and No-write-allocate
- 39:40 英特尔i7的cache架构
- 42:42 Cache性能的度量:MIss Rate, Hit Time, Miss Penalty
- 44:53 关于Cache数量度量的例子
- 46:58 写出缓存友好的代码
- 50:57 Memory Mountain
- 53:48 Memory Mountain Test代码
- 56:30 Memory Mountain可视化代码
- 59:14 Ridges of temporal locality时间局部性的山脊
- 1:03:53 重新排列循环
- 1:04:01 Matrix Multiplication例子
- 1:05:13 Miss Rate分析
- 1:08:05 Matrix Multiplication的总结
- 1:10:31 分块技术
- 1:14:41 分块技术的Cache Miss分析
- 1:16:14 Blocking的效果分析
- 01:51 静态链接的过程
- 03:40 为什么要用链接:模块化,效率(编译)
- 05:20 连接器的作用
- 05:25 符号解析
- 07:20 重定位
- 09:20 三种目标文件的分类
- 09:25 .o可重定位目标模块
- 09:50 .out可执行文件
- 10:15 ,so共享目标文件
- 10:32 目标模块ELF标准
- 10:58 目标文件的格式:header,segment header table, .text section, .rodata section,.data section,.bss section, .symtab section, .rel .txt section,.rel .data section,.debug section, section header
- 15:13 链接器的符号分类,global symbols, external symbols, local symbols
- 19:30 局部非静态变量 vs 局部静态变量
- 21:30 链接器如何解决重复符号定义问题?强符号,弱符号;
- 32:04 避免全局变量的原因
- 36:00 重定位入口
- 44:15 加载可执行的目标文件
- 48:30 打包常用的函数
- 51:06 静态链接库
- 55:51 静态库链接的过程
- 56:13 使用静态库的过程
- 60:02 共享链接库
- 62:52 动态链接的加载过程
- 67:17 运行时的动态链接
- 51:06 静态链接库
杂项
- 53:13 常用库
示例
- 24:12 链接错误示例
- sum
- 01:04 C程序示例
- 18:34 符号解析的过程
- 32:49 重定位的过程
- 41:26 重定位后的text部分
- 案例学习
- 70:24 库打桩
- sum