RISC-V架构——物理内存保护机制设置函数(pmp_set)解析

news2024/10/4 16:33:37

1、物理内存保护机制

参考博客:《RISC-V架构——物理内存属性和物理内存保护》;

2、pmp_set函数源码

int pmp_set(unsigned int n, unsigned long prot, unsigned long addr,
	    unsigned long log2len)
{
	int pmpcfg_csr, pmpcfg_shift, pmpaddr_csr;
	unsigned long cfgmask, pmpcfg;
	unsigned long addrmask, pmpaddr;

	/* check parameters */
	if (n >= PMP_COUNT || log2len > __riscv_xlen || log2len < PMP_SHIFT)
		return SBI_EINVAL;

	/* 计算配置项所在pmpcfg是哪一个,已经配置项在pmpcfg中的偏移量 */
#if __riscv_xlen == 32
	pmpcfg_csr   = CSR_PMPCFG0 + (n >> 2);
	pmpcfg_shift = (n & 3) << 3;
#elif __riscv_xlen == 64
	pmpcfg_csr   = (CSR_PMPCFG0 + (n >> 2)) & ~1;
	pmpcfg_shift = (n & 7) << 3;
#else
# error "Unexpected __riscv_xlen"
#endif
	pmpaddr_csr = CSR_PMPADDR0 + n;

	//清除配置项里地址匹配模式
	prot &= ~PMP_A;	
	//如果是要设置的物理内存是4个字节则用NA4模式,否则用NAPOT模式
	prot |= (log2len == PMP_SHIFT) ? PMP_A_NA4 : PMP_A_NAPOT;	
	cfgmask = ~(0xffUL << pmpcfg_shift);
	//读取出对于pmpcfg寄存器的值,并且将对应表项清零
	pmpcfg	= (csr_read_num(pmpcfg_csr) & cfgmask);
	//设置对应表项
	pmpcfg |= ((prot << pmpcfg_shift) & ~cfgmask);

	/* 配置pmp地址寄存器,如果要设置的物理地址范围是4字节 */
	if (log2len == PMP_SHIFT) {	
		pmpaddr = (addr >> PMP_SHIFT);
	} else {	
		if (log2len == __riscv_xlen) {	//__riscv_xlen是寄存器的位宽,相等则是要设置整个物理地址空间
			pmpaddr = -1UL;
		} else {
			addrmask = (1UL << (log2len - PMP_SHIFT)) - 1;	
			pmpaddr	 = ((addr >> PMP_SHIFT) & ~addrmask); //将要设置的物理地址范围左移2位,然后低(log2len - 2)位清0
			pmpaddr |= (addrmask >> 1);	//设置pmp地址寄存器,此时pmpaddr寄存器的值,最低位开始有(log2len - 3)个1
		}
	}

	/* 设置pmp表项和pmp地址寄存器 */
	csr_write_num(pmpaddr_csr, pmpaddr);
	csr_write_num(pmpcfg_csr, pmpcfg);

	return 0;
}

3、pmp_set函数分析

3.1、函数传参分析

在这里插入图片描述

3.2、pmp配置表项设置

在这里插入图片描述

3.3、pmp地址寄存器的值计算

在这里插入图片描述

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

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

相关文章

【C++和数据结构】位图和布隆过滤器

目录 一、位图 1、位图的概念 2、位图的实现 ①、基本结构 ②、set ③、reset&#xff1a; ④、test ⑤、问题&#xff1a; ⑥、位图优缺点及应用&#xff1a; ⑦、完整代码及测试 二、布隆过滤器 1、布隆过滤器的提出 2、布隆过滤器的实现 ①、基本结构 ②…

初识测开/测试

前言 在进入软件测试的正式讲解之前&#xff0c;我们需要对这个行业有一个整体的了解。 当我们从软件开发转向软件测试的时候&#xff0c;多数公司是欢迎的&#xff0c;而且难度也小。 反之&#xff0c;当我们从软件测试转向软件开发的时候&#xff0c;难度将会变得很大。 关于…

《持续交付:发布可靠软件的系统方法》- 读书笔记(七)

持续交付&#xff1a;发布可靠软件的系统方法&#xff08;七&#xff09; 第 7 章 提交阶段7.1 引言7.2 提交阶段的原则和实践7.2.1 提供快速有用的反馈7.2.2 何时令提交阶段失败7.2.3 精心对待提交阶段7.2.4 让开发人员也拥有所有权7.2.5 在超大项目团队中指定一个构建负责人 …

Mock测试详细教程入门这一篇就够了!

1、什么是mock测试 1.png Mock测试就是在测试活动中&#xff0c;对于某些不容易构造或者不容易获取的比较复杂的数据/场景&#xff0c;用一个虚拟的对象(Mock对象)来创建用于测试的测试方法。 2、为什么要进行Mock测试 Mock是为了解决不同的单元之间由于耦合而难于开发、测试…

01-React入门

React概述 react是什么&#xff1f; React用于构建用户界面的JS库。是一个将数据渲染为HTML视图的开源JS库。 为什么学&#xff1f; 1.原生JS操作DOM繁琐&#xff0c;效率低 2.使用JS直接操作DOM,浏览器会进行大量的重绘重排 3.原生JS没有组件化编码方案&#xff0c;代码…

