做人呢,最紧要就系开心啦

ARM64基础8:A64其他常用指令

471次阅读
没有评论

1. 加载指令(PC 相对地址)

ADR: 加载 PC 相对地址的 label 地址,范围 +/- 1MB;
ADRP: 加载 PC 相对地址,label 地址,并且 4KB 对齐,范围 +/- 4GB;

/* others inst */

.align 3
.global my_test_data
my_test_data:
    .dword 0x12345678abcdeeff

.global adrp_test
adrp_test:
    adr x0, my_test_data

    adrp x1, my_test_data   //4KB align
    add x2, x1,#:lo12:my_test_data
    ldr x3, [x2] //get val

    ldr x4,=my_test_data  //get addr
    ldr x5, my_test_data  //get value

    adrp x6, init_pg_dir  //get addr
    ldr x7, =init_pg_dir  //get addr

    ret

运行结果如下图:
ARM64 基础 8:A64 其他常用指令

LDR 和 ADRP 区别

LDR 伪指令 :加载的是 链接地址(虚拟地址)
ADRP 指令 :加载的是当前运行地址的 PC 值 +label 的 offset,即 label 的当前 运行地址(物理地址)

在 link 脚本,将链接地址改成 0xffff000000080000,重新执行上面程序;
注:当程序链接地址不等于运行地址时,用如下命令加载符号表,否则无法单步调试;

add-symbol-file xxx.elf 0x80030 -s .text.boot 0x80000 -s .rodata 0x80758

0x80030:text 段的起始地址;0x80000:text.boot 段的起始地址;0x80758: 只读数据段的起始地址;

可通过 aarch64-linux-gnu-readelf -S xxx.elf 来查看各个段的地址
ARM64 基础 8:A64 其他常用指令
程序启动:看到 PC 值:
ARM64 基础 8:A64 其他常用指令
重新运行测试程序,结果如下:
ARM64 基础 8:A64 其他常用指令

2. 内存独占加载和访问指令

ldxr xd, [xn|sp] // 独占的读取 xn 或 sp 地址的内容到 xd 寄存器
stxr wd, xt, [xn|sp] // 独占的把 xt 内容写入到 xn 或 sp 指向的地址
//wd 为 0, 表示成功;wd = 1, 表示不成功

Linux 内核常用来实现 atomic 访问;
spinlock 机制可以简单易用 ldxr 和 lstxr 指令实现;

.align 3
.global my_data2
my_data2:
    .dword 0x0

.global my_atomic_write
my_atomic_write:
    adr x6, my_data2;

1:
    ldxr x2, [x6];
    orr x2,x2,x0;
    stxr w3, x2, [x6]

    cbnz w3, 1b

    mov x0,x2

    ret

ARM64 基础 8:A64 其他常用指令

3. 异常处理指令

svc: 系统调用指令
hvc: 虚拟化系统调用指令
smc: 安全监控系统调用指令

4. 系统寄存器访问指令

指令 描述
MRS 读取系统寄存器到通用寄存器
MSR 写系统寄存器

5. 内存屏障指令

指令名 功能描述
DMB 数据存储器隔离。DMB 指令 保证 :指令前后的, 内存访问指令 的执行顺序 ; 不保证: 内存访问指令在内存屏障指令之前完成;
DSB 数据同步隔离。比 DMB 严格:任何指令 都要等 DSB 前面的存储访问完成
ISB 指令同步隔离。最严格:它会清洗流水线,以保证所有它前面的指令都执行完毕之后,才执行它后面的指令。

例 1:

ldr x0, [x1]
str x2, [x1]  #ldr 和 str 指令都对 x1 进行 Load 和 store,形成数据依赖,这里可以不使用 dmb

例 2:

ldr x0, [x1]
dmb
str x2, [x3]
//dmb 保证 str 不会先于 ldr 执行

例 3

ldr x0, [x1]
dmb
add x2,x3,x4
//add 指令可以乱序到 dmb 之前执行

例 4

ldldr x0, [x1]
dsb
add x2,x3,x4
//add 指令不可以乱序到 dsb 指令之前

正文完
 
admin
版权声明:本站原创文章,由 admin 2021-11-02发表,共计1531字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
评论(没有评论)