虚拟地址映射到物理地址的学习(linux篇)

linux内核采用页式存储管理。虚拟地址空间划分为固定大小的页面。由MMU在运行时将虚拟地址映射成(或者说转换成)某个物理内存页面中的地址。如图所示:

与段式存储管理相比,页式存储管理有很多好处。

1.页面都是固定大小的,便于管理;

2.要将一部分物理地址的空间的内容转换到磁盘上的时候,在段式存储管理中要将整个段(通常来说很大)都换出来,而在页式管理中则是按页进行的,效率要高很多。

linux内核设计的段式映射机制把地址0x08049768映射到了其自身后,现在作为线性地址出现了,然后才进入页式映射的过程。每个进程都有其自身的页面目录PGD,指向这个目录的指针保持在每个进程的mm_struct数据结构中。每当调度一个进程进入运行的时候,内核都要为即将运行的进程设置好寄存器CR3,而MMU的硬件则总是从CR3中取得指向当前页面目录的指针,但cpu在执行程序的时候使用的是虚拟地址,而MMU硬件在进行映射时所用的则是物理地址。//这些都是在inline函数switch_mm()中完成的。

在页面映射的过程中,cpu要访问内存三次,第一次是页面目录,第二次是页面表,第三次才是访问真正的目标,所以虚逆内存的高效实现有赖于高速缓存(cache)的实现。

第一次地址映射会失败,=》缺页异常,MMU重启映射,缺页异常处理,完成后再次进行物理内存的分配,进行二次映射。

 缺页异常:CPU通过地址总线可以访问连接在地址总线上的所有外设,包括物理内存、IO设备等等,但从CPU发出的访问地址并非是这些外设在地址总线上的物理地址,而是一个虚拟地址,由MMU将虚拟地址转换成物理地址再从地址总线上发出,MMU上的这种虚拟地址和物理地址的转换关系是需要创建的,并且MMU还可以设置这个物理页是否可以进行写操作,当没有创建一个虚拟地址到物理地址的映射,或者创建了这样的映射,但那个物理页不可写的时候,MMU将会通知CPU产生了一个缺页异常。

推荐给大家一本书:《linux内核源代码情景分析》第二章有详细的虚拟地址映射的过程;


  • 0
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在64位Linux系统中,物理地址通常是指硬件设备上的内存地址,而虚拟地址则是指进程所使用的内存地址。虚拟地址与物理地址之间的映射关系是通过操作系统的内存管理单元来实现的。以下是物理地址虚拟地址之间的映射关系: 1. 页表映射:Linux中的虚拟内存被分割成一系列的固定大小的页,每个页大小通常是4KB。每个进程都有自己的页表来记录虚拟页和物理页之间的映射关系。当进程访问一个虚拟地址时,操作系统会查找页表,找到对应的物理页,并将虚拟地址映射物理地址上。 2. 多级页表映射:为了减小页表的大小,Linux采用了多级页表映射的方式。在多级页表映射中,虚拟地址被分割成多个部分,每个部分对应一个页表。这样,每个页表只需要记录一部分的虚拟页和物理页之间的映射关系,从而减小了页表的大小。 3. 全局页表映射:为了提高内存访问效率,Linux还采用了全局页表映射的方式。在全局页表映射中,内核会将所有进程的页表映射到同一组物理页上,这些物理页被称为内核页表。这样,多个进程之间共享同一份内核页表,可以减少内存访问时的开销。 总的来说,物理地址虚拟地址之间的映射关系是通过操作系统的内存管理单元来实现的,具体的实现方式包括页表映射、多级页表映射和全局页表映射等。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值