DAY 1
学习嵌入式linux多次不了了之,这次每天记录随笔,鼓励自己。
本次学习打算以我熟悉的 STM32 Freertos 与LINUX作为对比来学习。
学习过程中会大量使用ai来代替百度,所以笔记中会出现大量的AI回答。
- 硬件
IMX6U 正点原子开发板 - 理清学习路线
优先Linux 移植
第二步 Linux 驱动开发
第三步 QT开发
LINUX移植
- 启动过程
NXP原厂程序->Uboot->LINUX内核->tootfs文件系统 - 类比STM32 freertos
启动.s文件->main函数 创建任务-> 开启调度器-> app
NXP原厂程序 等同与 stratup.s文件
uboot等同与STM32 __main main 函数
linux内核 等同与Freertos 的启动调度器
文件系统 等同与 Freertos的各个任务
以上只是简单的等同。
U-boot
首先学习Uboot,其实就是一个大的无操作系统运行的程序
uboot 官网为 http://www.denx.de/wiki/U-Boot/
在i.MX6的启动过程中通常包括以下几个步骤:
- 引导阶段:首先,i.MX6的Boot ROM会从存储介质中加载U-Boot的引导代码(通常是u-boot.imx文件)。这个引导代码会进行必要的硬件初始化和环境设置。
- U-Boot阶段:一旦引导代码执行完毕,U-Boot会接管控制权,并开始执行其主程序代码。在这个阶段,U-Boot会进行更详细的硬件初始化,并加载Linux内核映像和根文件系统。
- Linux内核启动阶段:当U-Boot完成其任务后,它会将控制权传递给Linux内核。Linux内核会进行最后的初始化工作,并启动用户空间的应用程序。
U-Boot的主要功能包括:
- 硬件设备初始化:在Linux内核加载之前,U-Boot会初始化必要的硬件设备,如内存、串口、网络等。这确保了Linux内核能够在稳定的环境中启动和运行。
- 加载操作系统内核:U-Boot会从存储介质(如NAND Flash、SD卡等)中加载Linux内核映像,并将其复制到内存中的特定位置。这是Linux内核能够正常启动的关键步骤。
- 配置Linux内核启动参数:U-Boot会设置Linux内核的启动参数,如根文件系统的位置、命令行参数等。这些参数对于Linux内核的启动和配置至关重要。
- 提供交互式命令行界面:U-Boot还提供了一个交互式的命令行界面,用户可以通过该界面进行设备配置、内存测试、文件系统操作、网络配置等操作。这对于调试和维护嵌入式系统非常有用。
- 支持多种文件系统:U-Boot支持多种文件系统,如FAT、EXT2/3/4、UBIFS等。这使得U-Boot能够加载和引导不同类型的根文件系统,从而增加了系统的灵活性和可移植性。
Uboot 源码与编译
- 源码
uboot 源码是给半导体厂商准备的,半导体厂商会下载 uboot 官方的 uboot 源码,然后将自家相应的芯片移植进去。也就是说半导体厂商会自己维护一个版本的 uboot,这个版本的 uboot 相当于是他们定制的。既然是定制的,那么肯定对自家的芯片支持会很全,虽然 uboot 官网的源码中一般也会支持他们的芯片,但是绝对是没有半导体厂商自己维护的 uboot 全面。
NXP 就维护 的 2016.03 这 个 版 本 的 uboot , 下 载 地 址 为 :
http://git.freescale.com/git/cgit.cgi/imx/uboot-imx.git/tag/?h=imx_v2016.03_4.1.15_2.0.0_ga&id=
rel_imx_4.1.15_2.1.0_ga
- 编译
arm-linux-gnueabihf- 官方指定编译器
The GNU C compiler for armhf architecture
C编译器是一切的源头
Uboot 烧写与启动
- 存储位置在SD卡 或 EMMC 调试在SD卡 烧写方便
产品在EMMC NXP 提供的 MFGTools 工具向开发板烧写 uboot - 启动就和STM32一样,通过IO口设置启动方式就可以了。
Uboot 源码架构概览
- arh/arm/cpu/armv7 架构相关
- arh/arm/cpu/u-boot.lds 链接脚本文件
- arh/arm/imx-common
- board/freescale/mx6ullevk NXP官方的开发版 正点原子修改该文件夹来适配自己的开发板 开发产品同理
- configs 配置文件
mx6ull_14x14_ddr512_emmc_defconfig 和 mx6ull_14x14_ddr256_nand_defconfig
这两个文件,分别是正点原子 I.MX6ULL EMMC 核心板和 NAND 核心板的配置文件
使用“make xxx_defconfig”命令即可配置 uboot
在编译 uboot 之前一定要使用 defconfig 来配置 uboot! - u-boot.xxx_cmd 文件
命令文件,各种sh命令的集合 - u-boot.xxx文件
u-boot:编译出来的 ELF 格式的 uboot 镜像文件。
u-boot.bin:编译出来的二进制格式的 uboot 可执行镜像文件。
u-boot.cfg:uboot 的另外一种配置文件。
u-boot.imx:u-boot.bin 添加头部信息以后的文件,NXP 的 CPU 专用文件。
u-boot.lds:链接脚本。
u-boot.map:uboot 映射文件,通过查看此文件可以知道某个函数被链接到了哪个地址上。
u-boot.srec:S-Record 格式的镜像文件。
u-boot.sym:uboot 符号文件。
u-boot-nodtb.bin:和 u-boot.bin 一样,u-boot.bin 就是 u-boot-nodtb.bin 的复制文件。 - config 文件
.config 文件中都是以“CONFIG_”开始的配置项,这些配置项就是 Makefile 中的变量,因此后面都跟有相应的值,uboot 的顶层 Makefile 或子 Makefile 会调用这些变量值。在.config 中会有大量的变量值为‘y’,这些为‘y’的变量一般用于控制某项功能是否使能,为
‘y’的话就表示功能使能 - makefile文件
它是一个描述文件,定义了如何编译和链接U-Boot的源代码,以生成最终的U-Boot二进制文件。
Makefile文件由多个规则组成,每个规则由目标、依赖和命令组成。这些规则描述了如何生成目标文件、如何编译源文件、如何链接目标文件等。Makefile文件支持变量和函数,可以帮助我们更灵活地配置和编写规则。
在U-Boot的编译过程中,Makefile文件会解析源程序之间的依赖关系,根据依赖关系自动维护编译工作。它还可以直接集成操作系统中的各种命令,并执行这些命令来完成编译和构建过程。
此外,Makefile文件还支持嵌套,也就是说,顶层的Makefile文件可以调用子目录中的Makefile文件。这在大型项目中很常见,因为大型项目通常会将不同的功能模块分开存放,各自拥有自己的Makefile文件。通过嵌套Makefile文件,可以更方便地管理和维护这些模块。
u-boot 顶层makefile
回头再详细学习,当下细看容易卡在这。
简单理解为makefile 等同与KEIL
学习linux一定要适应没有集成式开发环境。
KEIL会帮助你管理各个文件的关系,联系起整个工程的各个文件并输出正确的可执行文件。
make命令相当于 KEIL的build
U-boot关注的重点就2个,配置和编译
make xxx_defconfig:用于配置 uboot,这个命令最主要的目的就是生成.config 文件。
make:用于编译 uboot,这个命令的主要工作就是生成二进制的 u-boot.bin 文件和其他的一
些与 uboot 有关的文件,比如 u-boot.imx 等等。
我们的重点是使用 uboot,而不是 uboot 的研究者,我们要做的是缕清 uboot 的流程。