难度:★本文首发于我的嵌入式技术号「OneChan」,未经授权禁止转载。打开任何一个 Cortex-M3 启动文件,你都会看到类似这样的语句:AREA |.text|, CODE, READONLY前面我们讲过AREA的CODE属性是指这一段里装的是指令。那READONLY呢?字面意思很直白:只读。但问题来了:代码本来就是拿来跑的,CPU 取指令又不会改它,标不标只读有关系吗?有。而且关系大了。今天我们就来深挖这个看似“理所当然”的属性,看看它到底在保护什么,以及——如果写错了,灾难会以怎样隐蔽的方式降临。一、谁需要这个“READONLY”?首先必须澄清一个误区:对于 Cortex-M3 内核本身来说,它不检查 AREA 的 READONLY 属性。内核没有内置的“只读代码段”检测逻辑。取指令时,它只负责把 PC 指向地址的内容读进来,解码执行。至于这个地址是 Flash 还是 RAM、有没有写保护,CPU 内核默认知之甚少——它只负责找指令。那READONLY是写给谁看的?答案有三层,分别
为什么代码段通常标记为 READONLY?
难度:★本文首发于我的嵌入式技术号「OneChan」,未经授权禁止转载。打开任何一个 Cortex-M3 启动文件,你都会看到类似这样的语句:AREA |.text|, CODE, READONLY前面我们讲过AREA的CODE属性是指这一段里装的是指令。那READONLY呢?字面意思很直白:只读。但问题来了:代码本来就是拿来跑的,CPU 取指令又不会改它,标不标只读有关系吗?有。而且关系大了。今天我们就来深挖这个看似“理所当然”的属性,看看它到底在保护什么,以及——如果写错了,灾难会以怎样隐蔽的方式降临。一、谁需要这个“READONLY”?首先必须澄清一个误区:对于 Cortex-M3 内核本身来说,它不检查 AREA 的 READONLY 属性。内核没有内置的“只读代码段”检测逻辑。取指令时,它只负责把 PC 指向地址的内容读进来,解码执行。至于这个地址是 Flash 还是 RAM、有没有写保护,CPU 内核默认知之甚少——它只负责找指令。那READONLY是写给谁看的?答案有三层,分别