OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 4115|回复: 8

ARM内核是如何分辨出写内存越界的?

[复制链接]

4

主题

346

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3657
金钱
3657
注册时间
2016-2-21
在线时间
542 小时
发表于 2017-2-10 16:12:17 | 显示全部楼层 |阅读模式
30金钱
比如在函数里开个数组,故意写越界,然后32就会跳到hardfault。是什么硬件在做内存越界的保护?难道是CPU能自己分析栈区的情况吗?

最佳答案

查看完整内容[请看2#楼]

CPU是分辨不出,内存越界并不一定触发hardfault,触发hardfault的真实原因是内存越界写入到了某些保护区域(可能性很小)或者造成了逻辑错误(可能性很大,如破坏了堆栈,函数返回时R14寄存器数据异常, 导致程序跳转失败等), 而内存越界本身只是个错误,而且是不会百分百发生的随机错误(曾经遇到过上电正常,工作一段时间触发异常的,后来排查就是指针越界), 所以必须避免这种问题。 其实你可以定义两个全局变量测试下: int a[10] ...
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

3

主题

401

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
1769
金钱
1769
注册时间
2015-6-11
在线时间
313 小时
发表于 2017-2-10 16:12:18 | 显示全部楼层
CPU是分辨不出,内存越界并不一定触发hardfault,触发hardfault的真实原因是内存越界写入到了某些保护区域(可能性很小)或者造成了逻辑错误(可能性很大,如破坏了堆栈,函数返回时R14寄存器数据异常, 导致程序跳转失败等), 而内存越界本身只是个错误,而且是不会百分百发生的随机错误(曾经遇到过上电正常,工作一段时间触发异常的,后来排查就是指针越界), 所以必须避免这种问题。
其实你可以定义两个全局变量测试下:
int a[10] = "hello";
int b[10] = "world";
然后在main函数里赋值a超过10字节,在打印出来,这时是不会触发异常的。
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165538
金钱
165538
注册时间
2010-12-1
在线时间
2117 小时
发表于 2017-2-10 18:45:24 | 显示全部楼层
表示不清楚
回复

使用道具 举报

1

主题

55

帖子

0

精华

初级会员

Rank: 2

积分
195
金钱
195
注册时间
2015-11-26
在线时间
25 小时
发表于 2017-2-13 16:27:10 | 显示全部楼层
去看一下 stm的手册 首页的cpu结构  一切就都知道了
回复

使用道具 举报

3

主题

401

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
1769
金钱
1769
注册时间
2015-6-11
在线时间
313 小时
发表于 2017-2-14 16:30:28 | 显示全部楼层
本帖最后由 zc123 于 2017-2-14 16:35 编辑

————————————
回复

使用道具 举报

24

主题

208

帖子

0

精华

高级会员

Rank: 4

积分
714
金钱
714
注册时间
2014-4-8
在线时间
160 小时
发表于 2017-2-14 16:34:56 | 显示全部楼层
嗷大喵 发表于 2017-2-13 16:27
去看一下 stm的手册 首页的cpu结构  一切就都知道了

请问  是什么手册
回复

使用道具 举报

4

主题

346

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3657
金钱
3657
注册时间
2016-2-21
在线时间
542 小时
 楼主| 发表于 2017-2-16 09:28:21 | 显示全部楼层
zc123 发表于 2017-2-10 16:12
CPU是分辨不出,内存越界并不一定触发hardfault,触发hardfault的真实原因是内存越界写入到了某些保护区域( ...

谢谢
回复

使用道具 举报

1

主题

55

帖子

0

精华

初级会员

Rank: 2

积分
195
金钱
195
注册时间
2015-11-26
在线时间
25 小时
发表于 2017-2-16 15:44:35 | 显示全部楼层
xinxian 发表于 2017-2-14 16:34
请问  是什么手册

其实内存越界cpu是分辨不出来的,只有当程序破坏了cpu的某些重要内存区域或者违反了cpu的硬件设定,比如直接使用指针索引写入内部rom等等。
回复

使用道具 举报

33

主题

984

帖子

1

精华

论坛元老

Rank: 8Rank: 8

积分
8024
金钱
8024
注册时间
2014-8-13
在线时间
1595 小时
发表于 2017-2-16 15:49:51 | 显示全部楼层
windows的内存分配是有标识符的,比如某些区域是只读的,如果有某个写内存操作目的地址的标识符是只读的,那么就会报错了。估计STM32也是同样的吧。

当然也有越界不报错的情况,比如你分配了10个字节可写的,然后紧跟着分配了1K可写的,你在写入前10个字节时,写入了100个,估计STM32还是不会报错(其实windows也可以这样构造而不报错)。

个人猜想。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-15 17:54

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表