目录
[5. uboot内的文件](#5. uboot内的文件)
[4. Linux内核内的文件](#4. Linux内核内的文件)
一、uboot
1.来源
- 开源网站下载 uboot (2016/03版本): universal bootloader,可以支持不同硬件的启动
- NXP官方修改uboot(适配IMX6ULL平台)
- 正点原子修改uboot
2.学习
- uboot的编译
- uboot的使用(不涉及修改)
- 了解uboot功能:设置异常向量表,上电reset复位,关闭mmu关闭dcache,开启icache,初始化串口、初始化网口,学习uboot源代码(starts汇编代码),完成uboot的编译和适配
- 芯片原厂才开发uboot,否则都是学习使用
3.编译流程
将下载好的uboot源码复制到乌班图:
解压:
创建uboot目录,把上一步的文件移动进去
进入uboot目录,装uboot图形界面库(基于ncurses库编写的)
编译uboot源码(深度清理-使用正点原子默认.config-编译)
结果
注意:.config也可自己去配(用户自己裁剪功能)
编译流程总结:

4.uboot****烧录
在 Ubuntu 下利用 imxdownload 完成 u-boot.imx 烧写
./imxdownload u-boot.bin /dev/sdd
5. uboot内的文件
| 名称 | 功能说明 |
|---|---|
api |
提供U-Boot的应用程序接口,用于上层应用与U-Boot的交互。与架构无关 |
arch |
体系架构相关代码,如ARM、x86等,包含CPU启动、初始化代码 |
board |
不同开发板的具体支持代码,包含板级初始化和配置 |
cmd |
存放U-Boot支持的命令源码,如bootm、setenv等 |
common |
通用功能代码,如命令行解析、环境变量处理等 |
disk |
磁盘驱动相关代码,支持硬盘、U盘等存储设备 |
doc |
文档文件,包含使用说明、开发指南等 |
drivers |
设备驱动代码,如网卡、串口、LCD等驱动 |
dts |
设备树源码,用于描述硬件配置和设备信息 |
examples |
示例程序,展示如何使用U-Boot的API和功能 |
fs |
文件系统支持,如FAT、EXT4、JFFS2等 |
include |
头文件集合,包含全局定义、数据结构、函数声明等 |
lib |
通用库函数,如字符串处理、数学运算、压缩解压等 |
licenses |
许可证文件,包含U-Boot使用的开源许可证文本 |
net |
网络协议栈实现,支持TFTP、NFS、Ping等网络功能 |
post |
上电自检(POST)相关代码,用于硬件检测和诊断 |
scripts |
构建和配置脚本,用于编译、打包、生成镜像等 |
test |
测试代码,用于验证U-Boot功能和稳定性 |
tools |
工具程序,如mkimage(生成U-Boot镜像)、env工具等 |
Kconfig |
内核配置菜单的配置文件,用于make menuconfig生成配置界面 |
Kbuild |
内核构建系统的Makefile片段,指导如何编译模块和代码 |
MAINTAINERS |
维护者列表,记录各个模块的负责人和联系方式 |
MAKEALL |
辅助构建脚本,用于一键编译多个目标平台 |
Makefile |
顶层Makefile,控制整个U-Boot的编译过程 |
README |
项目说明文件,包含简要介绍、构建步骤和注意事项 |
System.map |
符号映射文件,记录编译后内核符号的地址信息(编译后生成) |
build.sh |
构建脚本,通常用于简化编译流程(可能为项目自定义) |
config.mk |
全局配置文件,定义编译选项、工具链路径等 |
configs |
预置配置文件目录,包含不同开发板的默认配置文件(如mx6ull_14x14_evk_defconfig) |
snapshot.commit |
快照提交记录,用于记录当前代码版本信息 |
u-boot |
编译生成的ELF格式可执行文件,可直接调试或用于生成镜像 |
u-boot.bin |
裸机二进制镜像,可直接烧写到Flash中运行 |
u-boot.cfg |
配置文件,记录编译时的配置选项(编译后生成) |
u-boot.img |
打包后的U-Boot镜像,可能包含头部信息,用于特定启动方式(编译后生成) |
u-boot.lds |
链接脚本,控制代码和数据在内存中的布局 |
u-boot.map |
链接映射文件,详细记录各个段和符号的地址分布(编译后生成) |
二、内核
1.来源
- 官网下载内核
2.学习
- 内核的编译
- 内核的裁剪
- 了解内核功能
3.内核编译流程
官网下载内核(4.1.15版本)
下载内核源码
将内核源码复制到乌班图:
解压
深度清理
使用默认.config(它来自defconfig)
也可以手动增删config------>内核裁剪
编译
①下载软件,它负责对内核压缩
②编译
编译好的文件
由于我使用的是网络启动模式,所以将这两个文件复制到tstp文件夹
内核编译流程总结:

4. Linux内核内的文件
| 文件/文件夹名 | 类型 | 功能说明 |
|---|---|---|
| arch | 目录 | 体系结构相关代码,包含不同CPU架构的特定代码(如ARM、x86等) |
| block | 目录 | 块设备层代码,管理磁盘等块设备的通用逻辑 |
| COPYING | 文件 | 内核许可证文件(通常是GPLv2) |
| CREDITS | 文件 | 贡献者名单,记录对内核有贡献的人员信息 |
| crypto | 目录 | 加密算法实现,提供各种加密、哈希算法支持 |
| Documentation | 目录 | 内核文档,包含大量使用和开发文档 |
| drivers | 目录 | 设备驱动程序,包含各种硬件设备驱动(如USB、网络、显卡等) |
| firmware | 目录 | 固件文件,包含某些设备需要的二进制固件 |
| fs | 目录 | 文件系统实现,支持ext4、FAT、NTFS等各种文件系统 |
| include | 目录 | 内核头文件,包含公共头文件和体系结构相关头文件 |
| init | 目录 | 内核初始化代码,包含main.c和启动初始化流程 |
| ipc | 目录 | 进程间通信实现,如信号量、共享内存、消息队列等 |
| Kbuild | 文件 | 内核构建系统的Makefile配置 |
| Kconfig | 文件 | 内核配置菜单的配置文件,用于make menuconfig |
| kernel | 目录 | 内核核心代码,包含进程调度、定时器、中断处理等 |
| lib | 目录 | 内核库函数,提供通用数据结构、字符串处理、CRC校验等 |
| MAINTAINERS | 文件 | 维护者列表,记录各个子系统的维护者联系信息 |
| Makefile | 文件 | 顶层Makefile,控制整个内核的编译过程 |
| mm | 目录 | 内存管理代码,包含虚拟内存、物理内存、页表管理等 |
| Module.symvers | 文件 | 模块符号版本信息(编译后生成) |
| modules.builtin | 文件 | 内置模块列表(编译后生成) |
| modules.order | 文件 | 模块编译顺序(编译后生成) |
| mx6ull_14x14-evk_nand.sh | 文件 | 针对i.MX6ULL开发板的NAND Flash编译脚本(项目特定) |
| mx6ull_allentek_emmc.sh | 文件 | 针对i.MX6ULL开发板的eMMC编译脚本(项目特定) |
| mx6ull_allentek_nand.sh | 文件 | 针对i.MX6ULL开发板的NAND Flash编译脚本(项目特定) |
| net | 目录 | 网络协议栈实现,包含TCP/IP、网络设备驱动等 |
| README | 文件 | 内核简要说明和构建指导文档 |
| REPORTING-BUGS | 文件 | 报告bug的指南文档 |
| samples | 目录 | 示例代码,展示如何使用内核的各种特性 |
| scripts | 目录 | 构建和配置脚本,如配置内核、编译模块的工具 |
| security | 目录 | 安全模块,如SELinux、AppArmor等 |
| sound | 目录 | 音频子系统,包含声卡驱动和音频框架 |
| System.map | 文件 | 内核符号表,映射函数和变量的地址(编译后生成) |
| tools | 目录 | 用户空间工具,包含性能分析、测试工具等 |
| usr | 目录 | 早期用户空间支持(initramfs相关) |
| virt | 目录 | 虚拟化支持,如KVM虚拟化代码 |
| vmlinux | 文件 | 编译出的未压缩内核ELF文件(可执行文件) |
| vmlinux.dis | 文件 | 反汇编文件,用于调试和分析(编译后生成) |
| linux.code-workspace | 文件 | VS Code工作区配置文件(项目特定,非内核标准文件) |
三、根文件系统的制作
1.概念
根文件系统是 Linux 操作系统组成的基础,是内核启动时所要挂载的第一个文件系统,我们的一些配置文件、库函数、系统命令都保存在文件系统中,同时也可以通过文件系统实现用户与操作系统功能的交互。
2.制作
根文件系统的制作软件常见有如下3种:
| 软件 | 特点 |
|---|---|
| busybox | 易于构建简单的根文件系统,而且 文件系统占用空间小,但是需要自己配置库文件,易于理解移植过程。但是制作复杂 |
| Buildroot | 自动化构建嵌入式Linux系统的工具,可生成交叉编译工具链、根文件系统、内核和引导程序,配置灵活,适合中小型项目。 |
| Yocto | 功能强大的嵌入式Linux构建框架,提供高度定制化、可重复构建的完整Linux发行版,支持多架构和复杂包管理,但学习曲线较陡。 |
四、重点
- 如何在一个正在执行的程序中,添加新的代码
- 如何利用Linux内核中的框架来操作设备?
- 如何在MMU开启的情况下操作实际的物理地址





















