程序员自我修养总结

上传人:ji****en 文档编号:105748136 上传时间:2019-10-13 格式:DOCX 页数:74 大小:524.70KB
返回 下载 相关 举报
程序员自我修养总结_第1页
第1页 / 共74页
程序员自我修养总结_第2页
第2页 / 共74页
程序员自我修养总结_第3页
第3页 / 共74页
程序员自我修养总结_第4页
第4页 / 共74页
程序员自我修养总结_第5页
第5页 / 共74页
点击查看更多>>
资源描述

《程序员自我修养总结》由会员分享,可在线阅读,更多相关《程序员自我修养总结(74页珍藏版)》请在金锄头文库上搜索。

1、目录第一章 温故而知新6第二节 万变不离其宗6第3节 站得高看得远7第4节 操作系统的功能71.4.1 不要让CPU打盹71.4.2 设备驱动81.5 内存不够怎么办?81.5.1 关于隔离91.5.2 分段91.5.3 分页91.6 众人拾柴火焰高101.6.1 线程基础101.6.2 线程安全111.6.3 多线程内部情况14第二章 编译和链接152.1 被隐藏了的过程152.1.1 预编译152.1.2 编译152.1.3 汇编152.1.4 链接162.2 编译器做了什么162.2.1 词法分析162.2.2 语法分析162.2.3 语义分析162.2.4 中间语言生成172.2.5

2、目标代码的生成与优化172.3 链接器年龄比编译器长182.4 模块拼接静态链接18第三章 目标文件里有什么183.1 目标文件的格式193.2 目标文件是什么样的193.3 挖掘SimpleSection.o203.3.3 BSS段203.3.4 其他段203.4 ELF文件结构描述203.4.1 文件头213.4.2 段表213.4.3 重定位表223.4.4 字符串表223.5 链接的接口符号223.5.1 ELF符号表结构233.5.2 特殊符号233.5.3 符号修饰与函数签名243.5.5 弱符号和强符号243.6 调试信息25第4章 静态链接254.1 空间与地址分配254.1.

3、2 相似段合并254.1.3 符号地址的确定264.2 符号解析与重定位264.2.2 重定位表264.2.3 符号解析274.2.4 指令修正方式274.3 COMMON块274.4.1 重复代码消除284.4.2 全局构造与析构294.4.3 C+与ABI294.5 静态库链接304.6 链接过程控制304.6.1 链接过程脚本304.6.2 最“小”的程序314.6.3 使用ld链接脚本314.6.4 ld链接脚本语法简介314.7 BFD库31第5章 WINDOWS PE/COFF315.1 Windows的二进制文件格式PE/COFF315.2 PE的前身COFF325.3 链接指示

4、信息325.4 调试信息325.5 大家都有符号表325.6 WINDOWS下的ELFPE32第6章 可执行文件的装载与进程336.1 进程的虚拟地址空间336.2 装载的方式336.2.1 覆盖装入336.2.2 页映射346.3 从操作系统的角度看可执行文件的装载346.3.1 进程的建立346.4 进程虚存空间的分布356.4.1 ELF文件链接视图和执行视图356.4.2 堆和栈366.4.3 堆的最大申请数量366.4.4 段地址对齐366.4.5 进程栈初始化376.5 Linux内核装载ELF过程简介376.6 Windows PE的装载38第7章 动态链接387.1 为什么要动

5、态链接387.2 简单的动态链接例子397.3 地址无关代码407.3.1 固定装载地址的困扰407.3.2 装载时重定位407.3.3 地址无关代码407.3.4 共享模块的全局变量问题427.3.5 代码段地址无关性437.4 延迟绑定(PLT)437.5 动态链接相关结构447.5.1 “.interp”段457.5.2 “dynamic”段457.5.3 动态符号表457.5.4 动态链接重定位表457.5.5 动态链接时进程堆栈初始化信息467.6 动态链接的步骤和实现467.6.1 动态链接器自举467.6.2 装载共享对象477.6.3 重定位和初始化477.6.4 Linux动

6、态链接器的实现477.7 显示运行时链接487.7.1 打开动态库487.7.2 dlsym()487.7.3 dlerror()487.7.4 dlclose()49第8章 Linux共享库的组织498.1 共享库版本498.1.1 共享库兼容性498.1.2 共享库版本命名498.1.3 SO-NAME程序需要记录什么508.2 符号版本508.2.1 基于符号的版本机制508.2.3 Linux中的符号版本518.3 共享库系统路径518.4 共享库的查找过程518.5 环境变量528.6 共享库的创建与安装528.6.1 共享库的创建528.6.3 共享库的安装538.6.4 共享库构

7、造和析构函数538.6.5 共享库脚本53第9章 Windows下的动态链接549.1 dll介绍549.1.2 基地址和RVA549.1.3 dll共享数据段549.1.4 dll的简单例子549.1.7 使用模块定义文件559.1.8 DLL显示运行时链接559.2 符号导出导入表559.2.1 导出表559.2.2 EXP文件569.2.4 导入表569.2.5 导入函数的调用569.3 DLL优化579.3.1 重定基地址579.3.2 序号589.3.3 导入函数绑定589.4 C+与动态链接589.5 DLL HELL59第4部分 库与运行库60第10章 内存6010.1 程序的内

