一文搞懂嵌入式uboot、kernel、文件系统的关系

Linux的软件架构

在linux系统软件架构可以分为4个层次(从低到高分别为):
 
1.引导加载程序
        引导加载程序(Bootloader)是固化在硬件Flash中的一段引导代码,用于完成硬件的一些基本配置,引导内核启动。
        同时,Bootloader会在自身与内核分区之间存放一些可设置的参数(Boot parameters),比如IP地址,串口波特率,要传递给内核的命令行参数。
 
2.系统内核
        系统内核(Kernel)是整个操作系统的最底层,它负责整个硬件的驱动,以及提供各种系统所需的核心功能,包括防火墙机制、是否支持LVM或Quota等文件系统等等,如果内核不认识某个最新的硬件,那么硬件也就无法被驱动,你也就无法使用该硬件。计算机真正工作的东西其实是硬件,例如数值运算要使用到CPU、数据储存要使用到硬盘、图形显示会用到显示适配器、音乐发声要有音效芯片、连接Internet 可能需要网络卡等等。内核就是控制这些芯片如何工作。
 
3.文件系统
        Linux文件系统(File System)中的文件是数据的集合,文件系统不仅包含着文件中的数据而且还有文件系统的结构,所有Linux 用户和程序看到的文件、目录、软连接及文件保护信息等都存储在其中。
        文件系统是操作系统用于明确存储设备(常见的是磁盘,也有基于NAND Flash的固态硬盘)或分区上的文件的方法和数据结构;即在存储设备上组织文件的方法。操作系统中负责管理和存储文件信息的软件机构称为文件管理系统,简称文件系统。
 
4.用户程序
        用户应用程序(Application)为了完成某项或某几项特定任务而被开发运行于操作系统之上的计算机程序。
 
 
Linux启动过程
正常启动过程中,Bootloader首先运行,然后将内核复制到内存中(或者在固态存储设备上直接运行,但是效率较低),并在内存某个固定的地址(包括地址与参数的结构)设置好要传递给内核的参数,最后运行内核。内核启动后,挂载(mount)根文件系统(Root filesystem),启动文件系统中的应用程序。
 
上电 ——> Bootloader —[传递参数]—> 加载内核 ——> 内核挂载根文件系统 ——>执行应用程序
 
 
  • 如何理解Bootloader与Kernel
操作系统内核本身就是一个裸机程序,和我们学的uboot和其他裸机程序没有本质的区别;事实上,不少U-Boot源码就是根据相应的Linux内核源程序进行简化而形成的,尤其是一些设备的驱动程序。如果我们去琢磨U-Boot源码的注释,便会轻易的发现这一情况。
 
区别就是操作系统运行起来后可以分为应用层(用户态)和内核层(内核态),分层后,两层的权限不同,内存访问和设备操作的管理上更加精细(内核可以随便方位各种硬件,而应用程序只能被限制的访问硬件和内存地址)。
 
直观来看:uboot的镜像是u-boot.bin,Linux系统的镜像是zImage,这两个东西其实都是裸机程序镜像。
从系统启动的角度来讲,内核和uboot都是裸机程序。
 
  • 根文件系统和文件系统
Linux启动时,第一个必须挂载的是根文件系统;若系统不能从指定设备上挂载根文件系统,则系统会出错而退出启动。系统正常挂载根文件系统之后可以自动或手动挂载其他的文件系统(根文件系统是其他文件的最终挂载点)。因此,一个系统中可以同时存在不同的文件系统。
 
不同的文件系统类型有不同的特点,因而根据存储设备的硬件特性、系统需求等有不同的应用场合。在嵌入式Linux应用中,主要的存储设备为 RAM(DRAM, SDRAM)和ROM(常采用FLASH存储器),常用的基于存储设备的文件系统类型包括:jffs2, yaffs, cramfs, romfs, ramdisk,initramfs, ramfs/tmpfs,ubifs等。
 
 
 
关于uboot命令中的分区位置
在一般的烧录中,是通过uboot下的命令进行的。
tftp 0x100000 boot.bin; nand write 0x100000 0x0 0x300000;  
tftp 0x1000000 logo.bin; nand write 0x1000000 0x300000 0x200000;  
tftp 0x2000000 uImage; nand write 0x2000000 0x500000 0x500000;  
tftp 0x3000000 xx.dtb; nand write 0x3000000 0xa00000 0x20000;  
tftp 0x4000000 rootfs.img; nand write.trimffs 0x4000000 0x2000000 0x10000000;
通过TFTP下载,再写到对应的位置,那么为什么要要写到哪里呢?
  • uboot是首先引导的,所以从位置0这里下载/运行(CPU默认从0地址运行)
  • 内核的启动是要依赖uboot进行引导的,所以uboot会从有关的地址中读取内核,然后跳转到指定的地址运行
 《 uboot如何启动内核》
        《 uboot引导内核时的加载地址与入口地址问题》
  • 文件系统
 
 
 
  • 1
 
 

转载于:https://www.cnblogs.com/schips/p/11393234.html

你可能感兴趣的:(嵌入式,操作系统,运维)