程序的编译,链接,运行和地址映射

匿名 (未验证) 提交于 2019-12-03 00:30:01
每一个进程在运行的时候,系统会为其分配一个以上构造的4G的虚拟地址空间:
3G为用户空间(私有)1G为内核空间(共享)
代码段:存放程序的执行代码,大小在运行前已经确定,也包含一些只读的常数变量,例字符串常量等。
数据段:存放程序中已初始化的全局变量(静态分配内存)。
堆区:用于存放进程运行中被动态分配的内存段,大小不固定,可动态扩张或缩减。
栈区:用于存放程序临时创建的局部变量,即函数括弧"{}"中定义的变量。

.o文件符号表里的符号,还没分配地址

3.链接过程
(1)所有.o文件的段进行合并,其中包含合并符号表,进行[符号解析]
符号解析:未定义的符号,找到其定义的地方
运行时:代码段、数据段

4.IA32体系虚拟地址映射
为什么不直接分配物理内存?
如果直接分配物理内存,有可能最终分配的地址被别人占用了
因为不知道哪块物理内存空闲。
第1次页面映射一定失败(在操作系统里)-->缺页异常
缺页异常处理完成之后-->重启地址映射-->成功
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!