本文转自公众号,欢迎关注
RISC-V PMP调试 (qq.com)
(资料图)
触发了异常中断
查看异常原因为7 store access-fault exception.
并查看异常访问的地址为0x28382ad0
gdb也确认这个地址确实只能读不能写
Pmpcfg0 对应地址pmp0cfg~pmp3cfg
Pmpcfg1 对应地址pmp4cfg~pmp7cfg
Pmpcfg2 对应地址pmp8cfg~pmp11cfg
Pmpcfg3 对应地址pmp12cfg~pmp15cfg
pmpcfg3为0x5100即对应pmp13cfg为0x51
8位的配置属性0x51如下 只读
A=10 即NA4表示4字节区域,即pmpaddrxx对应的4字节区域
L=1
A=10=2 NA4
R=1
X=0
W=0
对应pmp13cfg的pmpaddr13=0xa0e0ab4 是34位地址右移2位的值,所以左移两位恢复实际值是0x2C38 2AD0
表示的范围是[0x2C38 2AD0,0x2C38 2AD3] 4字节
我们的地址空间是0x28000000-0x2bffffff
写0x2C38 2AD0实际映射到了写0x2838 2AD0 64M绕回。
所以写0x2838 2AD0这个不具备写属性的地址触发了store access-fault
exception.异常
所以以上确认了原因是PMP设置了该地址不具备写属性,而代码中去写所以导致了异常。
我们的空间最多只有128M,最多到0x2bff ffff,为什么写了个0x2C38 2AD0的地址进去,
先找到对应的代码
由于是用的所以13的配置,所以先找这个索引对应
#define PMP_FIXED_INDEX_TASK_STACK 13
然后再搜索这个索引
找到如下函数
这个函数在vTaskSwitchContext调用
if (prev != pxCurrentTCB) { pmp_task_stack_set((uint32_t)pxCurrentTCB- >pxStack); }
即任务有切换时,设置栈底4字节不可写,用于栈溢出检测。
加个死循环用于在设置该值时停住
所以要确认什么时候写了0x2838 2AD0这个地址,由于使能了PMP,所以watchpoint抓不到,先触发了pmp的异常。
所以先关闭pmp设置
if (prev != pxCurrentTCB) { ///pmp_task_stack_set((uint32_t)pxCurrentTCB- >pxStack); }
然后设置数据断点
watch (unsigned int)0x28382ad0
运行
第一次停在栈初始化,第二次停在如下处
可以看到
任务栈的地址是 0x28382ad0开始但是 临时变量mem的地址是0x28382a60在栈前面去了,所以栈溢出了。
把栈改大即可
审核编辑:汤梓红
X 关闭
X 关闭
中新网上海3月30日电 (记者 陈静)上海正面临常态化防控以来疫情形势最严峻复杂的挑战,单日新增阳性感染者数量不断刷新纪录。记者30
中新网3月30日电 据国家地震台网官方微博消息,中国地震台网正式测定:3月30日18时14分在新疆和田地区皮山县(北纬36 01度,东经77 89
上海市委常委会今天上午(3月30日)举行会议,听取当前疫情应急处置和核酸筛查相关工作汇报,研究部署下一步疫情防控重点工作。市委书记
(抗击新冠肺炎)江苏无锡一男子隐匿行程轨迹被警方立案侦查 中新网无锡3月30日电 (记者 孙权)3月30日,无锡市在“应检尽检”人员核
(抗击新冠肺炎)官方称吉林市疫情扩散势头得到遏制 中新网吉林3月30日电 (记者 石洪宇)记者30日从吉林市政府新闻办召开的疫情防控
中新网唐山3月30日电 (白云水 孟潮)3月30日,河北省唐山市召开新冠肺炎疫情防控工作新闻发布会通报称,3月29日0时至24时,唐山市新增
浙江省嘉兴市秀洲区新型冠状病毒感染肺炎疫情防控指挥部办公室发布通告: 3月30日上午,秀洲区发现1例新冠肺炎阳性感染者,该感染者
今天(3月30日)下午,新疆乌鲁木齐市人民政府新闻办公室召开疫情防控新闻发布会,通报乌鲁木齐市新冠肺炎疫情和疫情防控最新情况。会上
中新网天津3月30日电 (记者 王君妍)记者30日从天津市水务局获悉,为充分发挥河湖长制优势,近日,天津市将南水北调中线天津干线(天津
(抗击新冠肺炎)河北廊坊累计治愈出院673例 5县区恢复域内交通 中新网廊坊3月30日电 (宋敏涛 郭京泉)30日,河北省廊坊市召