uboot 相关




bootloader:初始化硬件 & 加载OS


要初始化的硬件:
CLOCK (24MHz)
内存
Nand Flash
1 Device= 2048 Block
1 Block = 64 Pages
1 Page  = 2K + 64
UART (66MHz)
要关闭的硬件:
Watch-Dog
Interrupt
 
bootloader过程
硬件:
1) 关闭干扰芯片启动的硬件
Watch-Dog
Interrupt
2) 时钟初始化
3) 内存SDRAM/DDRAM初始化
4) Nand Flash初始化
注意:#1 2) 和 3)不能颠倒顺序?
    #2 调试手段:LED、BEEP、UART


从Nand Flash启动:
    Nand Flash中 
Bootloader
Linux
rootfs
  #1 iROM 先把 Nand Flash 中的 Bootloader的前16K(足够初始化硬件) 复制到210的iRAM(96K)中,初始化硬件
#2 待 DDRAM 初始化完成后,把 Nand Flash 中全部的Bloader 复制到DDRAM中
#3 核再到 DDRAM 中,从刚才执行到的地方加载执行


软件:
1) Bootloader 自拷贝到 DRAM 中 (防止iRAM的空间不够用)
2) 程序流切换到DRAM (CPU从iRAM中执行——>从DRAM中执行)
3) 用户选择进入模式:加载OS or Shell








1) 彻底删除:make distclean
2) make ARCH=arm CROSS_COMPLIE=arm-linux- all tiny210_config 
3)  make ARCH=arm CROSS_COMPLIE=arm-linux- all spl (库文件的绝对路径)


如何往板子上烧写:
方法1) 外部烧写器直接烧 较贵
方法2) #1 先将u-boot download到板子的内存中,
       #2 再用nand命令将u-boot烧写到板子上




方法2)实现
@将tiny210-uboot.bin烧写到SD卡中
#1 在210的目录下,找到sdb,表示识别读卡器
  sudo dd iflag=dsync oflag=dsync if=tiny210-uboot.bin of=/dev/sdb seek=1


dd: 复制
iflag:输入文件  dsync:同步
oflag:输出文件
if:要复制的文件
seek:要烧到的块号 (从1开始,不允许从0开始)


@@将 SD 卡中的 tiny210-uboot.bin 烧写到 Nand Flash
#2 在kermit中loadb,send tiny210-uboot.bin
#3 nand erase.chip
#4 nand write 0x21000000 offset size (offset:0 size:send过去的tiny210-uboot.bin)
#5 关机,从Nand Flash上启动,看到

1.进入uboot,执行 ./MAKEALL -a arm -c arm920t -s s3c24x0  可以找出和你要进行移植板子芯片相近的平台。



2.查看boards.cfg文件,里面定义了u-boot当前已经支持的板子,要想移植新板子的话需在这里面添加新版子的配置信息。
如:复制smdk2410这行的配置,然后在/include/configs/下拷贝smdk2410.h为akae2440.h,此时在u-boot目录下执行make O=../ubootbin akae2440_config  然后make O=../ubootbin 编译时由于找不到/board/samsung/akae2440目录会出错,拷贝smdk410目录到akae2440目录,并且修改里面的smdk2410.c为akae2440.c,修改/board/samsung/akae2440/Makefile中smdk2410.o改为akae2440.o。
此时应该可以make 编译生成u-boot.bin。下一步再从具体的文件进行修改。
移植/arch/arm/cpu/arm920t/start.s文件,CONFIG_SKIP_LOWLEVEL_INIT定义是否把内存初始化分bank这件事编译到uboot中运行,如果uboot从ram中执行,则不必编译进去,如从nand里启动的话,必须做内存的初始化和cache及mmu的初始化操作。
在call_board_init_f函数中,设置SP,GENERATED_GBL_DATA_SIZE 此变量在/lib/asm-offset.c中定义,计算出栈的最佳大小。
board_init_f函数在/arch/arm/lib/board.c中定义,其中用到两个非常重要的结构体,bd_t在/arch/arm/include/asm/u-boot.h中定义,gd_t在/arch/arm/include/asm/global_data.h中定义。


