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

为ARM架构4.9内核添加ZSTD压缩模式及编译报错解决

为ARM 4.9内核添加ZSTD压缩支持的完整步骤

一、解决当前编译报错(Syntax error: ";" unexpected)

你的报错来自arch/arm/boot/compressed/Makefile的piggy_data规则,原因是4.9内核的Makefile不支持6.7版本引入的compress-变量逻辑,直接添加compress-$(CONFIG_KERNEL_ZSTD) = zstd会导致生成的shell命令语法错误。解决方法:

  1. 移除你在arch/arm/boot/compressed/Makefile中添加的compress-$(CONFIG_KERNEL_ZSTD) = zstd这一行。
  2. 在该Makefile中找到piggy_data的生成规则,替换为适配ZSTD的分支逻辑:
    # 替换原piggy_data规则
    ifeq ($(CONFIG_KERNEL_ZSTD),y)
    piggy_data: $(obj)/piggy.zst FORCE
    else ifeq ($(CONFIG_KERNEL_GZIP),y)
    piggy_data: $(obj)/piggy.gz FORCE
    else ifeq ($(CONFIG_KERNEL_BZIP2),y)
    piggy_data: $(obj)/piggy.bz2 FORCE
    else ifeq ($(CONFIG_KERNEL_LZMA),y)
    piggy_data: $(obj)/piggy.lzma FORCE
    else ifeq ($(CONFIG_KERNEL_XZ),y)
    piggy_data: $(obj)/piggy.xz FORCE
    else ifeq ($(CONFIG_KERNEL_LZO),y)
    piggy_data: $(obj)/piggy.lzo FORCE
    else ifeq ($(CONFIG_KERNEL_LZ4),y)
    piggy_data: $(obj)/piggy.lz4 FORCE
    endif
    	$(call if_changed,objcopy)
    
  3. 在该Makefile中添加ZSTD压缩的规则和命令:
    # 添加ZSTD压缩命令定义
    quiet_cmd_zstd = ZSTD    $@
          cmd_zstd = zstd -19 --no-check $< -o $@  # 确保系统已安装zstd,或替换为scripts目录下的zstd工具路径
    
    # 添加piggy.zst生成规则
    $(obj)/piggy.zst: $(obj)/vmlinux.bin FORCE
    	$(call if_changed,zstd)
    

二、补全ZSTD解压依赖代码

4.9内核原生没有ZSTD的解压实现,你需要从高版本内核(如5.4或6.7)移植必要的代码:

  1. 从高版本内核中复制lib/decompress_unzstd.c到你的4.9内核源码的lib/目录。
  2. 从高版本内核中复制lib/zstd/目录下的核心解压文件到你的4.9内核lib/zstd/目录,至少需要:
    • zstd.h
    • zstd_decompress.c
    • zstd_decompress_internal.h
    • zstd_errors.h
  3. 修改arch/arm/boot/compressed/decompress.c,确保解压逻辑能调用ZSTD解压函数:
    • 保留你已添加的#ifdef CONFIG_KERNEL_ZSTD包含代码
    • 在解压函数的压缩类型判断分支中添加ZSTD的处理:
      // 在decompress.c的main解压逻辑中(如switch或if-else块)添加
      #ifdef CONFIG_KERNEL_ZSTD
      case 6:  // ZSTD对应的压缩标识,高版本内核中定义为ZSTD_COMPRESSION=6
          decompress_unzstd(input_data, input_len, output, error);
          break;
      #endif
      
    • 如果没有定义压缩标识宏,可以在decompress.c顶部添加:
      #define ZSTD_COMPRESSION 6
      

三、配置菜单添加ZSTD选项

  1. 在arch/arm/Kconfig中找到内核压缩方式的选择菜单(Kernel compression mode),添加ZSTD选项:
    choice
    	prompt "Kernel compression mode"
    	default CONFIG_KERNEL_GZIP
    	help
    	  Select the compression algorithm for the kernel.
    
    	config KERNEL_GZIP
    		bool "Gzip"
    	config KERNEL_BZIP2
    		bool "Bzip2"
    	config KERNEL_LZMA
    		bool "LZMA"
    	config KERNEL_XZ
    		bool "XZ"
    	config KERNEL_LZO
    		bool "LZO"
    	config KERNEL_LZ4
    		bool "LZ4"
    	config KERNEL_ZSTD
    		bool "ZSTD"
    endchoice
    
  2. 运行make menuconfig,在Kernel compression mode中选择ZSTD,保存配置。

四、编译验证

  1. 清理之前的编译产物:make clean
  2. 重新编译内核:make zImage(或你的目标镜像格式)

注意事项

  • 确保系统已安装ZSTD工具(sudo apt install zstd或对应包管理命令),否则需要将ZSTD可执行文件放入内核源码的scripts/目录,并修改Makefile中的cmd_zstd路径。
  • 移植代码时注意版本兼容性,优先选择接近4.9的高版本内核(如5.4)的ZSTD代码,减少适配工作量。
  • 如果解压阶段出现错误,可在decompress.c中添加调试打印,确认压缩标识是否匹配、解压函数是否正确调用。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.01 20:01:23