RISC-V架构——物理内存属性和物理内存保护

本文详细介绍了RISC-V体系结构中的物理内存属性(PMA)和物理内存保护(PMP)机制,包括PMP的作用、配置寄存器、地址匹配模式以及在opensbi中的设置函数。特别提到了玄铁C906的PMP模块和注意事项。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、物理内存属性(PMA:Physical Memory Attributes)

在这里插入图片描述

(1)系统内存映射包含各种不同属性的地址空间范围,每个地址空间范围支持的操作不一样;
(2)物理内存属性一般是在芯片设计阶段就固定下来(大部分芯片不支持软件修改),芯片内存有PAM检测器,PMA检测器会对物理地址权限和属性做检查;

2、物理内存保护

2.1、物理内存保护的作用(PMP:Physical Memory Protection)

(1)在RISC-V体系结构中,M模式具有最高权限,拥有访问系统全部资源的权限。默认情况下,S模式和U模式对内存映射的任何区域没有读、写、执行权限,除非配置PMP来允许S模式和U模式访问
(2)在M模式下,只有PMP配置项的L字段是锁定状态,M模式才会去检查PMP权限;
作用:如果我们对某些地址范围有特殊需求,可以通过PMP来设置,防止出错;比如某个地址范围的数据希望只读不可写,可以设置PMP把这段地址范围设置成只读不可写属性,这样当有代码尝试修改数据时就会报错,防止误操作;

2.2、PMP配置寄存器

2.2.1、PMP配置寄存器数量

在这里插入图片描述

(1)RISC-V规定最多支持64个PMP配置项,也就是最多支持对64个地址范围做权限设置;
(2)每个地址范围对于的PMP配置表项是8位,要保存64个PMP配置项,64位RISC-V核只需要8个寄存器,32位RISC-V核需要16个寄存器;
(3)为了统一命名,64位RISC-V的pmpcfg寄存器只有pmpcfg0、pmpcfg2,只有双数的;

2.2.2、PMP配置表项

在这里插入图片描述

(1)地址匹配模式:怎么去计算配置的地址范围,见下一节;
(2)锁定状态:锁定状态下M模式需要去检查地址范围的权限;非锁定状态下,M模式拥有全部权限,不受PMP配置的权限限制;

2.2.3、地址匹配模式

2.2.3.1、TOR模式

在这里插入图片描述

表示地址范围由相邻两个pmpaddr寄存器的值决定;

2.2.3.2、NAPOT模式

在这里插入图片描述

表示的地址范围:pmp地址寄存器的值从bit0开始连续1的个数为n,则表示的地址范围是2的(n+3)次方字节;

2.3、PMP地址寄存器

在这里插入图片描述

(1)pmp地址寄存器的bit[53:0]保存物理地址范围的bit[55:2];

2.4、如何配置一段物理内存地址的保护属性?

在这里插入图片描述

以RAM地址为例:
(1)地址权限是可读可写,所有8位pmp配置项的值为0x9B;
(2)起始地址0x20000000右移2位,变成0x8000000;
(3)RAM的地址范围是0x8000,也就是2的15次方,pmpaddr寄存器中的值需要15-3=12个连续低位1,即0x8000FFF;

3、opensbi中物理内存保护设置函数分析

参考博客:《RISC-V架构——物理内存保护机制设置函数(pmp_set、pmp_get)解析》

4、注意事项

在这里插入图片描述

(1)可以参考玄铁C906的PMP模块说明,其中PMP地址寄存器的低九位就是WARL(可以写任意值,但是读出来都是0);
(2)参考博客:《玄铁C906——物理内存保护(PMP)介绍》

