uboot

uboot分析:uboot启动内核

南楼画角 提交于 2019-12-24 03:53:27
(注:本文参考资料:朱有鹏嵌入式课程。本文为个人学习记录,如有错误,欢迎指正。) 1. U-Boot启动内核概述 U-Boot启动完成后,最终进入到main_loop()循环中。若在bootdelay倒计时为0之前,U-Boot控制台有输入,则进入命令解析-执行的循环;若控制台无输入,U-Boot将启动内核。 U-Boot启动内核可归结为以下四个步骤: 1)将内核搬移至DDR中; 2)校验内核格式、CRC; 3)准备传参; 4)跳转执行内核。 2. U-Boot启动内核过程分析 2.1 将内核搬移至DDR中 在/uboot/lib_arm/board.c->start_armboot()函数调用/uboot/common/main.c->main_loop()函数,main_loop()函数中包含了内核的启动代码。 s = getenv ("bootcmd"); //获取bootcmd环境变量的值 debug ("### main_loop: bootcmd=\"%s\"\n", s ? s : "<UNDEFINED>"); if (bootdelay >= 0 && s && !abortboot (bootdelay)) { ................................ #ifndef CFG_HUSH_PARSER        run_command

uboot启动内核分析

Deadly 提交于 2019-12-24 03:53:11
1. U-Boot启动内核概述 U-Boot启动完成后,最终进入到main_loop()循环中。若在bootdelay倒计时为0之前,U-Boot控制台有输入,则进入命令解析-执行的循环;若控制台无输入,U-Boot将启动内核。 U-Boot启动内核可归结为以下四个步骤: 1)将内核搬移至DDR中; 2)校验内核格式、CRC; 3)准备传参; 4)跳转执行内核。 2. U-Boot启动内核过程分析 2.1 将内核搬移至DDR中 在/uboot/lib_arm/board.c->start_armboot()函数调用/uboot/common/main.c->main_loop()函数,main_loop()函数中包含了内核的启动代码。 s = getenv ("bootcmd"); //获取bootcmd环境变量的值 debug ("### main_loop: bootcmd=\"%s\"\n", s ? s : "<UNDEFINED>"); if (bootdelay >= 0 && s && !abortboot (bootdelay)) { ................................ #ifndef CFG_HUSH_PARSER        run_command (s, 0); //执行bootcmd环境变量中的命令 .............

uImage和zImage的区别

烈酒焚心 提交于 2019-12-24 03:52:18
1、各种文件的意义 vmlinux 编译出来的最原始的内核文件,未压缩。 zImage 是 vmlinux经过gzip压缩后的文件。 bzImage bz表示“big zImage”,不是用bzip2压缩的。两者的不同之处在于,zImage解压缩内核到低端内存(第一个640K),bzImage解压缩内核到高端内存(1M以上)。如果内核比较小,那么采用zImage或bzImage都行,如果比较大应该用bzImage。 uImage U-boot专用的映像文件,它是在zImage之前加上一个长度为0x40的tag。 vmlinuz 是 bzImage/zImage文件的拷贝或指向bzImage/zImage的链接。 initrd 是 “initial ramdisk”的简写。一般被用来临时的引导硬件到实际内核vmlinuz能够接管并继续引导的状态。 2、zImage和uImage的区别 vmlinux是内核文件,zImage是一般情况下默认的压缩内核映像文件,压缩vmlinux,加上一段解压启动代码得到。而uImage则是使用工具mkimage对普通的压缩内核映像文件(zImage)加工而得。它是uboot专用的映像文件, 它是在zImage之前加上一个长度为64字节的“头”,说明这个内核的版本、加载位置、生成时间、大小等信息; 其0x40之后与zImage没区别

uboot里读sd卡内容

混江龙づ霸主 提交于 2019-12-20 07:14:06
1. sd卡升级命令 mmcinit 0 fatload mmc 0:1 0 uzImage.bin 80000 fatload mmc 0:1 1000000 initrd.gz 580000 bootm 0 2. U-Boot脚本 可以保存成nfs.script,放在tftp的根目录 setenv bootargs mem=214M root=/dev/nfsroot nfsroot=10.1.1.2:/home/nfs_android ip=dhcp rw console=ttyS0,115200n8 androidboot.console=ttyS0 init=/init lcdid=1 lpj=750000 如何加载呢 setenv bootcmd setenv ipaddr 10.1.1.3/;setenv serverip 10.1.1.2 / ;setenv gatewayip 10.1.1.1 / ;tftpboot 02000000 nfs.script / ;autoscr 这里/;把多个命令组成一个命令。 这里bootcmd引用bootargs U-Boot允许存储命令序列在纯文本文件中,用命令mkimage将该文件转换成脚本映像,该映像可用U-Boot命令autoscr执行。 转换成映像文件的方法列出如下: bash$ mkimage -T script

raspberry简单介绍1

