《程序员自我修养》 笔记
温故而知新
平坦内存模型存在的问题
分段
分页
线程 与 进程
线程的私有空间
预处理,编译,汇编,链接
静态链接
目标文件(ELF格式)
文件内容
强符号 与 弱符号
符号修饰
extern
地址和空间分配 + 重定位和符号决议 = 链接
main 函数之前和之后的内容
初始化进程环境,堆分配初始化,传递main 的参数,全局变量的初始化等。 .init 段: .fini 段:
可执行文件的装载与进程
32位平台下的4G内存空间,1GB内核,1GB用户态。
加载方式-页映射
进程的建立
页错误
进程装载细节
堆栈分配
堆内存分配方式
从操作系统角度来看,进程分配内存有两种方式,分别由两个系统调用完成:brk()和mmap()(不考虑共享内存)。
1、brk是将数据段(.data)的最高地址指针_edata往高地址推;
2、mmap是在进程的虚拟地址空间中(堆和栈中间,称为文件映射区域的地方)找一块空闲的虚拟内存。
这两种方式分配的都是虚拟内存,没有分配物理内存(不准确,系统调用会执行内核函数,分配内存),在第一次访问已分配的虚拟地址空间的时候,发生缺页中断,操作系统负责分配物理内存,然后建立虚拟内存和物理内存之间的映射关系。