1 前言
linux内存管理是一个很大的节目。要想研究个透亮,不是个容易的事情。
对于很多书上所说,896是直接映射区,可以简单的加减操作就能知道实际物理地址,关于这点下面是几点思考。
而内核开启了mmu,从cpu出去的地址都是虚拟地址,通过mmu映射到不同的物理地址上。
这两点如何统一理解呢?
2 相关理解
virt_to_phys() 和 phys_to_virt() 是两个函数,用于896MB以下低端内存的虚拟地址和物理内存地址之间进行换算。物理地址从0开始计算,内核地址从3g处开始计算。
关于函数的计算公式:va= pa+0xc0000000(pageoffset)。物理地址从0开始。
在许多核心架构里,总线上的ram地址不一定是从0开始的,内核有一个宏用于解决此问题:phys_offset.
内核初始化的时候会创建永久的896空间的页表,在初始化函数里手动计算896空间的页表。计算关系:va=pa-phys_offset+pageoffset。

此后访问空间速度极快,省去了查表计算的损耗,只需要加减偏移就能得到物理地址。
由于896直接映射是永固内存,所以不会触发fagefault,自然也就不会出现延迟需要休眠等场景。
实现了既要也要的需求:使用了mmu隔离物理内存的需求,分页模式访问物理内存;也实现几乎是直接访问物理内存的畅快。
我要赚赏金
