嵌入式Linux系统组成
嵌入式Linux系统软件由三部分组成:
- BootLoader(uboot)裸板软件,初始化硬件+从闪存加载内核到内存并且启动内核+给内核传递启动参数,告诉内核根文件系统rootfs在什么地方。(上电运行,内核启动后结束)
- Linux内核(kernel):Linux系统7大功能,管理进程、管理内存、文件系统、设备控制、网络管理。掉电结束。
- 根文件系统(rootfs):
- bin:各种命令。
- sbin:各种超级用户的命令。
- lib:标准系统库。
- etc:各种服务的配置(tftpd-hpa,nfs)
- dev:存放设备文件
- sys:存放虚拟文件系统sysfs相关内容
- proc:存放虚拟文件系统procfs相关内容
- usr:存放其他命令
嵌入式Linux系统的启动流程
- 上电CPU运行uboot
- uboot根据bootcmd加载启动内核并且通过bootargs给系统传递参数。
- 内核启动,完成7大功能。
- 内核最后根据uboot传递的bootargs到某个地方找到根文件系统rootfs
- 一旦找到根文件系统rootfs,控制权交给根文件系统。
- 内核会运行第一号进程/sbin/init
- /sbin/init穿件子进程,子进程执行/bin/sh
- shell程序启动,用户即可输入各种Linux命令。
uboot制作
uboot特点
uboot是一款著名的开源软件,德国的denx开发小组维护。
uboot支持多种处理器架构(x86、ARM、PowerPC、MIPS、FPGA、dsp)
uboot支持多种多样的硬件开发板
uboot支持引导多种操作系统(Linux、VxWorks)
uboot支持多种多样的文件系统格式(ext4、ext2、fat32)
uboot支持多种多样的硬件外设的设备驱动(应哦按驱动,SD卡驱动等)
uboot本质就是一个裸板程序,知识这个裸板程序很复杂。
uboot上电执行,内核启动结束uboot运行。
uboot三大功能
硬件初始化功能
必要的硬件初始化
- 初始化CPU的cache(缓存)
- 初始化始终(CPU主频,UART时钟等等)
- 初始化内存
- 初始化闪存
- 初始化UART(调试串口)
- 初始化网卡(下载使用)
- 关闭中断(避免嵌入式Linux系统启动时被打断,造成系统启动时间加长,等系统正式启动完毕再处理中断)
- 关闭看门狗(避免嵌入式Linux系统启动时看门狗给CPU发送复位信号,等待系统正式启动完毕再开启看门狗)
可选硬件初始化:
- 由于内核启动,uboot的生命周期就要结束,并且uboot之前所做的硬件初始化工作无效(内核重新硬件初始化),没有必要在uboot中做大量的硬件初始化代码,如果做了会影响系统的启动时间,所以uboot有些外设是否初始化完全根据用户需求来定。
引导加载内核
setenv bootcmd mmc read A B C\; bootm A
从EMMC的B开始读C这么多的数据到内存的A,并且从A启动内核。
setenv bootcmd tftp A uImage \; bootm A
从上位机下载内核到内存的A,并且从A启动内核
为内核传递启动参数
setenv bootargs root=/dev/mmcblk0p2 ....
告诉内核rootfs在EMMC的第三个分区。
setenv bootargs root=/dev/nfs ...
告诉内核rootfs在上位机,利用NFS网络服务找到文件系统启动。
uboot源码操作
- uboot.bin二进制文件肯定是由uboot源码编译生成。
- uboot源码一定要从芯片厂家或者开发板的厂家来获取,由于每板子的外围布线不一样,所以虽然很多板子使用的CPU芯片一直,但是外围设备不一样,所以官方的uboot源码仅仅支持官方的参考板子,并不会每种板子都支持。所以如果将来出现硬件差异,需要对官方的uboot源码进行针对性修改。当然,板子如果是从厂家购买的,那么厂家肯定有针对的uboot修改好的源码。
- 获取正确的交叉编译器,交叉编译器的版本要和uboot源码的版本相配合,如果不匹配则会发生编译报错。
- 验证官方uboot源码的正确性。
- uboot源码操作三部曲:
- make distclean
- make ABC_config
- make
来源:CSDN
作者:跑不了的你
链接:https://blog.csdn.net/qq_37596943/article/details/103847070