- 对象本质是位+上下文。
- 处理器正常的加载和存储都要经过寄存器。显示器也是内存经寄存器才能显示。
- 针对主存和处理器的运算差异,采用cache进行高速缓存。
- CPU包括高速缓存、寄存器文件以及、ALU。
- 文件是对IO设备的抽象,虚拟内存是对主存和磁盘的抽象,进程是处理器、主存和IO设备的抽象。
- 补码的必要性:原码和反码对0有不同解释。
- 函数传参大于6个整型参数,超过6个的部分就要通过栈传递。如果不超过可直接用寄存器传递。
- 被调用者保存寄存器:当过程P调用过程Q时,Q必须保存寄存器的值,要么就是根本不去改变他,要么就是把原始值压入栈中,改变寄存器的值,然后在返回前从栈中弹出旧值。
- 对于结构体指针而言,struct->element等同于(*struct).element。->是为了减少使用容易漏掉括号的后者。结构体元素本质上就是指针偏移。
- .align 4表示按4字节对齐的限制。
- 结构体整体、内存分配函数、栈帧也要满足字节对齐。
- 利用缓冲区溢出的攻击方式:攻击代码+指向攻击代码的指针覆盖返回地址。
- 预防12中攻击方法:栈随机化;栈保护者机制,在栈帧中任何局部缓冲区和栈状态之间存储一个特殊的金丝雀值,随机产生,返回之前检查这个值是否变化;限制代码可执行区域。
x = 100, y = 300; *q = y, *p = x; t1 = *q
中t1的值会因为pq是否指向同一地址而不同。- 循环展开是一种程序变换,通过增加每次迭代计算元素的数量,减少循环的迭代次数。
- 可以将一组合并运算分割成两个或更多的部分,以更好的利用计算单元的并行特性。
- 局部性原理:良好的程序倾向于引用邻近于其他最近引用过的数据项的数据项,或者最近引用过的数据项本身。
- 双重嵌套循环按照行优先顺序读数组中的元素。步长为1的引用模式是程序中空间局部性最常见和重要的来源。循环体越小,循环迭代次数越多,局部性越好。
- 存储器层次结构:对于每个k,位于k层的更快更小的存储设备作为位于k+1层更大更慢的存储设备的缓存。不同层之间是以块为单元进行来回复制的。
- 链接可以执行于编译时,也可以执行于加载时,甚至执行于运行时。
- 编译器必须完成两个任务:符号解析和重定位(把每个符号定义和内存位置关联起来)。
- 未初始化的全局变量分配到COMMOM中,未初始化的静态变量分配到.bss中。
- 静态库把所有的目标模块打包成一个单独的文件,可以用做连接器的输入。C链接库总是会把libc.a传入。库一般放在末尾。
- 共享库是一个目标模块,在运行或加载时可加载到任意的内存地址,并和一个在内存中的程序链接起来,这个过程称动态链接。共享库只把重定位和符号表信息复制到可执行文件中。
- 库打桩:允许截获对共享库函数的调用,取而代之执行自己的代码。
- 异常包括中断、陷阱和系统调用、故障和终止(硬件错误)。
CSAPP学习
最新推荐文章于 2023-02-22 23:56:18 发布