概述
什么是虚拟内存?
IBM在解释虚拟内存的概念时用了四句话:
如果它存在,而且你能看到它,它是真实的;
如果它不存在,但是你能看到它,它是虚拟的;
如果它存在,但是你看不到它,它是透明的;
如果它不存在,而且你也看不到它,那肯定是你把它擦掉了。
在多任务操作系统中,每个进程都运行在属于自己的内存沙盘中。这个沙盘就是虚拟地址空间(Virtual Address Space),在32位模式下它是一个4GB的内存地址块。在Linux系统中, 内核进程和用户进程所占的虚拟内存比例是1:3,0~3G为用户空间,3G~4G为内核空间。而Windows系统为2:2,0~2G为用户空间,2G~4G为内核空间(通过设置Large-Address-Aware Executables标志也可为1:3)。这并不意味着内核使用那么多物理内存,仅表示它可支配这部分地址空间,根据需要将其映射到物理内存。
虚拟地址通过页表(Page Table)映射到物理内存,页表由操作系统维护并被处理器引用。内核空间在页表中拥有较高特权级,因此用户态程序试图访问这些页时会导致一个页错误(page fault)。在Linux中,内核空间是持续存在的,并且在所有进程中都映射到同样的物理内存。内核代码和数据总是可寻址,随时准备处理中断和系统调用。与此相反,用户模式地址空间的映射随进程切换的发生而不断变化,操作系统会为每个进程分配4G的虚拟地址空间。
Linux虚拟地址空间的分布如下图:
现在来分别介绍各段:
.text段
代码段也称正文段或文本段,通常用于存放程序执行代码(即CPU执行的机器指令)。一般C语言执行语句都编译成机器代码保存在代码段。通常代码段是可共享的,因此频
最后
以上就是想人陪泥猴桃为你收集整理的Linux虚拟地址空间分布的全部内容,希望文章能够帮你解决Linux虚拟地址空间分布所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复