加入收藏 | 设为首页 | 会员中心 | 我要投稿 济南站长网 (https://www.0531zz.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 服务器 > 搭建环境 > Linux > 正文

linux系统编程基础(五) Linux进程地址空间和虚拟内存

发布时间:2016-09-24 23:57:47 所属栏目:Linux 来源:站长网
导读:一、虚拟内存 先来看一张图(来自《Linux内核完全剖析》),如下: 分段机制:即分成代码段,数据段,堆栈段。每个内存段都与一个特权级相关联,即0~3,0具有最

当程序试图访问线性地址空间上的一个地址位置时,发生以下操作:

if(数据在物理内存中)
{
    虚拟地址转换成物理地址
    读数据
}
else
{
    if(数据在磁盘中)
    {
        if(物理内存还有空闲)
        {
            把数据从磁盘中读到物理内存
            虚拟地址转换成物理地址
            读数据
        }
        else
        {
            把物理内存中某页的数据存入磁盘
            把要读的数据从磁盘读到该页的物理内存中
            虚拟地址转换成物理地址
            读数据
        }
    }
    else
    {
        报错
    }
}

其中MMU负责虚拟地址到物理地址的转换工作,分段和分页操作都使用驻留在内存中的段表和页表来指定他们各自的交换信息。如果用户程序想要访问一个虚拟地址,经MMU检查无权访问(特权级),MMU产生一个异常,CPU从用户模式切换到特权模式,跳转到内核代码中执行异常服务程序,内核把这个异常解释为段错误,把引发异常的进程终止掉。

二、linux进程地址空间

由前面可得知,进程有4G的寻址空间,其中第一部分为“用户空间”,用来映射其整个进程空间(0x0000 0000-0xBFFF FFFF)即3G字节的虚拟地址;第二部分为“系统空间”,用来映射(0xC000 0000-0xFFFF FFFF)1G字节的虚拟地址。如下图

linux系统编程基础(五) Linux进程地址空间和虚拟内存

(编辑:济南站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

热点阅读