TLB内存页表 - LoongArch

news2024/11/16 15:34:12

TLB内存页表 - LoongArch

文章目录

  • TLB内存页表 - LoongArch
    • 页表操作指令
    • TLB相关寄存器
    • 页表格式
    • CpuSetAttributes
      • UEFI Memory attribute

页表操作指令

LDDIR: 用于软件页表遍历过程中目录项的访问.
LDPTE: 用于在软件页表遍历过程中页表项的访问.
INVTLB: 用于无效TLB中的内容.
TLBFILL: 用于将页表项信息填入TLB中.

TLB相关寄存器

CSR 0x88: TLBRENTRY TLB重填例外入口地址.
CSR 0x8b: TLBRSAVE TLB重填例外数据保存.
CSR 0x8c, 0x8d, 0x8e TLBRLO TLBRHI (设置PS与硬件获取BADV) TLB重填例外表项.
CSR 0x19, 0x1a: PGDL PGDH 地址空间全局目录基址.
CSR 0x1b: PGD 全局目录基址 (只读).
CSR 0x1c, 0x1d: PWCL PWCH 页表遍历控制(控制多级页表索引).

页表格式

PGD->PUD->PMD->PTE:
在这里插入图片描述

CpuSetAttributes

  • 1 初始化PageSize,一般通常页大小采用4K.
 ASM_PFX(WriteCsrTlbRefillPageSize):                                                                                               
    li.d    T0, CSR_TLBREHI_PS_SHIFT
    sll.d   A0, A0, T0
    li.d    T0, CSR_TLBREHI_PS
    csrxchg A0, T0, LOONGARCH_CSR_TLBREHI
    jirl    ZERO, RA,0
  • 2 将LDDIR,LDPTE,TLBFILL 的页表查找填充处理函数作为TLB异常入口进行设置.
ASM_PFX(HandleTlbRefill):                                                                                                         
  csrwr T0, LOONGARCH_CSR_TLBRSAVE
  csrrd T0, LOONGARCH_CSR_PGD
  lddir T0, T0, 3   #Put pud BaseAddress into T0
  lddir T0, T0, 2   #Put pmd BaseAddress into T0
  lddir T0, T0, 1   #Put pte BaseAddress into T0
  ldpte T0, 0
  ldpte T0, 1
  /*refill hi,lo0,lo1*/
  tlbfill
  csrrd T0, LOONGARCH_CSR_TLBRSAVE
  ertn
HandleTlbRefillEnd:

  • 3 根据阶段不同,需要将异常处理函数进行二次内存分配拷贝,防止前期代码执行的内存被释放.
  TlbReEntry = AllocatePages (1);
  if (TlbReEntry == NULL) {
    goto FreeTranslationTable;
  }
  CopyMem ((char *)TlbReEntry, HandleTlbRefill, (HandleTlbRefillEnd - HandleTlbRefill)); 
  • 4 根据PWC来设置页表格式. 控制PGD,PUD, PMD, PTE的多级页表宽度,关于多级页表的组成有时间详细来计算.
  LoongArchWriteqCsrPwctl0 ((PteShift | PteWide << 5 | PmdShift << 10 | PmdWide << 15 | PudShift << 20 | PudWide << 25));
  LoongArchWriteqCsrPwctl1 (PgdShift | PgdWide << 6);
  • 5 设置PGD页表的目录项供页表遍历的异常处理获取内存页表地址.
  LoongArchWriteqCsrPgdl ((UINTN)SwapperPageDir);
  LoongArchWriteqCsrPgdh ((UINTN)InvalidPgd); 
  • 6 根据页表格式与多级页表硬件遍历方式采用软件遍历的方式进行初始化或替换页表,例:设置某些内存或io属性以及执行权限等.
  /*Page table property definitions */
 #define  PAGE_VALID_SHIFT    0
 #define  PAGE_DIRTY_SHIFT    1
 #define  PAGE_PLV_SHIFT      2  /* 2~3, two bits */
 #define  CACHE_SHIFT         4  /* 4~5, two bits */
 #define  PAGE_GLOBAL_SHIFT   6
 #define  PAGE_HUGE_SHIFT     6  /* HUGE is a PMD bit */
 
 #define  PAGE_HGLOBAL_SHIFT  12 /* HGlobal is a PMD bit */
 #define  PAGE_PFN_SHIFT      12
 #define  PAGE_PFN_END_SHIFT  48
 #define  PAGE_NO_READ_SHIFT  61
 #define  PAGE_NO_EXEC_SHIFT  62
 #define  PAGE_RPLV_SHIFT     63
  • 7 打开MMU接管地址空间.

以上简述是针对UEFI下CpuSetAttributes接口的底层实现,为了追加内存读写执行保护以及内存CACHE或UNCACHE属性切换所叙述的MMU处理流程.

