虚拟地址空间2

虚拟地址空间的分区

分区区间
空指针赋值区0x00000000~0x0000FFFF
用户可使用的分区0x00010000~0x7FFEFFFF
64KB禁入分区0x7FFF0000~0x7FFFFFFF
内核分区0x80000000~0xFFFFFFFF

物理存储器和虚拟地址之间的映射方向

需要先明确一点: 系统是把物理存储器 映射到 一个虚拟地址,而不是把虚拟地址映射到一个物理存储器

相关名词

  • 预定: 表示用户程序将要使用某一块虚拟地址空间
  • 调拨: 将一块物理存储空间映射到这块虚拟地址

页交换文件

  • 很多时候,我们觉得一个程序可用的内存总量取决于物理内存的大小。
    实际并不是这样,一个程序的可用内存大小取决于 页交换文件的大小。
    虽然有些难以理解,但是,物理存储器可以看作时页交换文件中的一部分。
  • 每一块物理内存都有对应的页交换文件,虚拟内存其实是虚拟地址空间和页交换文件的映射
  • 当系统释放一页物理内存的时候,如果这一页物理内存没有被修改过,我们是可以直接释放的
  • 操作系统维护了每一个进程的虚拟地址对应的物理内存地址或是对应的页交换文件的地址

程序的加载

当系统加载一个程序时,程序的指令和数据并不是直接就加载到内存中的,而是经过页交换文件,也就是说,每一个程序都会被加载到页交换文件中。

内存映像文件

  • 为什么一个.exe文件被叫做内存映像文件?
    当系统加载一个exe文件的时候,原始的exe文件会被用来充当页交换文件,而页交换文件可以被看作是内存。

页面属性

  • 一共有8个页面属性,这里只介绍PAGE_WRITECOPY这个属性,当一个页面处于PAGE_WRITECOPY属性时,程序对这个页面进行写入操作时,会先复制一份该页面的副本,并将数据写入副本中.

物理存储器

  • 内存,页交换文件,可执行文件都是物理存储器
  • 同时,我们往预定区域映射的就是物理存储器,注意一般不会直接映射到

地址空间中的各种区域

区域的类型
  • Free 未预定的状态
  • Mapped 使用内存映射到这个区域
  • Private 使用页交换文件映射到这个区域
  • Image 使用镜像文件映射到这个区域
区域的基地址
  • 所有区域都有一个基地址和大小

分页内存和非分页内存

  • 当访问的内存地址空间不在物理内存上时,会产生缺页中断
  • 中断是有优先级之分的
  • 在一个高优先级得中断处理函数中, 低优先级的中断是无法产生的,
    所以在一些情况下,却也中断可能无法产生,导致一些中断处理程序无法访问想要访问的内存
  • 结论: 在高优先级的中断处理函数中,不应该使用分页内存,而是要使用非分页内存
  • 通过下面的代码来指定分页内存和非分页内存
#define PAGEDCODE   code_seg("PAGE"); // 分页内存,可以交换到文件中
#define LOCKEDCODE  code_seg();           // 非分页内存,禁止交换到文件中
#define INITCODE    code_seg("INIT");       // 初始化的时候载入内存,然后可以从内存中卸载掉
#define PAGEDDATA   data_seg("PAGE");
#define LOCKEDDATA  data_seg();
#define INITDATA    data_seg("INIT");
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值