linux驱动编程2 : uboot、Linux内核、rootfs来源及制作流程

目录

一、uboot

1.来源

2.学习

3.编译流程

4.uboot烧录

[5. uboot内的文件](#5. uboot内的文件)

二、内核

1.来源

2.学习

3.内核编译流程

[4. Linux内核内的文件](#4. Linux内核内的文件)

三、根文件系统的制作

1.概念

2.制作

四、重点


一、uboot

1.来源

  1. 开源网站下载 uboot (2016/03版本): universal bootloader,可以支持不同硬件的启动
  2. NXP官方修改uboot(适配IMX6ULL平台)
  3. 正点原子修改uboot

2.学习

  1. uboot的编译
  2. uboot的使用(不涉及修改)
  3. 了解uboot功能:设置异常向量表,上电reset复位,关闭mmu关闭dcache,开启icache,初始化串口、初始化网口,学习uboot源代码(starts汇编代码),完成uboot的编译和适配
  4. 芯片原厂才开发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支持的命令源码,如bootmsetenv
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.来源

  1. 官网下载内核

2.学习

  1. 内核的编译
  2. 内核的裁剪
  3. 了解内核功能

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发行版,支持多架构和复杂包管理,但学习曲线较陡。

四、重点

  1. 如何在一个正在执行的程序中,添加新的代码
  2. 如何利用Linux内核中的框架来操作设备?
  3. 如何在MMU开启的情况下操作实际的物理地址
相关推荐
.柒宇.2 小时前
Ansible自动化运维实战笔记:环境搭建与四大核心模块详解
运维·自动化·ansible
啦啦啦_99992 小时前
1. Linux常用命令
linux·运维·服务器
大白菜和MySQL2 小时前
openEuler-20.03-LTS系统 nextcloud网盘搭建
linux
Harvy_没救了2 小时前
【Linux】Shell指令中的变量
linux·运维·服务器
Deitymoon2 小时前
linux——TCP多线程并发服务器
linux·服务器·tcp/ip
航Hang*2 小时前
Windows Server 配置与管理——第7章:配置DNS服务器
运维·服务器·网络·windows·安全·虚拟化
senijusene3 小时前
IMX6ULL Linux 驱动开发流程:从环境搭建到系统启动与内核编译
linux·运维·驱动开发
格林威3 小时前
AI视觉项目部署:Docker 部署视觉服务可行性分析
linux·运维·人工智能·数码相机·docker·容器·工业相机
江湖有缘3 小时前
极简部署Radicale:Docker快速搭建自托管日历 / 联系人服务
运维·docker·容器