个人浅显地认为在编程活动的整个过程中,至少要对程序的2个模型有完整的了解,一个是内存模型,另一个是线程模型。线程模型可以看看多线程编程书籍了解,但是内存模型就复杂了。
想要了解程序的内存模型,就得从编译和链接开始了,以windows为例,程序对每个源文件生成一个obj文件,每个obj文件内部包含代码段和数据段以及重定位段,因为有些变量和函数可能引用自其他文件,需要在链接的时候对其地址进行重定位,这些信息保存在重定位段。静态库是obj文件的一个组合,当最终生成exe的时候(静态链接),链接器重新生成代码段和数据段,exe程序有一个默认的加载地址,所以程序的起始虚拟地址是固定的,这样代码的和数据段的虚拟地址同样也是固定的,所以可以分析exe文件的数据段和代码的基本可以分析出程序运行的地址分布。
如果用到dll动态链接库,又有不同了,windows中引入了导入导出表,需要在程序运行的时候进行重定位地址表,linux引入了地址无关的代码。
程序运行是操作系统加载exe到相应的地址空间,将运行权转交给C运行时库,C库开始一些初始化等工作,然后调用main。
还有堆怎么分配,栈数据如何分配运行,虚拟地址空间怎么预留,操作系统占用的地址空间,函数参数怎么入栈,怎么出栈,C++的全局构造函数何时调用等一系列的问题需要去分析解决。
推荐一本书《程序员的自我修养》,这本书介绍了以上你想要理解的全部内容,但是也有瑕疵,技术方面虽然解析的挺好,但是明显的废话太多(有点像写论文凑字数),一些词句表达明显不通顺,后来发现两个作者是在校研究生,且不必过分要求。