首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在riscv中设置物理内存保护?

如何在riscv中设置物理内存保护?
EN

Stack Overflow用户
提问于 2022-01-11 13:14:05
回答 1查看 322关注 0票数 0

我正在尝试编写一个使用riscv的小型软件。我用的是SaxonSoc https://github.com/SpinalHDL/SaxonSoc。这意味着,我可以访问硬件描述和模拟波形。

我正在试着理解为什么这个小测试不起作用?

代码语言:javascript
复制
int main (){

 volatile uint32_t * volatile mem=(uint32_t * volatile)( SYSTEM_RAM_A_CTRL+ 0x2000) ;

*mem=0x15;
main_println32x("mem :",*mem);

u32 new_pmpcfg0 =1<<7 ; //setting the L bit so restructions can be applied to M mode 
    new_pmpcfg0 =(new_pmpcfg0) | 3<<3 ; // A=3=NAPOT  ; R=W=X=0 
u32 new_pmpaddr0=(u32)( SYSTEM_RAM_A_CTRL+ 0x2000)  ;

   __asm__ volatile ("csrw    pmpaddr0, %0" 
                      : /* output: none */ 
                      : "r" (new_pmpaddr0) /* input : from register */
                      : /* clobbers: none */);                    
   __asm__ volatile ("csrw    pmpcfg0, %0" 
                      : /* output: none */ 
                      : "r" (new_pmpcfg0) /* input : from register */
                      : /* clobbers: none */);


*mem=0x19; // I expect an exception here 
main_println32x("mem :",*mem);

}

仿真表明,正确配置了csr寄存器:

但不幸的是,我没有得到我等待的例外。

知道我在这里错过了什么吗?

EN

回答 1

Stack Overflow用户

发布于 2022-01-13 11:14:09

我的第一个想法是,pmpaddr的设置不正确。在使用NAPOT编码时,开始地址和区域大小按照RiscV特权规范中的表3.10进行编码。

我建议通过设置pmpaddr ='1 (所有地址)来测试它,以覆盖整个地址空间,这样您正在访问的地址将与该pmp区域匹配。然后它应该抛出一个异常,因为它违反了访问权限。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70667440

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档