(1)本文描述的是玄铁C906的物理内存保护机制的实现中,与RISC-V架构手册中完整PMP机制的
差异部分
;
(2)RISC-V架构的PMP机制,参考博客:《RISC-V架构——物理内存属性和物理内存保护》;
(1)pmp配置项中的
NAPOR地址匹配模式
是计算pmp地址寄存器中值的低位有多少个零来计算的,但是c906的pmp地址寄存器读出来低九位只能是零,所以通过读PMP地址寄存器的值来反推保护区域范围就有问题,不能直接移植opensbi里的pmp_get函数,需要考虑低九位只读且为零的问题;
(2)举例:按照NAPOR地址匹配模式
,写入38’ byy_yyyy_yyyy_yyyy_yyyy_yyyy_yyyy_yy01_1111_1111表示保护区域是2的(9+3)次方,也就是4KB。但是你将上面的值写入,然后从PMP地址寄存器中读出来是38’ byy_yyyy_yyyy_yyyy_yyyy_yyyy_yyyy_yy00_0000_0000,因为pmp地址寄存器的低九位只读且为零;
问题:为什么把低九位设计成只读且为零?
个人看法:
(1)芯片支持最小保护区域是4KB,也就是保护区域的大小的4KB的整数倍,4KB也就2的12次方;
(2)按照NAPOR地址匹配模式
计算保护区域,大小是2的(n+3)次方,其中n是地址最低位连续1的个数。要表示4KB,刚好n=12-3=9,也就是低九位肯定是连续1,既然低九位是固定的,那干脆就硬件直接设计成只读为零,简化芯片设计;