ARM笔记

发布时间:2026/7/8 4:46:51
ARM笔记
1.查看进程ps aux查看系统上的所有进程ps axjf 显示完整的进程树htop -u username(用户名) 查看特定用户创建的进程atop是交互式系统性能监控工具 安装完后直接输入atop即可启动默认每10s刷新一次数据,也可以指定时间atop 5top -H -ppid 查看程序内部线程2.动态跟踪特定进程调用了那些系统调用sudo strace -c -p 12(进程ID)3.查看当前系统使用的页面大小getconf PAGESIZE4.查看elf文件中各节的内容readelf -IW /usr/bin/cat 查看cat程序的程序头5.取消随机化在gdb调试中设置 set disable-randomiztion on/off或者修改/proc/sys/kernel/randomize_va_space的值 0不随机化 1随机化 2完全随机化sudo sh -c echo 0 /proc/sys/kernel/randomize_va_space6.ARM A64一些要点说明A64有31个64位的通用寄存器X0-X7是参数寄存器,用来传递参数并返回结果X8用于传递间接结果的地址位置X9-X15是调用者保存的临时寄存器,用于在调用另一个函数时保存数值.受影响的寄存器被保存在调用函数的栈帧中,允许子程序修改这些寄存器X16-X18是子程序内调用临时寄存器可以用作子程序调用之间的立即数的临时寄存器X19-X28是被调用者保存的寄存器,他们被保存在被调用子程序的栈帧中,允许子程序修改这些寄存器,但也要求在返回给调用者之前恢复这些寄存器X29用作栈帧指针(Frame Pointer,FP),用于跟踪栈帧X30用作连接寄存器(Link Register,LR),用于保存函数的返回地址7.A64专用寄存器寄存器 名称 寄存器宽度PC 程序计数器 64位SP 栈指针寄存器 64位WSP 栈指针寄存器 32位XZR 零寄存器 64位WZR 零寄存器 32位LR(X30) 链接寄存器 64位ELR 异常链接寄存器 64位PSTATE 程序状态寄存器 64位 标志位NZCV N操作结果为负时被设置 Z操作结果为零 C(操作产生了进位) V(操作产生了有符号溢出)SPSR_ELx 给定异常级别的保存进程状态寄存器 32位8.数据处理指令add x0,x1,x2; x0x1x2adds x0,x1,x2; x0x1x2 and set flagsA32指令允许使用以下元操作数形式寄存器形式 add r0,r0,r1常量立即数形式 add r0,r0,#100移位寄存器形式 add r0,r0,r1,LSL #1 r0r0(r11)寄存器-移位寄存器形式 add r0,r0,r1,LSL r2 r0r0(r1r2)扩展寄存器形式 支持的扩展类型UXTB, UXTH, UXTW, UXTX (零扩展), SXTB, SXTH, SXTW, SXTX (符号扩展)。lsl r0,r1,#2; r0r12A64指令集支持四种基本类型的位移操作逻辑左移(Logical Shift Left, LSL)逻辑右移(Logical Shift Right, LSR)算数右移(Arithmetic Shift Right, ASR符号位不动循环右移(ROTATE Right,ROR) 会帮移出的部分添加到移入的里面位域移动BFM Xd,Xn,#r(宽度),#s(目标位域LSB的位数SBFM UBFM指令 别名语法 实现方式8到64位符号扩展 SXTB Xd,Wn SBFM Xd,Xn,#0,#716到64位符号扩展 SXTH Xd,Wn SBFM Xd,Xn,#0,#1532到64位符号扩展 SXTW Xd,Wn SBFM Xd,Xn,#0,#318到64位零扩展 UXTB Xd,Wn UBFM Xd,Xn,#0,#716到64位零号扩展 UXTH Xd,Wn UBFM Xd,Xn,#0,#1532到64位零号扩展 UXTW Xd,Wn UBFM Xd,Xn,#0,#319.内存访问指令LDR R0,[R1] 加载寄存器 将R1内存中的值加载到R0STR R0,[R1] 存储寄存器 将R0中保存的32位值存储到从基址寄存器R1获得的地址中寻址模式基地址寄存器直接寻址模式 LDR Rt,[Rn]偏移寻址(基址加偏移量) LDR Rt,[Rn,offset] 不会更新Rn的值前索引寻址 LDR Rt,[Rn,offset] 会先更新更新Rn的值后索引寻址 LDR Rt,[Rn],offset 先加载数据 后RnRnoffset字面值寻址(PC相对寻址) LDR Rt,label加载寄存器 LDUR(未缩放,支持1字节偏移和负数,偏移范围-256-255) LDR(缩放,0-4095,偏移量在A64下必须是8的倍数,A32下必须是4的倍数)加载字节 LDURB(未缩放,,偏移范围-256-255) LDRB(缩放,0-4095)加载有符号字节 LDURSB(未缩放,,偏移范围-256-255) LDRSB(缩放,0-4095)加载有符号半字 LDURSH(未缩放,,偏移范围-256-255) LDRSB(缩放,0-4095)加载有符号字 LDURSW(未缩放,,偏移范围-256-255) LDRSB(缩放,0-4095)存储加载器 STUR STR存储字节 STURB STRB存储半字 STURH STRH多重加载 LDM Rn{!},registers LDM sp,{r1,r2,r3} 寄存器需要按顺序,要不会提示警告自动排列,导致使用时错位 将sp指向的值一次加载到r1,r2,r3里面 最多16个LDP X1,X2,[X0] 成对参数必须两个多重存储 STM Rn{!},registers LDM sp,{r1,r2,r3}STP X1,X2,[X0] 成对参数必须两个递增后寻址 LDMIA 先赋值后增加指针递增前寻址 LDMIB 先增加指针位置后赋值递减后寻址 LDMDA递减前寻址 LDADB10.条件执行A32条件码 Arm定义了16个4位条件码这些条件码允许指令基于PSTATE的NZCV标志的状态有条件地执行。值 条件码 语义(整数运算) 条件标志0000 EQ 相等 Z10001 NE 不相等 Z00010 CS/HS 进位设置 C10011 CC/LO 进位清楚 C00100 MI 负数 N10101 PL 正或零 N00110 VS 溢出 V10111 VC 无溢出 V01000 HI 无符号大于 C1 Z01001 LS 无符号小于或等于 !(C1Z0)1010 GE 有符号大于或等于 NV1011 LT 有符号小于或等于 N!V1100 GT 有符号大于 Z0NV1101 LE 有符号小于或等于 !(Z0NV)1110 AL 始终(无条件) Any1111 NV 无效 Any条件指令 编写条件指令只需要将条件码直接附加到指令的末尾 如果条件码判断结果为真,则执行指令IT指令cmp r0,r1itete EQaddeq r0,r1,r2 ;use base cond(EQ)andne r0,r0,#0xfff ; e:use negation(NE)orreq r0,r0,#0xfff ; t:use cond(EQ)addne r0,r0,#1 ; e:use negation(NE)对应的逻辑伪代码if(r0r1){ro(r1r2)|0xfff;}else{r0(r00xfff)1;}A64下条件选择指令指令名称 指令语法 满足条件时的操作 不满足条件时的操作条件选择 CSEL Xd,Xn,Xm,cond XdXn XdXm条件选择自增 CSINC Xd,Xn,Xm,cond XdXn XdXm1条件选择倒置 CSINV Xd,Xn,Xm,cond XdXn XdNOT(Xm)条件选择取负 CSNEG Xd,Xn,Xm,cond XdXn Xd-Xm条件设置 CSET Xd,cond Xd1 Xd0条件设置掩码 CSETM Xd,cond Xd(all ones) Xd0条件自增 CINC Xd,Xn,cond XdXn1 XdXn条件倒置 CINV Xd,Xn,cond XdNOT(Xn) XdXn条件取负 CNEG Xd,Xn,cond Xd-Xn XdXn例子:CMP w0,w1CSEL w0,w1,zer,EQCCMP 条件比较指令 CCMP arg1arg2,nzcv,condif(cond){PSTATE.NZCVCMP(arg1,arg2);}else{PSTATE.NZCVnzcv}{w0w1w2w3cmp w0,w1ccmp w2,w3,0,EQblt _label}{w0w1||w2w3cmp w0,w1ccmp w2,w3,8,NEblt _label}CCMN 条件比较否定指令if(cond){PSTATE.NZCVCMN(arg1,arg2);}else{PSTATE.NZCVnzcv}11.控制流直接分支指令指令 语法无条件跳转指令 B label条件跳转指令 B.cond label带连接程序的跳转指令 BL label如果给定寄存器不为零则跳转 CBNZ Wt|Xt, label如果给定寄存器为零,则跳转 CBZ Wt|Xt, label64位才有的如果给定寄存器的特定位不为零则跳转 TBNZ Wt|Xt,#imm,label如果给定寄存器的特定位位零,则跳转 TBZ Wt|Xt,#imm,label寄存器分支指令AArch64:语法 指令BR Xn 跳转到寄存器保存的地址BLR Xn 带连接程序的跳转指令跳转地址为寄存器保存的地址RET {Xn} 从子程序返回AArch32:语法 指令BX{cond} Rm 跳转到寄存器保存的地址可进行模式切换BLX(COND} Rm 带连接程序的跳转指令跳转地址为寄存器保存的地址可进行模式切换BXJ{COND} Rm 跳转到寄存器保存的地址可进行模式切换(Jazelle)TBB{cond} {Rn,Rm} 表跳转(字节偏移)TBB{cond} [Rn,Rm,LSL #1}表跳转(半字偏移)例子1:cmp r0,#4beq end AArch64是 b.eq end需要加....end:...例子2int func(int a){unsigned int score a;char grade;switch(score){case 9: gradeA;break;case 8: gradeB;break;case 7: gradeC;break;case 6: gradeD;break;default: gradeF;break;}return grade;}00000000funcsubs r0,#6cmp r0,#3bhi.n lafunc0x1atbb [pc,r0].short 0x0406.short 0x0a02movs r0,#66bx lrmovs r0,#67bx lrmovs r0,#68bx lrmovs r0,#70bx lrmovs r0,#65bx lr12.安装arm64虚拟环境使用 VNC 替代本地窗口最稳定保底方案如果本地图形界面GTK/SDL始终报错说明 Windows 下的图形后端与 QEMU 的视频设备存在兼容性问题。使用 VNC 可以将显示输出通过网络协议传输完全绕过本地显卡驱动问题。‌修改步骤‌‌移除‌ -device virtio-gpu-pci 和 -display gtk,gloff。‌添加‌ -vnc :0。‌下载‌ VNC Viewer如 TightVNC 或 RealVNC。‌连接‌ localhost:5900。‌完整修正命令VNC 模式REM---------------------------------------------------------------------------------------------------------安装----------------------------------------------------------------------------------------------echo offsetlocal enabledelayedexpansionREM REM 配置区域 (请根据实际情况修改路径)REM set ISO_FILEubuntu-22.04.5-live-server-arm64.isoset DISK_FILEubuntu-arm64.qcow2set BIOS_FILEQEMU_EFI.fdset QEMU_BINqemu-system-aarch64echo echo QEMU ARM64 Ubuntu 安装助手echo echo.REM 1. 检查 QEMU 是否已安装并在 PATH 中where %QEMU_BIN% nul 2nulif %ERRORLEVEL% neq 0 (echo [错误] 未找到 qemu-system-aarch64echo 请确认已安装 QEMU 并将其安装目录添加到系统环境变量 PATH 中。echo 推荐下载地址: https://qemu.weilnetz.de/w64/pauseexit /b 1)REM 2. 检查 ISO 文件是否存在if not exist %ISO_FILE% (echo [错误] 找不到 ISO 文件: %ISO_FILE%echo 请下载 Ubuntu Server ARM64 ISO 并放置在此脚本同一目录下。pauseexit /b 1)REM 3. 检查 BIOS/UEFI 固件文件是否存在if not exist %BIOS_FILE% (echo [错误] 找不到 BIOS 文件: %BIOS_FILE%echo 请下载 QEMU_EFI.fd Linaro UEFI 并放置在此11脚本同一目录下。pauseexit /b 1)REM 4. 检查并创建虚拟磁盘if not exist %DISK_FILE% (echo [信息] 检测到虚拟磁盘不存在正在创建 %DISK_FILE% 60GB...qemu-img create -f qcow2 %DISK_FILE% 60Gif %ERRORLEVEL% neq 0 (echo [错误] 创建磁盘失败请检查权限或磁盘空间。pauseexit /b 1)echo [成功] 虚拟磁盘创建完成。) else (echo [信息] 发现现有虚拟磁盘: %DISK_FILE%)echo.echo [提示] 即将启动虚拟机...echo 1. 首次启动可能较慢请耐心等待 UEFI 自检和内核加载。echo 2. 如果窗口黑屏请点击窗口内部并按几次回车键。echo 3. 按 CtrlAltG 可释放鼠标焦点。echo.pauseREM REM 启动命令REM 关键修改REM 1. 移除 ,glon 以避免 Windows 显卡驱动兼容性问题导致的黑屏/无响应REM 2. 使用 -display sdl 作为最通用的图形后端REM 3. 确保每行末尾的^ 后没有任何空格REM %QEMU_BIN% ^-M virt ^-cpu cortex-a72 ^-m 8G ^-smp 4 ^-bios %BIOS_FILE% ^-device virtio-gpu ^-display gtk,gloff ^-device nec-usb-xhci,idxhci ^-device usb-kbd,busxhci.0 ^-device usb-mouse,busxhci.0 ^-device virtio-net-device,netdevnet0 ^-netdev user,idnet0,hostfwdtcp::2223-:22 ^-drive file%DISK_FILE%,ifnone,idhd0,formatqcow2 ^-device virtio-blk-device,drivehd0 ^-cdrom %ISO_FILE% ^-name Ubuntu-22.04-ARM64-Installerecho.echo [信息] QEMU 进程已退出。pauseendlocalREM---------------------------------------------------------------------------------------------------------安装End-------------------------------------------------------------------------------------------REM---------------------------------------------------------------------------------------------------------启动----------------------------------------------------------------------------------------------echo offsetlocal enabledelayedexpansionREM REM 配置区域 (请根据实际情况修改路径)REM set ISO_FILEubuntu-22.04.5-live-server-arm64.isoset DISK_FILEubuntu-arm64.qcow2set BIOS_FILEQEMU_EFI.fdset QEMU_BINqemu-system-aarch64echo.echo [提示] 即将启动虚拟机...echo 1. 首次启动可能较慢请耐心等待 UEFI 自检和内核加载。echo 2. 如果窗口黑屏请点击窗口内部并按几次回车键。echo 3. 按 CtrlAltG 可释放鼠标焦点。echo.REM REM 启动命令REM 关键修改REM 1. 移除 ,glon 以避免 Windows 显卡驱动兼容性问题导致的黑屏/无响应REM 2. 使用 -display sdl 作为最通用的图形后端REM 3. 确保每行末尾的^ 后没有任何空格REM %QEMU_BIN% ^-M virt ^-cpu cortex-a72 ^-m 8G ^-smp 4 ^-bios %BIOS_FILE% ^-device virtio-gpu ^-display gtk,gloff ^-device nec-usb-xhci,idxhci ^-device usb-kbd,busxhci.0 ^-device usb-mouse,busxhci.0 ^-device virtio-net-device,netdevnet0 ^-netdev user,idnet0,hostfwdtcp::2223-:22 ^-drive file%DISK_FILE%,ifnone,idhd0,formatqcow2 ^-device virtio-blk-device,drivehd0 ^-name Ubuntu-22.04-ARM64-Installerecho.echo [信息] QEMU 进程已退出。pauseendlocalREM---------------------------------------------------------------------------------------------------------启动End----------------------------------------------------------------------------------------------