首页 > 其他分享 >深入理解虚拟 物理地址转换,页表--基于ARMV8

深入理解虚拟 物理地址转换,页表--基于ARMV8

时间:2024-05-25 20:34:26浏览次数:27  
标签:PGD -- 39 物理地址 地址 页表 ARMV8 bit 目录

1. 页表转换寄存器描述符

1.1,页表/页目录结构

基于前言中的内核配置,内核采用39位虚拟地址,因此可寻址范围为2^39 = 512G,采用(linux 默认为五级页表,另外还有PUD,P4D,由于本文只配置三级,其他两项不予罗列)3级页表结构,分别为:

    PGD   (Page Global Directory)                    bit[39:30]      level1

    PMD   (Page Middle Directory)                    bit[30:21]     level2

    PTE    (Page Table)                              bit[21:12]      level3

每一级索引占9bit,也就是每一个页目录表/页表都有29=512个页目录项/页表项,使用4k页面大小,212 = 4096,因此虚拟地址中offset字段占12位,每一个pte页表项可以映射4k个地址空间,共有512x512x512个pte页表项,总的可寻址地址空间为 512x512x512x4096 = 2^39 = 512Gb。

每一个页表项占用8个字节,每一张页表有512项,所以一张页表占用空间为512*8=4K,因此页表的基地址都是4k对齐的,也就是页表基地址的低12位都为0;

内核页表相关重要宏控,相信你仔细看过第三节的实例之后,对这些宏控都会有清晰得理解!!

pgd_offset(mm,addr)          ---接受内存描述符mm,和一个虚拟地址作为参数,这个宏产生addr在页全局目录在相应表项中的线性地址
pgd_offset_k(addr)           ---用来产生内核页全局目录在相应表项中的线性地址
pgd_index(addr)              ---从addr中提取页全局目录表项的索引
 
pmd_index(addr)              ---从addr中提取页中间目录表项的索引
pmd_offset(pud,addr)         ---接受页上级目录指针,和虚拟地址作为参数,这个宏产生目录项addr在页中间目录项中的偏移地址
 
pte_index(addr)              ---从addr中提取页中间目录表项的索引
pge_offset_kernel(dir,addr)  ---线性地址addr在页中间目录dir中有一个对应项,该宏就产生这个对应项,即页表的线性地址

2. 转换相关寄存器描述符

2.1 转换基址寄存器

TTBR1 :(Translation Table Base Register)转换表基地址寄存器,用来存放内核(init_mm.pgd)PGD全局转换表的基地址;

TTBR0 :(Translation Table Base Register)转换表基地址寄存器,用来存放用户(task_struct.mm.pgd)PGD全局转换表的基地址;

2.2 转换描述符格式

armv8规定,所有页级别都是用同一个描述符格式,PGD只能输出下一级目录表的基地址。PTE描述符不能指向另一个表的基地址,只能输出块地址。那么反过来PMD,PUD是可以直接输出地址块的,也就是直接指向一个块地址,下一级页表就不会再被映射,这种情况我们称之为巨页,

pte 映射   页大小=4k    2^12

pmd 映射 页大小=2m    2^(12+9)

pud映射  页大小=1G     2^(12+9+9)

image

如上图是一个48bit地址的例子,可以看出来,其D_Block在各个页表中的映射块大小,也可以在附录2 表的第三列看到这种情况,这里我们的描述以实例只针对pte的映射,也就是页大小4k。

所有页目录/页表项描述符由低bit[1:0]位指出,有以下三种情况:

a,下一级表的地址,在这种情况下,内存可以进一步细分为更小的块(页表级数越多,pte映射的页大小就越小)。

b,可变大小的内存块的地址(如果为块地址,其还需要加上va[offset]才能构成物理地址,所以称可变大小)。

c,可以标记为Fault或Invalid(无效条目)。

image

当bit[1:0]={0,1}时,为block entry ,其中间部分为物理地址的高位PA[39:12] ;

当bit[1:0]={1,1}时, 为table entry,其中间部分[39:12]为下一级页表的物理基地址;

当bit[1:0] = {1,0|0,0}时,该表项为无效项;

转换表描述符中lower attributes中存储相关属性信息,mmu在查找到相应的表项时,首先会查询属性信息,确认地址的相关属性(可执行权限,访问权限,共享属性,访问标志,安全标志等)后,根据需要取出下一级页表的基地址。

2.3 用户/内核PGD表基地址

基于之前的分析可知,用户虚拟地址和内核虚拟地址转换为物理地址的时候使用不同的页表基地址寄存器(TTBRx),因此他们的转换是基于不同的全局页目录表PGD。

其中内核全局页目录表PGD存储在init_mm.pgd中,我们知道内核是常驻内存的,因此内核的PGD表只有一份,他不会因为进程的切换而改变,所有内核地址访问都依赖这一个PGD表;用户全局页目录表PGD存储在进程描述符task_struct.mm.pgd中,他是在用户进程被创建时同步被创建的,每一个进程描述符task_struct都对应有自己的task_struct.mm.pgd表,进程所有地址的访问都依赖于对应的task_struct.mm.pgd页表的查询,因此在进程切换时,TTBR0中的值(task_struct.mm.pgd)是要同时改变的,这也与linux中每一个进程都独占整个虚拟(此为512G)地址空间相对应;

三、转换流程

据此可以画出如下转换框图:

image

