求极简无依赖AArch64指令长度反汇编函数(内核驱动用)
极简AArch64指令长度判断函数(内核驱动适用)
一、A64指令集(纯64位ARM)
AArch64的A64指令集所有指令均为固定4字节长度,且要求4字节对齐。以下是无依赖的极简实现,可直接用于遍历函数指令:
#include <stdint.h> // 判断A64指令长度(固定返回4字节,可选添加合法性校验) uint32_t aarch64_insn_length(const uint32_t *insn_ptr) { // 可选:校验地址是否4字节对齐(A64指令强制要求,内核场景可根据需求保留) // if ((uintptr_t)insn_ptr & 0x3) { // return 0; // 非对齐地址,视为无效指令 // } // 可选:简单过滤明显无效的指令编码(示例) uint32_t insn = *insn_ptr; if ((insn & 0xFFFF0000) == 0xFFFF0000) { return 0; // 保留编码,视为无效 } return 4; }
使用说明
- 输入参数
insn_ptr需指向4字节对齐的内存地址,内核中需确保目标内存区域有可读权限。 - 若无需合法性校验,可简化为直接返回4,进一步降低代码体积。
二、Thumb-2指令集(AArch64兼容32位模式)
若需处理AArch64平台下的32位Thumb-2可变长度指令(16/32字节),以下是无依赖实现:
#include <stdint.h> // 判断Thumb-2指令长度(返回2或4字节) uint32_t thumb2_insn_length(const uint16_t *insn_ptr) { uint16_t first_half = *insn_ptr; // 32位Thumb指令的第一半编码特征:0xE800~0xEFFF 或 0xF000~0xF7FF if ((first_half & 0xF800) == 0xE800 || (first_half & 0xF800) == 0xF000) { return 4; } return 2; }
使用说明
- Thumb指令要求2字节对齐,输入
insn_ptr需满足对齐要求。 - 仅在处理32位模式代码时使用,内核中需注意内存访问的权限控制。
三、遍历函数指令示例(A64场景)
void traverse_a64_function(const uint32_t *func_start, uintptr_t func_size) { const uint32_t *current_insn = func_start; uintptr_t bytes_processed = 0; while (bytes_processed < func_size) { uint32_t insn_len = aarch64_insn_length(current_insn); if (insn_len == 0) break; // 遇到无效指令,终止遍历 // 此处添加指令处理逻辑(如记录地址、分析操作码等) // process_insn(current_insn); current_insn = (const uint32_t *)((uintptr_t)current_insn + insn_len); bytes_processed += insn_len; } }
内容的提问来源于stack exchange,提问作者5andr0
相关产品推荐
相关产品推荐

