linux内核-页表相关

我们可以把物理内存看成一个大数组,其中每个字节都可以通过与之唯—对应的地址进行访问,这个地址就是物理地址

在应用程序或操作系统运行过程中,CPU通过总线发送访问物理地址的请求,从内存中读取数据或者向其中写入数据

在引入虚拟内存后,应用程序使用虚拟地址访问存储在内存中的数据和代码,在程序运行过程中,CPU会把虚拟地址转换成物理地址,然后通过物理地址访问物理内存。虚拟地址转换成物理地址的过程通常被称为地址翻译。

MMU内存管理单元
实现虚拟内存需要进行虚拟地址和物理地址之间的切换,这样程序才能正常执行。

要转换就必须要转换机构,它相当于一个函数:p=f(v),其中输入虚拟地址 v,输出物理地址 p。

那么要怎么实现这个函数呢?
用软件方式实现太低效,用硬件实现没有灵活性,最终就用了软硬件结合的方式实现,它就是 MMU(内存管理单元)。MMU 可以接受软件给出的地址对应关系数据,进行地址转换,输出物理地址。

我们先来看看逻辑上的 MMU 工作原理框架图。如下图所示

1,代码位置

/kernel_platform/common-gki/mm/memory.c

参数说明

1. vma :进程地址空间数据结构
2. addr 用户空间的映射目的地址
3. PFN :要映射的物理内存页帧号
4. size :要映射的大小
5. prot :映射属性
右移 page_shift 12bit 后,得到物理页帧号

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 页表项格式

如果低2bit11的话,说明是有效PTE4K, 16K, 64K 页表的输出地址是不一样的

51~63是高位域属性,   11~2是低位属性,他们描述了L3页表项的一些属性

AP[2:1]bits[7:6]

数据访问权限位

AP[1]表示内存可以允许通过用户权限EL0和更高的EL1来访问,在linux中使用PTE_USER宏来表示可以在用户空间访问该页面

n 1: 表示可以在 EL0 以及更高权限访问
n 0 :表示不能通过 EL0 访问,但是可以在 EL1 访问

AP[2]表示只读权限和可读可写权限,linux中使用PTE_RDONLY宏来表示该标志位

n 1 :表示只读
n 0 :表示可读,可写

参考链接

对内存的一些理解_2的64次方是多少gb-CSDN博客

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值