You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

ARM GNU汇编STR指令无法写入内存,如何设置.data段可写?

问题原因

你遇到的.data段不可写问题本质是两个配置错误导致的:

  1. 你当前将0x4000地址作为写入目标,这个地址属于QEMU挂载的pflash(并行闪存)范围,闪存默认是只读属性,直接执行STR指令无法修改闪存内容
  2. 链接配置没有区分只读代码区(Flash)和可写数据区(RAM),将.data段直接放在了Flash的地址范围内

解决步骤

1. 确认开发板存储映射

你使用的connex是基于PXA255的开发板,默认存储映射如下:

  • 只读Flash区:起始地址0x00000000,最大16MB,你编译出的flash.bin就挂载在这个区域
  • 可写RAM区:起始地址0xa0000000,最大64MB,所有可读写数据都要放在这个地址区间

2. 修改汇编代码的目标地址

把你汇编代码里的RAM地址修改为可写的RAM区间:

.text
.equ    ram_address,0xa0000000  ; 改为RAM起始地址
.equ    pattern,0x55
.equ    counter,50  
    mov r0,#pattern
    mov r1,#counter
    mov r2,#ram_address

back:   str r0,[r2]
    add r2,#4
    subs r1,r1,#1
    bne back
here:   b here
    
        .data
i:  .word 0xffffffff

3. 修改Makefile的链接配置

调整链接参数,将.data和.bss段都放到可写RAM区间:

# 把原来的Link_Options替换成下面的配置
Link_Options=-Ttext=0x0 -Tdata=0xa0000000 -Tbss=0xa0001000

4. (可选)如果需要测试写入Flash

如果你的业务场景确实需要修改Flash内容,需要在QEMU启动命令里开启Flash可写权限,同时在汇编代码里先操作Flash控制器解锁,修改后的启动命令如下:

qemu-system-arm -S -M connex -drive if=pflash,file=flash.bin,format=raw,readonly=off -nographic -serial /dev/null

验证方法

重新编译后启动QEMU,在GDB里执行x/16xw 0xa0000000,可以看到连续50个地址都被写入了0x00000055,说明写入成功。

内容的提问来源于stack exchange,提问作者peyman khalili

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.23 20:15:03