.text 段的内存和.rodata的内存区别
结论物理存储上都存放在 Flash地址连续、同一块物理存储芯片硬件无分区隔离逻辑 / 访问权限 / CPU 机制上完全分开用途、保护、加载规则不同。一、物理层面硬件 Flash同一片 Flash 存储颗粒.textCode.rodata常量字符串 /const.data初始化副本 全部烧录在同一块 Flash物理介质没有隔断只是链接脚本分配了不同地址区间。读操作硬件通路完全一样CPU 通过 Flash 控制器读取指令、读取常量数据走同一套读取总线Flash 硬件本身不区分这段存的是代码还是字符串。擦写特性一致Flash 只能整块擦除、按页编程不会区分.text和.rodata区域。简单说硬件看不出两者区别只是链接器人为划分地址区间。二、逻辑、访问、权限上的本质区别重点1. .text 段程序代码存放函数汇编指令、中断函数、运算逻辑CPU 访问方式取指操作 I-FetchCPU PC 指针指向该区域读取机器码执行访问权限只读禁止数据写访问多数单片机 MPU / 存储器保护单元会配置.text 区域只允许指令读取禁止普通数据读写如果代码里指针强行修改 .text 地址直接触发内存访问异常 HardFault内容二进制机器指令不能被代码当成普通数据遍历修改。2. .rodata 段只读常量存放字符串字面量、const全局常量、只读查找表CPU 访问方式数据读取 D-Fetch用普通指针、数组下标读取不是 PC 取指令访问权限同样只读但权限属性是「只读数据区」MPU 配置为允许数据读不允许写不允许当成指令执行如果跳转到 rodata 地址当作函数执行会取到乱码数据当指令直接死机用途纯数据没有可执行指令。三、举个直观例子c运行const char log_str[] val%d\n; // 存在 .rodata void cal_coulometer(uint32_t vbat)// 函数指令存在 .text { unsigned int val100; LOG(log_str,val); }CPU 运行 cal_coulometerPC 指针去.text拿指令执行打印时读取字符串D 总线去.rodata拿字符串字节两块物理上挨在一起在 Flash但 CPU 硬件层面区分「指令总线」「数据总线」访问。四、补充两个容易混淆的点会不会放到不同 Flash 分区不会普通 MCU 单块 Flash链接脚本只是划分虚拟地址只有带多块独立 Flash 芯片的高端芯片才会物理分开。和 RAM 对比区分.text/.rodata 全程在 Flash运行时不拷贝到 RAMRW-data/ZI (.bss) 是运行时拷贝 / 清零到 RAM物理介质完全不同。总结物理硬件无区别同一块 Flash同一套读写电路逻辑 / CPU 总线 / 权限有严格区分一个是指令区一个是只读数据区不能混用