### 回答1: 基于开源的 RISC-V 核——PicoRV32,我们可以搭建一个简单的片上系统(SoC)。首先,我们需要明确片上系统包含的核心组件:处理器核心、内存、总线、外设系统接口等。 首先,我们可以将 PicoRV32 核心作为处理器核心引入片上系统。PicoRV32 是一个简洁而高效的 RISC-V 处理器,它是开源的,并且易于扩展定制。 其次,我们需要添加适当的内存组件来存储程序数据。常见的内存组件包括静态随机访问存储器(SRAM)动态随机访问存储器(DRAM)。我们可以根据实际需求选择合适的内存组件。 然后,我们需要设计一个总线系统,用于连接处理器核心、内存外设。常见的总线标准包括存储器映射I/O总线(Memory-Mapped I/O Bus)高级扩展总线(Advanced Extensible Interface)。我们可以选择适合需求的总线标准,并设计总线连接线路。 接下来,我们需要添加外设来扩展功能。外设可以包括但不限于串口、以太网控制器、图形处理器或显示控制器等。我们可以根据实际需求选择适合的外设,并将其连接到总线系统上。 最后,我们需要设计系统接口,包括时钟复位电路、电源管理、调试接口等。这些接口可以确保系统的正确运行调试。 总的来说,基于开源的 PicoRV32 核心,我们可以搭建一个完整的片上系统(SoC),包括处理器核心、内存、总线、外设系统接口等组件。这样的系统可以用于各种应用,例如嵌入式系统、物联网设备、嵌入式计算平台等。在搭建过程中,我们需要根据实际需求选择合适的组件,并设计相应的连接接口电路。通过这样的搭建过程,我们可以实现一个基于开源的 SoC,并对其进行定制扩展。 ### 回答2: 要基于开源的risc-v核——picorv32搭建一个完整的SOC(片上系统),可以按照以下步骤进行: 1. 硬件设计:根据picorv32的开源设计,可以使用HDL语言(如Verilog)编写硬件描述文件,包括CPU核心、存储器、外设控制器等。可以选择添加适合自己需求的外设,如UART、SPI、GPIO等。 2. 硬件实现:基于上一步的硬件描述文件,使用FPGA开发工具进行逻辑综合、布局布线生成比特流文件。可以选择常见的FPGA平台,如Xilinx、Altera等。 3. 软件开发:使用RISC-V架构的编译器工具链进行软件开发。首先,编写启动代码链接脚本,以初始化SOC的外设,设置中断处理等。然后,根据需求编写C/C++代码或汇编代码来实现特定功能或应用程序。 4. 烧录调试:将生成的比特流文件烧录到FPGA开发板上,然后在开发环境中配置相应的调试接口(如JTAG、UART等)来进行调试测试。可以使用调试工具,如GDB,来单步调试程序。 5. 系统调试优化:一旦SOC成功启动,可以通过外设接口与SOC进行交互,并根据实际需求进行系统调试优化。可以添加额外的外设、调整时钟频率、优化算法或引入其他性能提升措施。 需要注意的是,在搭建SOC的过程中,会涉及到硬件设计、底层软件开发FPGA调试等多个领域的知识。因此,需要具备相关的技术背景经验,并参考picorv32的开源文档社区资料进行学习实践。 ### 回答3: 搭建一个基于开源的 RISC-V 核 picorv32的完整SOC(片上系统)可以通过以下步骤实现。 首先,我们需要明确要搭建SOC的目标组件。一个完整的SOC通常包括一个或多个CPU核心、内存控制器、外设控制器、总线接口、外设设备等。在这个例子中,我们将使用picorv32作为CPU核心。 其次,我们需要根据具体需求,在picorv32的基础上添加所需的组件。例如,我们可以添加一个RAM作为内存控制器,并使用I2C控制器控制一个外设设备。我们还可以使用像AXI或AHB这样的总线接口,将CPU核心与其他组件连接起来。 然后,我们需要编写代码来实现这些组件及其之间的通信控制。对于picorv32核心,可以使用Verilog或SystemVerilog编程语言来描述其行为功能。同样,我们需要编写代码来描述内存控制器、外设控制器总线接口等组件。 接下来,我们使用一个合成工具,例如Yosys或Vivado,将Verilog代码综合成一个逻辑电路。这需要处理优化代码,生成相应的网表约束文件。 在综合完成后,我们将使用布局工具(如OpenLANE)对设计进行布局。布局工具可以根据所需的规格约束性能要求将逻辑电路映射到实际的物理芯片上。 接下来,我们使用物理验证工具(如Magic)对设计进行验证,确保所有信号/功率完整性时序满足要求。 最后,我们将设计加载到FPGA芯片或ASIC芯片上,并通过仿真测试验证SOC的功能性能。 通过以上步骤,我们可以搭建一个基于开源的RISC-V核picorv32的完整SOC,在自己的项目中使用调试。这将提供给我们一个高度可定制灵活的SOC架构,适应我们特定的应用需求。
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

正在起飞的蜗牛

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值