内存映射原理

一、物理地址
物理地址是处理器在系统总线上看到的地址,使用RISC的处理器通常只实现一个物理地址空间,外围设备和物理内存使用统一的物理地址空间,有些处理器架构把分配给外围设备的物理地址区域称为设备内存
处理器通过外围设备控制器的寄存器访问外围设备,寄存器分为控制寄存器状态寄存器数据寄存器三大类。外围设备的寄存器通常被连续地编址,处理器对外围设备寄存器编址方式分为两种:I/O映射方式(I/O-mapped),内存映射方式(memory-mapped)。
应用程序只能通过虚拟地址访问外设寄存器,内核提供API函数来把外设寄存器的物理地址映射到虚拟地址空间。
ARM64(物理地址宽度最大支持48位)分为两种内存类型:
正常内存(Normal Memory):包括物理内存和只读存储器(ROM);
设备内存(Device Memory):指分配给外围设备寄存器的物理地址区域。
设备内存共享属性总是外部共享,缓存属性总是不可缓存(必须绕过处理器的缓存);
二、内存映射的原理
创建内存映射时,在进程的用户虚拟空间中分配一个虚拟内存区域,内核采用延迟分配物理内存策略,在进程第一次访问虚拟页的时候,产生缺页异常,如果是文件映射,那么分配物理页,把文件指定的数据读到物理页中,然后在页表中把虚拟页映射到物理页。如果是匿名映射,就分配物理页,然后在页表中把虚拟页映射到物理页。
三、内存映射即在进程的虚拟地址空间中创建一个映射,分为两种:
1.文件映射:文件支持的内存映射,把文件的一个区间映射到进程的虚拟地址空间;映射和实际文件相关联,通常是把文件的内容映射到进程的地址空间,这样应用程序就可以像操作进程地址空间一样读写文件。
2.匿名映射:没有文件支持的内存映射,把物理内存映射到进程的虚拟空间,没有数据源;没有对应的相关文件,这种映射的内存区域会被初始化为0.
两个进程可以使用共享的文件映射实现共享内存,匿名映射通常是私有映射,共享的匿名映射只可能出现在父进程和子进程之间。在进程的虚拟地址空间中,代码段和数据段是私有的文件映射,未初始化的数据段、堆栈是私有的匿名映射。
修改过的脏页面不会立即更新到新文件中,可以调用msync来强制同步写入文件。(脏页:能直接修改硬盘上的数据,而是先将数据从硬盘读入到内存的data cache,然后在内存中修改(被修改过的页称为脏数据页),最后再从内存回写到硬盘。下述进程都可能将脏页回写到硬盘。)

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

<( ̄︶ ̄)Okay.

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值