各位大神:
目前我们项目急需要用MPU保护单元做内存保护
我尝试过先设置好MPPA寄存器为管理员权限只读不写(值为0x003FFEE7),这时候我再去改写保护的DDR,会产生死机
但是如果我在之前先操作保护的DDR,再去修改寄存器的配置为只读不写,这时候再去写保护的DDR,这个时候又没有产生死机,
这是为何呢?
我这边有个需求是程序在运行过程中需要实时调整权限,所以需要在某种情况下改变寄存器控制
请帮忙看看,谢谢
This thread has been locked.
If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.
各位大神:
目前我们项目急需要用MPU保护单元做内存保护
我尝试过先设置好MPPA寄存器为管理员权限只读不写(值为0x003FFEE7),这时候我再去改写保护的DDR,会产生死机
但是如果我在之前先操作保护的DDR,再去修改寄存器的配置为只读不写,这时候再去写保护的DDR,这个时候又没有产生死机,
这是为何呢?
我这边有个需求是程序在运行过程中需要实时调整权限,所以需要在某种情况下改变寄存器控制
请帮忙看看,谢谢
Hi Nancy:
目前我已经把你发的链接给到硬件参考
但是我这边还是很疑惑,你那边能否提供一些线索我们排查
现在看,同一个软件工程(您提供的)在C6746芯片上(晶振为18.432)只对L1、L2起保护,对外部的镁光DDR不起保护作用
但是在我自己买的开发板上(C6748 晶振为24Mhz)就可以对外部镁光DDR起保护作用
是否和芯片或是晶振有关?
DDR的初始化是在GEL文件中配置的,所以demo程序里没有。
这跟板子能有什么关系。
你自己的板子,DDR size是多大?可以将MPU2_REGION_START_ADDR改到DDR开头的地址。
你可以一步一步看寄存器的权限设置是不是设成功了。
再者,代码中哪一步不对了,还是哪一步都不对?
// Setup the range we will be working with
MPU2->PROG_RANGE[0].MPSAR = MPU2_REGION_START_ADDR;
MPU2->PROG_RANGE[0].MPEAR = MPU2_REGION_START_ADDR + MPU2_REGION_SIZE - 1;
// Write a known value to the memory
*pData = 0x0BADBEEF;
printf("FULL ACCESS: Value wrote to memory = 0x%08X\n",0x0BADBEEF);
printf("FULL ACCESS: Value read from memory = 0x%08X\n",*pData);
// Restrict read/write/execute access for all AIDs
MPU2->PROG_RANGE[0].MPPA = 0x03FFFEC0;
*pData = 0x76543210;
printf("NO ACCESS: Value wrote to memory = 0x%08X\n",0x76543210);
printf("NO ACCESS: Value read from memory = 0x%08X\n",*pData);
// Restrict write/execute access, only allow read access for all AIDs
MPU2->PROG_RANGE[0].MPPA = 0x03FFFEE4;
*pData = 0x01234567;
printf("READ-ONLY ACCESS: Value wrote to memory = 0x%08X\n",0x01234567);
printf("READ-ONLY ACCESS: Value read from memory = 0x%08X\n",*pData);
// Restrict read/execute access, only allow write access for all AIDs
MPU2->PROG_RANGE[0].MPPA = 0x03FFFED2;
*pData = 0xA5A50F0F;
printf("WRITE-ONLY ACCESS: Value wrote to memory = 0x%08X\n",0xA5A50F0F);
printf("WRITE-ONLY ACCESS: Value read from memory = 0x%08X\n",*pData);
// Setup Region 1 to allow read/write access for all AIDs (but no execute)
MPU2->PROG_RANGE[0].MPPA = 0x03FFFEF6;
printf("READ/WRITE ACCESS: Value read from memory = 0x%08X\n",*pData);
你程序里面应该没有开启cache吧?只是测试了demo程序对吗?
因为开启了Cache,而且应该是该访问的地址在前面已经被CPU访问过,所以在配置完MPU后再访问这个地址时,CPU先从CACHE检查这个地址是否已被CACHE,如果在CACHE,则直接从CACHE取值,不会进一步访问DDR,所以不会触发MPU的保护检查。
可以试一下:在使能MPU后,对CACHE做一次invalid操作,即将CACHE清除,后面的内存访问将会先直接访问物理内存。
不使能MARn的后果,即在访问对应的内存空间时,不会被CACHE.
一个MARn对应16MByte空间的内存CACHE属性
Cache说明参阅这个文档:http://www.ti.com/lit/ug/sprufk5a/sprufk5a.pdf
Cache user guide: http://www.ti.com/lit/ug/sprug82a/sprug82a.pdf
BIOS Cache API见C:\ti\bios_6_52_00_12\docs\Bios_User_Guide.pdf
Cache_inv(blockPtr, byteCnt, type, wait); Invalidates the specified range of memory. When you
invalidate a cache line, its contents are discarded and the cache tags the line as "clean" so that next
time that particular address is read, it is obtained from external memory. All lines in the range are
invalidated in all caches.