8、存布局6010.2 栈与调用惯例6110.2.1 什么是栈6110.2.2 调用惯例6110.2.3 函数返回值传递6210.3 堆与内存管理6310.3.1 什么是堆6310.3.2 Linux进程堆管理6310.3.3 Windows进程堆管理6410.3.4 堆分配算法64第11章 运行库6411.1 入口函数和程序初始化6411.1.1 程序从main开始执行吗6411.1.2 入口函数是如何实现的6511.1.3 运行库与I/O6611.1.4 MSVC CRT的入口函数初始化6611.2 C/C+运行库6711.2.1 C语言运行库6711.2.2 C语言标准库6711.2.3 g

9、libc和MSVC CRT6711.3 运行库与多线程6811.3.1 CRT的多线程困扰6811.3.2 CRT改进6811.3.3 线程局部存储实现6811.4 C+全局构造和析构6911.4.1 glibc全局构造和析构6911.4.2 MSVC的全局构造和析构7011.5 fread的实现7111.5.1 缓冲7111.5.2 fread_s7111.5.3 _fread_nolock_s7111.5.4 _read7111.5.5 文本换行7111.5.6 fread回顾72第12章 系统调用与API7212.1 系统调用介绍7212.1.1 什么是系统调用7212.1.3 系统调用

10、的弊端7212.2 系统调用原理7312.2.2 基于INT的Linux的经典系统调用实现7312.2.3 Linux的新型系统调用机制7312.3 Windows API7312.3.1 Windows API概览7412.3.2 为什么要使用Windows API?74第13章 运行库的实现7413.1 C语言运行库74A.1 字节序74第一章 温故而知新第二节 万变不离其宗凡是单纯讲史的章节我全部略去。本节讲的主要是由CPU、内存和I/O之间速度不匹配而设计的硬件架构及其发展。这个就不用细说了CPU最快,内存次之,I/O更慢。由于CPU和内存速度还算接近,所以把CPU和内存算作一类,I/

11、O单独算作一类。当然这里说的I/O是指I/O设备,并不是操作。随着发展CPU频率越来越高,处理速度越来越快,内存跟不上节奏了,它们之间的I/O也出现了速度不匹配的问题。因为I/O设备可分为高速设备和低速设备两种,所以为高速搭配北桥,低速搭配南桥。它们之间的关系可用下图表示:CPU的频率只能达到4GHz无法提升,这是由CPU制造工艺决定的,是个瓶颈,目前还无法突破。一个CPU能力有限,那就让多个CPU共同工作提升效率。但是这样的CPU阵列各部件利用率不高,于是,发展出了多核心,其他部件共享的多核CPU设计。说白了,原来的CPU里面每个CPU一个核心,除此之外还有围绕这个核的其他部件。但是现在多核

12、CPU除了核心彼此独立外,其他的部件是共享的。这一节就这么点内容。第3节 站得高看得远从下图可以看出计算机的结构大概是这样的:最底层是硬件,它提供硬件规格描述。再往上是操作系统内核,它提供系统调用。再往上是运行库,它提供各种系统API。再往上就是各种系统软件了。这种设计具有上层屏蔽下层,上层提供接口的特点。这一节对接口的解释非常好。作者说接口是一种协议,协议二字比较贴切。当然这个协议不是计算机网络中的protocol。第4节 操作系统的功能有二。1、提供抽象接口。2、管理硬件。1.4.1 不要让CPU打盹操作系统经历了从多道程序设计、分时操作系统、到多任务操作系统等阶段。多道程序设计是指CPU

13、空闲的时候出让CPU以提高CPU利用率的设计;分时是指给每个程序固定的时间片执行,时间片一到就停止的设计,不过这个时间片是轮转着用的,不是一个程序用完了就没了;多任务就是现在操作系统设计了,程序以进程的方式存在。抢占:OS对程序执行具有绝对的控制权,OS依据一定标准判断该剥夺哪个程序的执行就剥夺,想让哪个程序执行就让哪个程序执行。1.4.2 设备驱动GDI和directX等都是硬件的抽象,是一个中间层,它们屏蔽了硬件的具体细节,提供了通用的操作接口。LBA(Logical Block Address):因为硬盘结构复杂,概念繁多,寻找一个扇区要经过很多步骤,这个比较麻烦。与其如此,不如干脆为每

14、个扇区配置一个逻辑编号,这样找扇区就好像是哈希算法一样快。1.5 内存不够怎么办?程序在内存中的地址空间是需要相互隔离的。这是为了防止一个程序在无意间修改其他程序造成意料之外的结果,另外,这也是为了信息安全。内存利用率要高,要不然程序在内存和硬盘之间进行I/O操作所花费的时间可就多了。程序运行的地址应该是确定的。因为多数程序指令跳转的目标地址是固定的,如果运行地址不确定就不能保证每次都在目标地址上运行,这就需要重定向进行调整,浪费时间。解决上述问题的办法是使用中间层,即把程序的运行地址与目标地址建立一种映射关系。1.5.1 关于隔离我们平时说的什么32位,64位CPU啥的都是指CPU的处理能力,从硬件的角度讲,即,计算机的地址总线的条数。从CPU的设计上讲就是CPU一次能够处理的二进制位数,而这个位数还有一个学名叫字长。内存的物理地址空间就是真实的内存空间,虚拟地址空间则是应用于进程的逻辑地址空间。1.5.2 分段我在想如何从16进制的差值一下

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 办公文档 > 总结/报告

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号