xz的ARM64架构BCJ过滤器如何处理ADRP指令?
xz的ARM64架构BCJ过滤器如何处理ADRP指令?
嘿,我来给你掰扯掰扯xz里ARM64的BCJ过滤器是怎么处理ADRP指令的哈!
首先得先搞懂ADRP指令本身是干啥的——它是ARM64架构里用来生成PC相对的4KB页起始地址的位置相关指令,程序加载到不同内存地址时,这类指令的字段需要调整才能正常工作,而BCJ过滤器的核心就是专门啃这类位置相关的地址生成、分支指令,给后面的压缩步骤铺路。
压缩阶段的处理逻辑
- 第一步就是识别ADRP指令:过滤器会逐行扫ARM64的指令流,靠ADRP指令特有的编码位模式(比如 opcode 段的特征值)把它从一堆指令里揪出来。
- 接着是偏移转换:一旦认出是ADRP,就会提取指令里和页偏移相关的字段,计算出这个字段对应的实际地址偏移和当前PC的关联,然后把这个原本和加载地址绑定的偏移,转换成一个相对的、更有压缩潜力的数值,同时悄悄记下这个指令的位置和转换的关键信息,留着解压的时候用。
- 这么干的原因很简单:ADRP的原始偏移值随机性比较强,直接压缩的话冗余度低,经过转换后这些数值会变得更有规律,后面的LZMA压缩就能把它们压得更小。
解压阶段的还原逻辑
当解压到被处理过的ADRP指令时,过滤器就会拿出压缩时记下的转换信息:
- 先把之前转码过的偏移值还原成原本的格式,再结合程序实际加载的基地址,修正ADRP指令里的对应字段。
- 这里特别要注意,ADRP是和当前PC绑定的,所以修正的时候必须对应上指令运行时的实际PC地址,确保它能精准生成目标4KB页的起始地址,不会因为程序加载位置变了就掉链子。
其实思路和7zip里的ARM64 BCJ处理挺像的,核心都是针对ADRP的位置相关性做偏移转换,但xz的实现会更贴合自身的LZMA2压缩流程,专门优化了转换后数值的分布,能榨出更高的压缩率。
内容来源于stack exchange
相关产品推荐
相关产品推荐

