struct xz_buf b; struct xz_dec *s; xz_crc32_init(); /* * Support up to 64 MiB dictionary. The actually needed memory * is allocated once the headers have been parsed. */ s = xz_dec_init(XZ_SINGLE, 16*1024); if(s==NULL) { printf("xz_dec_init ERROR!!\n"); } b.in = (unsigned char*)(CONFIG_LOADADDR + NORMAL_BOOT_IMAGE_OFFSET); //ignore 40 bytes image header b.in_pos = 0; b.in_size = NORMAL_BOOT_IMAGE_SIZE; b.out = (unsigned char*)(NORMAL_BOOT_LOADADDR); b.out_pos = 0; b.out_size = NORMAL_BOOT_MAX_SIZE; printf("XZ params: in_addr 0x%x, in_size 0x%x, out_addr 0x%x, out_size 0x%x\n", (unsigned int)b.in, (unsigned int)b.in_size, (unsigned int)b.out, (unsigned int)b.out_size); ret = xz_dec_run(s, &b); printf("XZ: uncompress ret %d, size = %d\n", ret, b.out_size); xz_dec_end(s); /*?a??¨¬?¡Áaubooto¨®uboot???¡¥¨°¨¬3¡ê?¨º¨¬a¡ê??¨®¨¦?cache2¨´¡Á¡Â¡ê??¡ä¨º1cache?¡ä?a¨°2??¨®¡ã?¨¬*/ flush_dcache_all(); invalidate_icache_all();
时间: 2024-03-29 17:35:06 浏览: 89
struct_vc.rar_VC 数据结构_struct VC_vc SeqList
这段代码实现了使用xz解压缩算法解压缩一个Linux内核镜像文件,并将解压缩后的结果存放在指定的内存地址中。
首先定义了一个结构体xz_buf b,用于存放输入和输出的缓冲区以及它们的长度。然后通过调用xz_crc32_init()函数进行CRC校验的初始化。接下来调用xz_dec_init()函数初始化一个用于解压缩的结构体指针s,其中XZ_SINGLE表示使用单个压缩流,16*1024表示解压缩使用的字典大小为16KB。
随后将要解压缩的Linux内核镜像文件的地址和长度存放在结构体b的in成员和in_size成员中,解压缩后的结果存放在结构体b的out成员中。这里需要注意的是,在输入缓冲区中忽略了40字节的Linux内核镜像文件头。接着调用xz_dec_run()函数进行解压缩,解压缩后的结果存放在结构体b的out成员中,解压缩函数返回的值表示解压缩是否成功。
最后打印出解压缩结果的信息,包括解压缩函数的返回值和解压缩后输出缓冲区的大小。调用xz_dec_end()函数释放用于解压缩的内存空间。最后调用flush_dcache_all()和invalidate_icache_all()函数,刷新缓存和清除指令缓存。
阅读全文