嵌入式裸机编程中.ld文件指定FLASH不可写后的权限保障问询
嵌入式裸机中FLASH只读属性的保障机制
当你在链接脚本(.ld)里把FLASH标记为(rx)只读属性后,系统会从编译链接阶段和运行阶段两层来保障这个权限不被违反:
一、编译链接阶段:GCC与链接器的静态检查
- GCC会对代码做静态分析:如果直接修改
const修饰的只读变量(这类变量默认会被链接到FLASH区域),GCC会抛出编译错误;如果通过指针强制类型转换绕过const限制,开启-Wall等警告选项时,GCC会给出警告,提醒你可能存在非法写入操作。 - 链接器会严格按脚本内存属性分配段:将
.text(代码段)、.rodata(只读数据段)放到FLASH的(rx)区域,把.data、.bss等可写数据段放到RAM的(rwx)区域。要是某个段的属性和目标内存区域不匹配(比如把可写段塞进FLASH),链接器会直接报错终止构建。
二、运行阶段:硬件层面的强制防护
这是最核心的限制,毕竟编译阶段的检查能被代码绕过,而硬件防护是硬约束:
- FLASH物理特性限制:绝大多数嵌入式FLASH(比如NOR FLASH)不支持普通CPU写指令直接写入,必须通过特定擦写时序(发送擦除命令、编程命令)才能修改内容。如果代码里用普通赋值语句写FLASH地址,CPU执行时要么触发总线错误,要么操作直接无效。
- 内存保护单元(MPU):如果你的MCU带有MPU,可以在初始化时配置FLASH对应的内存区域为只读访问权限。一旦CPU执行写FLASH的指令,MPU会立刻触发内存访问异常,你可以在异常处理函数里捕获错误,做复位、日志记录等操作。
- 少数带MMU的高端MCU(比如ARM Cortex-A系列),也能通过MMU页表配置FLASH区域为只读,原理和MPU类似,但裸机场景下MPU的使用更普遍。
内容的提问来源于stack exchange,提问作者james lebron
相关产品推荐
相关产品推荐