随声附和 提交于 2019-12-18 21:46:43
树莓派的介绍 树莓派是了解嵌入式产品开发的绝好工具。它充分考虑了想学习嵌入式硬件和软件相关从业者(开发,架构,产品,销售)的感受,屏蔽了器件选择和搭配的门槛,缩短了硬件获取的周期。 硬件 视频接口:视频输出,视频输入 音频接口:音频输出 网络接口(有线口:以太网;无限口:wifi,BLE) 串口 USB 存储接口:SD slot 软件 源码可得 成品镜像可得 搭载开源的linux系统,赢得了大批用户。 参考资料 资料多,使用者广,交流信息多。 有待改进处, 验证APP应用可以,软件还需要性能优化。硬件与真实可用产品有差距。 主芯片BCM837资料不开源。(定制款芯片),且芯片内置ROM资料也不开源。 使用心得 确认硬件版本 raspberry硬件版本多样,如何确认使用了哪个版本。树莓派硬件版本区分在于主芯片上,使用命令pinout可以显示使用的主芯片。 软件信息 OS信息 软件启动流程 这个分区里存放bootcode.bin、config.txt、start.elf和u-boot.bin config.txt中 指定 kernel=kernel.img bootcode.bin: 启动文件 start.elf : 类似U-Boot的BootLoader文件 kernel.img: Linux内核文件 config.txt: 配置文件 从linux 命令行角度看文件系统类型: 1st

01_uboot的介绍、作用。

时光毁灭记忆、已成空白 提交于 2019-12-15 14:27:28
一、uboot的历史 1.uboot从哪里来的 u-boot全称 Universal Boot Loader,是遵循GPL条款的开放源码项目,U-Boot的作用是系统引导。 这个项目起源于 Magnus Damm.在 8xx PowerPC 架构下写的引导加载程序:8xxROM。1999 年十月,Wolfgang Denk 将项目移转到 SourceForge.net,但 SourceForge.net 不允许数字开头的项目名称,所以改名为PPCBoot。 uboot是Wolfgang Denk (德国人)在sourceforge.net的发起的开源项目,然后由整个网络感兴趣的人共同维护发展而来的BootLoader。 2.uboot的发展历程 自己使用的小开源项目->被更多人认可->被SOC厂商默认支持 经过多年的发展,uboot已经成为业内bootloader标准,大部分的嵌入式设备默认支持uboot。 2.uboot的版本号 早期的版本号类似:uboot1.3.4 现在的版本号类似:uboot-2010.06 uboot的核心部分没有怎么变化,越新的版本支持的开发板越多。 二、为什么要有uboot 1.计算机系统的组成部件 典型的计算机系统: 1)PC:台式机和笔记本… 2)嵌入式设备:手机、平板、游戏机… 3)单片机:家用电器、空调… 计算机系统的运行时主要核心部件:

Uboot编译错误

[亡魂溺海] 提交于 2019-12-11 23:59:56
第一个错误: include/configs/itop4412.h:75:2: error: expected identifier or '(' before string constant "bootenv=uEnv.txt\0" \ 错误代码上下文: #define CONFIG_EXTRA_ENV_SETTINGS \ "loadaddr=0x40007000\0" \ "rdaddr=0x48000000\0" \ "kerneladdr=0x40007000\0" \ "ramdiskaddr=0x48000000\0" \ "console=ttySAC2,115200n8\0" \ "mmcdev=0\0" \ /* Loading Environment from MMC... MMC Device 4 not found 去除开机警告 */ "bootenv=uEnv.txt\0" \ "dtb_addr=0x41000000\0" \ "dtb_name=exynos4412-itop-elite.dtb\0" \ "loadbootenv=load mmc ${mmcdev} ${loadaddr} ${bootenv}\0" \ "bootargs=root=/dev/mmcblk1p2 rw console=ttySAC2,115200 init=

linux/types.h:154:36: error: conflicting types for ‘uintmax_t’ typedef u_int32_t uintmax_t;

北城余情 提交于 2019-12-10 10:12:47
最近在海思3521d的平台编译fw_printer以及fw_write工具,在跑到Hi3521DV100_SDK_V1.0.5.0/osdrv/opensource/uboot/u-boot-2010.06这个路径下,执行make ARCH=arm CROSS_COMPILE=arm-hisiv500-linux- env之后,出现了一下报错: linux/types.h:154:36: error: conflicting types for ‘uintmax_t’ typedef u_int32_t uintmax_t; 在网上查询了一番解决办法之后,一群锤子胡乱说,但也有可能是每个人的情况不一样。我这边最后的解决办法是直接找到那个报错的头文件types.h,然后跑去报错的那一行直接注释掉相关的变量的定义就可以了,如下: 这样最终就编译通过了,编译通过之后记得重新打开这个注释,说不定后面重编uboot的时候有哪些部分会涉及到。 来源: CSDN 作者: Wilburn0 链接: https://blog.csdn.net/weixin_44362642/article/details/103469007

bootloder uboot 简介 make menuconfig

被刻印的时光 ゝ 提交于 2019-12-10 04:56:20
一个嵌入式系统从软件角度分为三个层次 1,引导加载程序 包含固化在固件中的boot程序(如BIOS),和Bootloader(如grub或lilo)两个部分。 2,linux内核 3,文件系统:包含应用程序和系统命令 BIOS在完成硬件检测和资源分配后,Bootloader将硬盘中的引导程序读到系统内存中,然后跳转到内存运行。 嵌入式系统一般没有boot,只需要bootloader,一种bootloader重新上电会跳到内存Flash 0x00000000开始执行。另一种bootloader 会进行一些硬件设备初始化,然后,跳转到bootloader指定的flash位置启动os内核。 编译bootloader 常用的指令 一般用 arm-linux-gcc hello.c -o hello 编译文件 反汇编命令 arm-linux-objdump -D -S hello >hello.txt (>hello.txt 把结果重定向到 hello.txt) ELF文件查看 arm-linux-readelf -a hello (可以查看大段小段模式,及运行平台) arm-linux-readeld -d hello (查看hello使用的动态链接库) 编译uboot的源文件boot中的主要目录 board 和开发板相关的文件 如board/samsung/smdk6410 common