MMU在转换虚拟地址的时候遵循以下步骤(基于以上配置):

1,如果虚拟地址bit[63:40]都为1,则使用TTBR1作为第一级页目录表基地址,当bit[63:40]都为0时,使用TTBR0作为第一级页目录表基地址;

2,PGD包含512个64位PMD表,从虚拟地址中获取VA[39:31]进行索引,找到对应条目为PGD+index[39:31]);

4,MMU检查PGD目录项的有效性(bit[1:0]),以及其属性标志判断是否允许请求的内存访问。假设它有效,且允许访问内存;

5,MMU从PGD目录表项中获取bit[39:12],作为PMD页表的物理基址(table descriptor)。

6,PMD包含512个64位PTE表,从虚拟地址中获取VA[30:21]进行索引,PMD+(index[30:21]8),MMU从PMD表项中读取PTE表的基地址;

7,MMU检查PMD目录项的有效性(bit[1:0]),以及其属性标志判断是否允许请求的内存访问。假设它有效,且允许访问内存;

8,pmd目录表项中获取bit[39:12],作为pte页表的物理基基址,

9,pte指向一个4k的页(page descriptor),mmu获取pte的bit[39:12]作为最终物理地址的pa[39:12];

10,取出va[11:0]作为pa[11:0],然后返回完整的PA[39:0],以及来自页表项的附加信息。

基于4K page大小的一个完整的转换过程,如下图 ​​​​:

image

标签:PGD,--,39,物理地址,地址,页表,ARMV8,bit,目录
From: https://www.cnblogs.com/linhaostudy/p/18212969

相关文章

  • Epson 机器人远程以太网控制软件
    Epson机器人远程以太网控制软件Epson控制台是一款功能强大的远程以太网控制软件,专为工业机器人操作而设计。无论是在制造业、物流行业还是科研教育领域,这款软件都能帮助您实现对机器人系统的远程控制和管理。核心功能1.便捷的TCP/IP连接通过设置IP地址和端口号,用户......
  • 1
    <linkrel="dns-prefetch"href="https://fonts.gstatic.com"><linkrel="preconnect"href="https://fonts.gstatic.com"crossorigin><linkhref="https://fonts.googleapis.com/css2?family=Bitter:ital,wg......
  • Pandas合并操作——《Python数据分析库Pandas》
    Pandas合并操作——《Python数据分析库Pandas》Pandas合并操作使用`merge`方法进行数据合并使用`concat`方法进行数据堆叠使用`join`方法进行列连接`merge`方法的更多选项`concat`方法的轴参数`join`方法与`merge`方法的比较性能考虑总结Pandas合并操......
  • 大数据扫盲,Hive相关知识收集整理!
    大数据扫盲,Hive相关知识收集整理!原创蚂蚁蚂蚁学Python2024-05-2510:51北京14人听过Hive是什么?ApacheHive是一个数据仓库软件项目,用于在Hadoop上读取、写入和管理大型数据集。它为结构化数据存储在Hadoop分布式文件系统(HDFS)上提供了一种工具,可以将SQL查询转换成MapReduc......
  • linux:常用工具 yum vim git gbd
    linux操作系统如果最小化安装是很难使用的,所以需要很多工具进行扩展,这些扩展网上有很多,同时也是给了用户很多选择,但是并不是所有的程序都是可靠的,安卓和windows都是需要去有官方认证的平台下载安全的应用使用,而linux也是有不同的发行版本的团队整理的可靠的安装包使用,......
  • 【编译原理】LL(1)预测分析法
    一、实验目的LL(1)的含义:第一个L表明自顶向下分析是从左向右扫描输入串,第2个L表明分析过程中将使用最左推导,1表明只需向右看一个符号便可决定如何推导,即选择哪个产生式进行推导。LL(1)预测分析方法是确定的自顶向下的语法分析技术。本次实验的主要目的就是要加深对LL(1)预测......
  • Pandas连接操作——《Python数据分析库Pandas》
    Pandas连接操作——《Python数据分析库Pandas》Pandas连接操作内连接(InnerJoin)左连接(LeftJoin)右连接(RightJoin)外连接(OuterJoin)总结Pandas连接操作Pandas是一个强大的Python数据分析库,它提供了丰富的数据结构和数据操作工具,使得数据处理变得简单......
  • idea中Debug奇淫巧技
    条件断点用途:在for循环指定条件下,暂停字段赋值追踪用途:在debug模式下,可以定位到修改指定字段的代码语句定位到光标处用途:debug语句直到光标处调用回退用途:在debug模式下,返回到调用该方法处捕获异常用途:在debug模式下,如果抛出指定的异常,会在抛出异常处暂停......
  • 软件工程——内聚性和耦合性
    一、耦合性耦合性指软件结构中模块相互紧密连接的紧密程度。耦合性由高到低分别为:内容耦合、公共耦合、外部耦合、控制耦合、标记耦合、数据耦合、非直接耦合。1.内容耦合:一个模块直接访问另一个模块的内部数据;一个模块不通过正常入口转到另一模块的内部;一个模块有多个......
  • Pandas分类对象——《Python数据分析库Pandas》
    Pandas分类对象——《Python数据分析库Pandas》Pandas分类对象分类对象的创建分类对象的属性和方法分类对象的应用场景示例:使用分类对象进行数据分析总结Pandas分类对象Pandas分类对象(Categorical)是Pandas库中一种用于处理分类数据的数据类型。分类数据......