UEFI Memory attribute

   //
   // Memory cacheability attributes
   //
   #define EFI_MEMORY_UC               0x0000000000000001ULL
   #define EFI_MEMORY_WC               0x0000000000000002ULL
   #define EFI_MEMORY_WT               0x0000000000000004ULL
   #define EFI_MEMORY_WB               0x0000000000000008ULL
   #define EFI_MEMORY_UCE              0x0000000000000010ULL
   //
   // Physical memory protection attributes
   //
   // Note: UEFI spec 2.5 and following: use EFI_MEMORY_RO as write-protected physical memory
   // protection attribute. Also, EFI_MEMORY_WP means cacheability attribute.                                                       
   //
   #define EFI_MEMORY_WP               0x0000000000001000ULL
   #define EFI_MEMORY_RP               0x0000000000002000ULL
   #define EFI_MEMORY_XP               0x0000000000004000ULL
   #define EFI_MEMORY_RO               0x0000000000020000ULL
   //   

根据EFI标准去转换自身架构的内存管理机制:

  /*Page table property definitions */
  #define  PAGE_VALID_SHIFT    0
  #define  PAGE_DIRTY_SHIFT    1
  #define  PAGE_PLV_SHIFT      2  /* 2~3, two bits */
  #define  CACHE_SHIFT         4  /* 4~5, two bits */
  #define  PAGE_GLOBAL_SHIFT   6
  #define  PAGE_HUGE_SHIFT     6  /* HUGE is a PMD bit */
  
  #define  PAGE_HGLOBAL_SHIFT  12 /* HGlobal is a PMD bit */
  #define  PAGE_PFN_SHIFT      12
  #define  PAGE_PFN_END_SHIFT  48
  #define  PAGE_NO_READ_SHIFT  61
  #define  PAGE_NO_EXEC_SHIFT  62
  #define  PAGE_RPLV_SHIFT     63

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/354932.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Mybatis源码分析:Mybatis的数据存储对象

前言&#xff1a;SQLSession是对JDBC的封装 一&#xff1a;SQLSession和JDBC的对照说明 左边是我们的客户端程序&#xff0c;右边是我们的MySQL数据仓&#xff0c;或者叫MySQL实例 Mybatis是对JDBC的封装&#xff0c;将JDBC封装成了一个核心的SQLSession对象 JDBC当中的核心对…

2023年浙江理工大学MBA招生考试初试成绩查询及复查的通知

根据往年的情况&#xff0c;2023浙江理工大学MBA考试初试成绩可能将于2月21日下午两点公布&#xff0c;为了广大考生可以及时查询到自己的分数&#xff0c;杭州达立易考教育为大家汇总了信息。 一、成绩查询考生可登录中国研究生招生信息网“全国硕士研究生招生考试初试成绩查询…

二十四节气—雨水,好雨知时节,当春乃发生。

雨水&#xff0c;是二十四节气之第2个节气。 雨水节气不仅表明降雨的开始及雨量增多&#xff0c;而且表示气温的升高&#xff0c;意味着进入气象意义的春天。 雨水节是一个非常富有想象力和人情味的节气&#xff0c;在这一天&#xff0c;不管下不下雨都充满着一种雨意蒙蒙的诗…

nps内网穿透工具

一、准备一台有公网ip的服务器 https://github.com/ehang-io/nps/releases 在这个地址下载服务端的安装包&#xff0c;centos的下载这个 上传到服务器上。 二、然后解压&#xff0c;安装&#xff0c;启动 [rootadministrator ~]# tar xzvf linux_amd64_server.tar.gz [roo…

【C语言】预编译

&#x1f6a9;write in front&#x1f6a9; &#x1f50e;大家好&#xff0c;我是謓泽&#xff0c;希望你看完之后&#xff0c;能对你有所帮助&#xff0c;不足请指正&#xff01;共同学习交流&#x1f50e; &#x1f3c5;2021年度博客之星物联网与嵌入式开发TOP5&#xff5…

[架构之路-110]-《软考-系统架构设计师》-软件架构设计-3-架构描述语言ADL与UML

前言&#xff1a;第3节 架构描述语言ADL3.1 ADL概述3.1.1 什么是ADLADL&#xff0c;即架构描述语言(Architecture Description Language)。两个重要的团体在使用架构描述语言术语。它们是&#xff1a;软件工程团体企业建模和工程团体。在软件工程团体&#xff0c;架构描述语言&…

Jvm -堆对象的划分

堆对于一个jvm进程来说是唯一的&#xff0c;一个进程只有一个jvm&#xff0c;但是进程半酣多个线程&#xff0c;多个线程共享一个堆。 也就是说&#xff0c;一个jvm实例只存在一个堆&#xff0c;同时对也是Java内存管理的核心区域。 Java堆区域的大小在jvm启动时就已经被确定…

基于springboot+vue的儿科保健计划免疫系统

基于springbootvue的儿科保健计划免疫系统 ✌全网粉丝20W,csdn特邀作者、博客专家、CSDN新星计划导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取项目下载方式&#x1f345; 一、项目背…

HDMI协议介绍

