我们可以把物理内存看成一个大数组,其中每个字节都可以通过与之唯—对应的地址进行访问,这个地址就是物理地址
在应用程序或操作系统运行过程中,CPU通过总线发送访问物理地址的请求,从内存中读取数据或者向其中写入数据
在引入虚拟内存后,应用程序使用虚拟地址访问存储在内存中的数据和代码,在程序运行过程中,CPU会把虚拟地址转换成物理地址,然后通过物理地址访问物理内存。虚拟地址转换成物理地址的过程通常被称为地址翻译。
MMU内存管理单元
实现虚拟内存需要进行虚拟地址和物理地址之间的切换,这样程序才能正常执行。
要转换就必须要转换机构,它相当于一个函数:p=f(v),其中输入虚拟地址 v,输出物理地址 p。
那么要怎么实现这个函数呢?
用软件方式实现太低效,用硬件实现没有灵活性,最终就用了软硬件结合的方式实现,它就是 MMU(内存管理单元)。MMU 可以接受软件给出的地址对应关系数据,进行地址转换,输出物理地址。
我们先来看看逻辑上的 MMU 工作原理框架图。如下图所示
1,代码位置
/kernel_platform/common-gki/mm/memory.c
参数说明:
SYSCALL_DEFINE0(fork) /SYSCALL_DEFINE5(clone)
-> kernel_clone
->copy_process
->copy_mm
->dup_mm
->mm_init
->mm_alloc_pgd
->pgd_alloc
上述过程中并没有给pgd分配内存,而是在进程创建的时候已经给每一个进程分配好了
remap_pud_range:
代码逻辑跟上面的alloc_pgd_range类似,但是这里多了下面一句代码, 它的作用就是分配红色框的4K内存,并初始化为PUD
2,抽象化简介
linux进程地址抽象化,例如32位系统,进程1认为自己有2的32次方=4GB虚拟空间
ttbrx用户页表及内核页表相关寄存器
Arm® Architecture Reference Manual-- Armv8, for Armv8-A architecture profile
MMU硬件单元
地址翻译
页表描述
AArch64页表描述符L0-L2 页表项格式
如果低2bit是11的话,说明是有效PTE,4K, 16K, 64K 页表的输出地址是不一样的
51~63是高位域属性, 11~2是低位属性,他们描述了L3页表项的一些属性
AP[2:1]bits[7:6]
数据访问权限位
AP[1]表示内存可以允许通过用户权限EL0和更高的EL1来访问,在linux中使用PTE_USER宏来表示可以在用户空间访问该页面
AP[2]表示只读权限和可读可写权限,linux中使用PTE_RDONLY宏来表示该标志位