【GA-LSSVM预测】基于遗传算法优化最小二乘支持向量机的回归预测(MATLAB代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

数字化转型如何影响企业全要素生产率(2007-2022年)

参照赵宸宇等&#xff08;2021&#xff09;的做法&#xff0c;本团队对来自财贸经济《数字化转型如何影响企业全要素生产率》一文中的基准回归部分进行复刻 一、数据介绍 数据名称&#xff1a;数字化转型如何影响企业全要素生产率 数据范围&#xff1a;上市公司 数据年份&am…

NSSCTF第8页(2)

[LitCTF 2023]就当无事发生 没有环境 [MoeCTF 2022]ezhtml 在js代码找到了flag [HNCTF 2022 WEEK2]ez_ssrf 题目描述说让我们访问index.php,看到了代码 传入的data会base64解码&#xff0c;传参port和host&#xff0c;还有一个没见过的函数fsockopen 查了一下 fsockopen函…

驱动开发LED灯绑定设备文件

头文件 #ifndef __HEAD_H__ #define __HEAD_H__typedef struct {unsigned int MODER;unsigned int OTYPER;unsigned int OSPEEDR;unsigned int PUPDR;unsigned int IDR;unsigned int ODR; }gpio_t;#define PHY_LED1_ADDR 0x50006000 #define PHY_LED2_ADDR 0x50007000 #defin…

计算机算法分析与设计(18)---回溯法(介绍、子集和问题C++代码)

文章目录 一、回溯法介绍二、子集和问题2.1 知识概述2.2 代码编写 一、回溯法介绍 1. 回溯法&#xff08;back tracking&#xff09;是一种选优搜索法&#xff0c;又称为试探法&#xff0c;有“通用的解题法”之称&#xff0c;按选优条件向前搜索&#xff0c;以达到目标。但当探…

vue3 v-model的使用

&#x1f642;博主&#xff1a;锅盖哒 &#x1f642;文章核心&#xff1a;vue3 v-model的使用 目录 前言 什么是v-model&#xff1f; 基本的v-model用法 自定义组件中的v-model 前言 当涉及到Vue.js 3的前端开发时&#xff0c;v-model是一个不可或缺的工具&#xff0c;它…

从REST到GraphQL:升级你的Apollo体验

前言 「作者主页」&#xff1a;雪碧有白泡泡 「个人网站」&#xff1a;雪碧的个人网站 「推荐专栏」&#xff1a; ★java一站式服务 ★ ★ React从入门到精通★ ★前端炫酷代码分享 ★ ★ 从0到英雄&#xff0c;vue成神之路★ ★ uniapp-从构建到提升★ ★ 从0到英雄&#xff…

CPU寄存器与寻址方式

CPU寄存器与寻址方式 1 CPU寄存器2 表达数据位置3 寻址方式3.1 直接寻址3.2 寄存器间接寻址3.3 寄存器相对寻址3.4 基址变址寻址3.5 相对基址变址寻址3.6 按比例变址寻址&#xff08;SIB&#xff09; 本文属于《 X86指令基础系列教程》之一&#xff0c;欢迎查看其它文章。 1 C…

CDN+Nginx反向代理来隐藏c2地址

思路&#xff1a;通过借助CDN和Nginx反向代理和HTTPS来隐藏真实c2服务器Nginx反向代理&#xff1a;通过Nginx对外部流量转发到本地&#xff0c;再设置防火墙只允许localhost访问cs端口达到IP白名单的效果 准备 在这个实验环境中&#xff0c;我们需要准备服务器两台(一台服务端…

1978-2021年全国各省有效灌溉面积数据

1978-2021年全国各省有效灌溉面积数据 1、时间&#xff1a;1978-2021年 2、来源&#xff1a;农业统计NJ、各省NJ、国家统计J 3、指标&#xff1a;有效灌溉面积 4、范围&#xff1a;31省市 5、指标解释&#xff1a; 有效灌溉面积指具有一定的水源&#xff0c;地块比较平整…

爽,我终于实现了selenium图片滑块验证码!【附代码】

因为种种原因没能实现愿景的目标&#xff0c;在这里记录一下中间结果&#xff0c;也算是一个收场吧。这篇文章主要是用selenium解决滑块验证码的个别案列。 思路&#xff1a; 用selenium打开浏览器指定网站 将残缺块图片和背景图片下载到本地 对比两张图片的相似地方&#x…

驱动day4作业

通过字符设备驱动的分步实现编写LED驱动&#xff0c;另外实现特备文件和设备的绑定 head.h #ifndef __HEAD_H__ #define __HEAD_H__ typedef struct{unsigned int MODER;unsigned int OTYPER;unsigned int OSPEEDR;unsigned int PUPDR;unsigned int IDR;unsigned int ODR; }…

2007-2022 年上市公司国内外专利授权情况数据

2007-2022 年上市公司国内外专利授权情况 1、来源&#xff1a;国家知识产权局 2、时间&#xff1a;2007-2022 年 3、范围&#xff1a;上市公司 4、指标&#xff1a; 证券代码、年份、省份、城市、行业代码、授权地区、申请类型、专利、发明专利、实用新型、外观设计 5、…

SpringBoot读取Resource下文件的几种方式读取jar里的excel,文件损坏

在项目中涉及到Excle的导入功能&#xff0c;通常是我们定义完模板供用户下载&#xff0c;用户按照模板填写完后上传&#xff1b; 这里待下载模板位置为resource/template/员工基础信息导入模板.xlsx&#xff0c; 分别尝试了四种读取方式&#xff0c;并且测试了四种读取方式分别…