HDMI全称&#xff08;High Definition Multimedia Interface&#xff09;高清多媒体接口&#xff0c;支持在单线缆上传输全数字高清视频和多声道音频。 HDMI基于TMDS协议传输&#xff0c;主要用于DVD, 机顶盒等音视频source到TV&#xff0c;显示器等sink设备的传输。HDMI向下兼…

SpringBoot学习笔记:SpringBoot集成JPA-01

文章目录概述JPA的优点在Springboot中集成步骤1.新建springboot项目步骤2.引入相关jar包&#xff0c;pom.xml文件如下:步骤3. 配置文件application.properties设置步骤4. 定义表的ORM对象类步骤5. 实现数据库操作接口(Dao)步骤6. 实现Controller测试概述 JPA是一种规范&#x…

PHP学习笔记(一谦四益)

前言 上一篇文章 PHP学习笔记&#xff08;观隅反三&#xff09;分享了数组的知识&#xff0c;这篇文章接着分享和数组相关的算法。 算法效率 算法效率分为两种&#xff1a;第一种是时间效率&#xff0c;第二种是空间效率。时间效率被称为时间复杂度&#xff0c;而空间效率被称…

SpringSecurity认证

文章目录登陆校验流程依赖yaml实现建表、工具类、实体类加密器、AuthenticationManager登录逻辑登录过滤器、配置过滤器登出登陆校验流程 认证 登录&#xff1a; ​ ①自定义登录接口 ​ 调用ProviderManager的方法进行认证 如果认证通过生成token&#xff0c;根据userId把用…

国密SM2算法(JS加密,C#、Java解密)

常见的渗透测试会将网站登录时密码使用明文传输视为风险。推荐使用国密算法或者RSA算法对密码进行加密传输。 RSA加密&#xff08;JS加密&#xff0c;C#、Java解密&#xff09;请参考《RSA对称加密&#xff08;JS加密&#xff0c;C#、Java解密&#xff09;》​​​​​​ 本文…

数据的进制转换以及算术逻辑运算

1.数据的进制转化 进制的表示&#xff1a;二进制、十六进制&#xff0c;二进制符号位0b&#xff0c;一般表示为0b0011&#xff0c;十六进制符号位0x或H&#xff0c;可以表示为0x18F或18FR进制整数转十进制&#xff1a;位权展开法&#xff0c;用R进制数的每一位乘以R的n次方&am…

C++——二叉树排序树

文章目录1 二叉搜索树概念2 二叉搜索树操作与模拟实现2.1 二叉搜索树的查找非递归版本递归版本2.2 二叉搜索树的插入非递归版本递归版本2.3 二叉搜索树的删除非递归版本递归版本3 二叉搜索树的应用&#xff08;K模型、KV模型&#xff09;4 二叉搜索树的性能分析1 二叉搜索树概念…

Go语言设计与实现 -- 反射

Go的反射有哪些应用&#xff1f; IDE中代码的自动补全对象序列化fmt函数的相关实现ORM框架 什么情况下需要使用反射&#xff1f; 不能明确函数调用哪个接口&#xff0c;需要根据传入的参数在运行时决定。不能明确传入函数的参数类型&#xff0c;需要在运行时处理任意对象。 …

1.TCP、UDP区别、TCP/IP七层、四层模型、应用层协议(计网)

文章目录1.OSI 七层模型是什么&#xff1f;每一层的作用是什么&#xff1f;2.TCP/IP 四层模型是什么&#xff1f;每一层的作用是什么&#xff1f;应用层&#xff08;Application layer&#xff09;传输层&#xff08;Transport layer&#xff09;网络层&#xff08;Network lay…

百度工程师带你探秘C++内存管理

一、概述 ptmalloc是开源GNU C Library(glibc)默认的内存管理器&#xff0c;当前大部分Linux服务端程序使用的是ptmalloc提供的malloc/free系列函数&#xff0c;而它在性能上远差于Meta的jemalloc和Google的tcmalloc。服务端程序调用ptmalloc提供的malloc/free函数申请和释放内…

Datawhale组队学习:大数据 D2——分布式文件系统(HDFS)

妙趣横生大数据 Day2三、Hadoop 分布式文件系统(HDFS)1. 分布式文件系统2. HDFS 简介3. HDFS 体系结构4. HDFS存储原理数据冗余存储数据存储策略数据错误与恢复5. HDFS数据读写过程读写过程HDFS故障类型和其检测方法HDFS编程实验1. 本地和集群文件间操作2. 基本文件操作3. Hado…

Java基本语法【未完待续】

目录 一、注释方式 1、单行注释 // 2、多行注释 /*...*/ 3、文档注释 /**....*/ 二、标识符和关键字 三、数据类型 拓展及面试题讲解 1、整数拓展 进制 二进制0b 八进制0 十六进制0x 2、字符拓展 编码Unicode表 2字节 0~65536 3、字符串拓展 4、布尔值拓展 四、类型…