6 篇文章
Chapter 7 链接 静态链接 符号解析 重定位 编译器和汇编器生成.text 和.data 链接器通过把每个符号定义和一个内存位置关联,对这些节进行重定位;修改引用,让符号指向这个内存位置 可重定位目标文件 .rel.*:不同节的重定位信息 .line:原始 C 程序和.text 节中机器指令的映射,“-g”得到 .bss:未初始化的静态变量,以及初始化为 0 的全局或静态变量 COMMON:未初始化的全局变量 解析多重定义符号 不允许有多个同名的强符号(定义并初始化) 强弱同在,选强符号 只有弱符号,随便选一个弱符号 重定位 重定位节和符号定义 将相同类型的节合并为同一类型的新的聚合节...
Chapter 8 异常控制流.
在系统上运行程序 链接 gcc 编译链接程序:cpp 预处理器预处理源文件,cc1 编译器编译.i 文件为.S 文件,as 汇编器将.S 文件变为可重定位目标文件.o,最后运行 ld 链接器,创建一个可执行程序 执行./a.out,shell 调用加载器函数,将可执行文件的.text 和.data 复制到内存并跳转到该程序开头 解析多重定义的全局符号 规则 不允许多个同名的强符号 如果有一个强符号和多个弱符号同名,选择弱符号 如果有多个弱符号同名,选择其中任意一个 链接器不会表示检测到符号的多重定义 未初始化的全局变量交给 COMMON 段,将可能存在多重定义的变量交给链接器进行裁决 未初始化...
程序的结构和执行 程序的机器级表示 使用基于条件的数据传送替代基于条件的控制转移 // 基于条件的数据传送 int ntest = x >= y; if (ntest) { .. } else { ..
Chapter 5 优化程序性能 编译器的能力和局限性 内存别名使用:两个指针可能指向同一个内存位置 可能出现这种问题,编译器必须进行检查和处理,这限制了可能的优化 restrict 关键字,可以告知编译器两个指针不能指向同一块内存,编译器可以进行进一步的优化 内联函数替换(inline substitution) 将函数调用替换成函数体;减轻调用的深度 消除循环中的低效率 比如将复杂的函数加入循环;此时考虑设置局部变量 消除循环中的过程调用;考虑返回值来优化 void combine3(vec_ptr v, data_t* dest) { long i; long length = vec_...
Chapter 6 存储器层次结构 RAM(随机访问存储器) SRAM:快但贵;作为高速缓存 DRAM:作为主存 分时复用地址线;减少引脚数量,增加访问时间 首先将一整行复制到一个内部行缓冲区;接着再从行缓冲区中复制出一个单元 非易失性存储器 主要是 ROM,但是 ROM 中有的类型实际上既可以读也可以写 固态硬盘 Solid State Disk (SSD),是基于闪存的存储技术 闪存芯片替代传统旋转磁盘中的机械驱动器 闪存翻译层是一个硬件/固件设备,将对逻辑块的请求翻译成对底层物理设备的访问 SSD 以页为读写单位 将擦除平均分布到所有的块上 随机写很慢的原因 擦除块需要相对较长的时间 如...