main_loop在common/main.c中定义。
<think>嗯,用户让我整理一下嵌入式面试中关于U-Boot的相关问题。首先,我需要回想一下U-Boot的基本概念,它在嵌入式系统中的作用是什么。U-Boot是一个开源的引导加载程序,主要用于嵌入式设备的启动过程,初始化硬件,加载操作系统内核。那面试官可能会问它的基本功能,比如启动流程、环境变量、移植过程等等。 接下来,我应该分门别类地整理这些问题。用户可能需要的是结构化的回答,所以得分成不同的部分,比如基本概念、启动流程、配置与编译、调试与使用、进阶问题等。每个部分下再列出具体的问题,并给出简要的解答,这样用户看起来清晰明了。 然后,我得考虑用户可能的背景。他们可能是准备面试的嵌入式开发者,或者刚入行的新人,需要了解常见的面试问题。因此,问题需要覆盖基础知识和一些深入的内容,比如U-Boot和BIOS的区别,如何移植到新硬件,以及网络启动的配置方法等。 另外,用户提供的系统级指令中提到,数学表达式要用$...$,但在这个主题中可能用不上。不过需要注意中英文标点和格式的正确性。还要确保回答使用中文,结构清晰,步骤明确。 可能还需要考虑一些实际应用场景,比如U-Boot的环境变量存储在哪里,如何修复无法保存环境变量的问题。这些问题在实际开发中可能会遇到,面试中也常被问到。此外,调试方法如串口输出和网络调试,也是重点。 最后,要检查答案的准确性和全面性,确保覆盖常见的面试问题,同时不出现技术错误。比如,启动流程的阶段、Makefile配置选项的区别,以及设备树在U-Boot中的作用等,都需要准确描述。</think>以下是嵌入式面试中与 **U-Boot** 相关的常见问题整理,按知识层级分类: --- ### **一、基础概念** 1. **U-Boot 是什么?作用是什么?** - U-Boot(Universal Bootloader)是嵌入式系统中广泛使用的开源引导加载程序,负责初始化硬件、加载操作系统内核并传递参数。 2. **U-Boot 与 BIOS 的区别?** - BIOS 是 PC 的固件,提供硬件初始化和启动服务;U-Boot 是嵌入式领域的引导程序,支持多种架构(ARM、MIPS 等),且可深度定制。 3. **U-Boot 的环境变量(Environment Variables)有什么作用?存储在哪里?** - 用于配置启动参数(如 `bootcmd`、`bootargs`),通常存储在 Flash 的特定分区或 EEPROM 中。 --- ### **二、启动流程** 4. **描述 U-Boot 的启动流程** 典型流程: 1. 执行 ROM Code(固化在芯片中) 2. 加载 U-Boot 的 SPL(Secondary Program Loader) 3. 初始化硬件(时钟、DDR、外设) 4. 加载完整 U-Boot 5. 执行 `bootcmd` 命令(加载内核、设备树、根文件系统) 5. **如何修改 U-Boot 的默认启动命令?** - 通过修改环境变量 `bootcmd`,例如: ```bash setenv bootcmd 'load mmc 0:1 0x80008000 zImage; bootz 0x80008000' saveenv ``` --- ### **三、配置与编译** 6. **如何为特定板卡编译 U-Boot?** - 步骤: ```bash make <board_name>_defconfig # 例如 make mx6ull_14x14_evk_defconfig make ``` - 输出文件:`u-boot.bin`(二进制镜像)。 7. **`u-boot.bin` 和 `u-boot.imx` 的区别?** - `u-boot.bin` 是纯二进制文件;`u-boot.imx` 是添加了 NXP i.MX 芯片头部信息的镜像,用于引导 ROM 识别。 --- ### **四、调试与使用** 8. **如何通过 U-Boot 更新内核?** - 示例(通过 TFTP 下载): ```bash tftp 0x82000000 zImage # 下载内核到内存 mmc write 0x82000000 0x800 0x2000 # 写入 MMC 的指定分区 ``` 9. **U-Boot 如何支持网络启动?** - 需配置网络驱动、IP 地址、TFTP 服务器地址,例如: ```bash setenv serverip 192.168.1.100 setenv ipaddr 192.168.1.200 tftp 0x82000000 uImage ``` 10. **U-Boot 无法保存环境变量的可能原因?** - Flash 分区未正确配置; - 存储介质损坏; - 环境变量地址与分区布局不匹配。 --- ### **五、进阶问题** 11. **如何移植 U-Boot 到新硬件平台?** - 关键步骤: 1. 添加板级支持文件(如 `board/<vendor>/<board>`) 2. 配置时钟、DDR 初始化代码 3. 适配设备驱动(如网卡、Flash) 4. 修改设备树(`dts` 文件) 12. **U-Boot 如何与设备树(Device Tree)配合工作?** - U-Boot 将设备树(`.dtb`)加载到内存并传递给内核,内核根据设备树初始化硬件。 13. **解释 U-Boot 的 SPL 和 TPL 阶段** - SPL(Secondary Program Loader):初始化关键硬件并加载完整 U-Boot; - TPL(Tertiary Program Loader):在资源极度受限的系统中使用(较少见)。 --- ### **六、实用命令** 14. **常用 U-Boot 命令** - `printenv`:查看环境变量 - `mmc read/write`:读写 MMC/SD 卡 - `tftp`:通过 TFTP 传输文件 - `bootm`:启动内核镜像 - `md`:显示内存内容 --- ### **七、高频考点总结** - **启动流程**:理解各阶段分工(ROM Code → SPL → U-Boot → Kernel); - **环境变量**:配置与存储机制; - **移植与调试**:硬件适配和问题排查思路; - **设备树**:U-Boot 与内核的协作关系。 建议结合具体项目经验,准备实际调试案例(如修复启动失败、优化启动速度等)以增强回答深度。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值