编译ZedBoard的linux镜像(uImage)

ZedBoard的linux源码可以从https://github.com/Xilinx/linux-xlnx网站下载
编译uImage的步骤:
进入linux目录下
1、make ARCH=arm xilinx_zynq_defconfig  使用arch/arm/configs中的默认配置文件配置linux内核,使用哪一个根据开发板决定。
 
2、make ARCH=arm 编译内核,在arch/arm/boot下生成Image和zImage
 
3、mkimage -A arm -O linux -T kernel -C none -a 00008000 -e 00008000  -d zImage uImage 将zImage拷贝到u-boot下的tools目录中(因为mkimage工具在该目录下),使用该命令生成uImage。命令中-a 和-e选项分别制定内核的加载地址和入口地址。
问题:入口地址按理说应该是加载地址加上0x40。但是如果设为-a 00008000 -e 00008040 ,会提示machine ID错误。不知道为什么会这样?
 
linux内核需要在zImage的头部加上64字节的u-boot信息来生成uImage,这样才能被u-boot识别。这是在u-boot的include/configs/zynq_common.h文件中决定的,  还有一种方法可通过修改zynq_common.h文件来让u-boot直接加载zImage(这个还没试过,参考文章http://xilinx.eetrend.com/blog/5845)
阅读终点,创作起航,您可以撰写心得或摘录文章要点写篇博文。去创作
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Linux 系统中,可以通过 `zlib` 库来进行 `gzip` 压缩和解压缩操作。如果要解压 `uImage.gz` 文件,可以使用 `zlib` 库提供的函数来完成。 下面是一个使用 `zlib` 库来解压 `uImage.gz` 文件的示例代码: ```c #include <stdio.h> #include <stdlib.h> #include <string.h> #include <zlib.h> #define CHUNK_SIZE 1024 int main(int argc, char *argv[]) { gzFile infile; char *outfile_name; FILE *outfile; char buffer[CHUNK_SIZE]; int bytes_read; int ret; if (argc < 2) { fprintf(stderr, "Usage: %s uImage.gz\n", argv[0]); return -1; } /* 打开 gzip 文件 */ infile = gzopen(argv[1], "rb"); if (!infile) { fprintf(stderr, "Error: failed to open %s\n", argv[1]); return -1; } /* 构造输出文件名 */ outfile_name = (char *)malloc(strlen(argv[1]) - 2); strncpy(outfile_name, argv[1], strlen(argv[1]) - 3); strcat(outfile_name, "\0"); /* 打开输出文件 */ outfile = fopen(outfile_name, "wb"); if (!outfile) { fprintf(stderr, "Error: failed to create %s\n", outfile_name); return -1; } /* 逐块解压并写入输出文件 */ while ((bytes_read = gzread(infile, buffer, CHUNK_SIZE)) > 0) { ret = fwrite(buffer, 1, bytes_read, outfile); if (ret < bytes_read) { fprintf(stderr, "Error: failed to write to %s\n", outfile_name); return -1; } } /* 关闭文件 */ gzclose(infile); fclose(outfile); free(outfile_name); printf("Done.\n"); return 0; } ``` 上面的代码中,我们先通过 `gzopen()` 函数打开 `uImage.gz` 文件,并指定以二进制(`"rb"`)方式打开。然后,我们通过 `malloc()` 函数动态分配内存,构造输出文件名,并打开输出文件。 接着,我们使用 `gzread()` 函数逐块从 `uImage.gz` 文件中读取数据,并通过 `fwrite()` 函数将解压后的数据写入到输出文件中。最后,我们通过 `gzclose()` 和 `fclose()` 函数关闭打开的文件,并使用 `free()` 函数释放动态分配的内存。 注意,在解压 `uImage.gz` 文件时,我们只需要解压文件头之后的数据部分,因此输出文件名中去掉了 ".gz" 后缀。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

EmSoftEn

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值