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支持的命令源码,如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.来源

  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开启的情况下操作实际的物理地址
相关推荐
KIDULT°8 小时前
MySQL系列 (1):数据库原理
运维·数据库·mysql·云计算
别动我齐刘海9 小时前
C++ 工程化学习
java·linux·前端·c++·学习·机器学习·机器人
wewowilling11 小时前
认识微服务
java·运维·微服务·springcloud
玖石书11 小时前
Ubuntu 24.04 UFW 全命令攻略:从入门到端口开放实战
linux·运维·ubuntu
xiaoqiMikko11 小时前
Linux 实战(七):useradd、sudoers、umask、SGID、软链 —— 三台真机实测
linux·centos
weifont13 小时前
自动化抓取和上架商品:能不动手,就少动手
运维·前端·自动化
拂拉氏13 小时前
【知识讲解】 Linux之动静态库的了解
linux·运维·服务器·动静态库
Fcy64814 小时前
Linux下 五种IO模型的认识与⾮阻塞IO的实现
linux·服务器·io
Mikko714 小时前
Linux 重启后日志没了?进程被 OOM 杀了去哪看?logrotate 之后日志还往旧文件写?三台真机实测日志与性能排查
linux·运维·centos
书生执笔画浮沉14 小时前
分享一个开源小工具CAdapt
linux·c·gnu·glibc·kernel·升级·灵感