【嵌入式系统科普】第2篇:什么是uboot/kernel/根文件系统/BootLoader/操作系统/bios/设备树

本文依据网络资料及工作与学习经验整理而成,如有错误请留言。

文章为个人辛苦整理,付费内容,已加入原创侵权保护,禁止私自转载,违者必究。

文章所在专栏:《黑猫带你深入嵌入式系统:从裸机、U-Boot到内核与驱动

1 内核和操作系统的区别

网上找了很久,对于两者的关系,作出如下总结,如有不对的地方欢迎批评指教。

1.os是一种管理计算机软硬件资源的系统软件,而kernel是os最基本的部分,也就是说,两者是包含关系。os是接口,内核是一个操作系统的核心。系统内核(Kernel)是整个操作系统的最底层,它负责整个硬件的驱动,以及提供各种系统所需的核心功能,包括防火墙机制、是否支持LVM或Quota等文件系统等等

2.内核用于管理系统资源,例如提供对软件层面的抽象(例如对进程、文件系统、同步、内存、网络协议等对象的操作和权限控制),和对硬件访问的抽象(例如磁盘,显示,网络接口卡(NIC));操作系统,在内核的基础上有延伸,包括了提供基础服务的系统组件。

3.一个内核不是一套完整的操作系统,现在默认linux为linux内核,这是由于历史源因造成的,实际上一般来讲,一个Linux发行版本出来,包括Linux内核之外,还包含大量的软件(套件),比如软件开发工具,数据库,Web服务器(例如Apache),X Window,桌面环境(比如GNOME和KDE),办公套件(比如OpenOffice、org)等等。

2 bootloader与uboot的区别

- 什么是uboot/bootloader

BootLoader是嵌入式设备中用来启动操作系统内核的一段程序。

uboot(universal bootloader)是一种可以用于多种嵌入式CPU的BootLoader程序,换言之,uboot是bootloader的一个子集。 它的最终目的就是,从flash中读出内核,放到内存中,启动内核所以,由上面描述的,就知道,UBOOT需要具有读写flash的能力。

uboot的核心作用就是启动操作系统内核,uboot的本质就是一段裸机程序。

uboot的U是"通用"的意思。

Bootloader 即引导加载程序,是系统加电后运行的第一段软件代码。

BootLoader启动过程可分为单阶段和多阶段(stage1、stage2),其中stage1完成初始化硬件,如CPU寄存器、内存控制器,为stage2准备内存空间。一般stage1是可以直接在nor flash中运行的,并将stage2复制到内存RAM中,设置堆栈,然后跳转到stage2(从这也可以看出stage2是在RAM中运行的,与stage1不同)。

BootLoader的stage1通常包括以下步骤:

1.硬件设备初始化 如CPU寄存器、内存控制器

2.为加载BootLoader的stage2准备RAM空间

3.拷贝BootLoader的stage2到RAM空间中

4.设置好堆栈 为什么?为了跳转到stage2的入口,因为stage2大多数是用C语言写的

5.跳转到stage2的C入口点

BootLoader的stage2通常包括以下步骤:

1.初始化本阶段要使用到的硬件设备 各种设备,如网卡

2.将内核映像和根文件系统映像从flash上读到RAM中去

3.调用内核

BootLoader还包含ppcboot/armboot/redbot/blob等。

简单来说就是:

Uboot/BootLoader这种东西存在硬盘/emmc/SD卡里面的,而不是内存(RAM)中。上电的时候,emmc控制器里面的row code会将uboot加载到内存中执行,用来初始化硬件,然后uboot初始化完成后继续将kernel从emmc/flash里面拿到内存,从而进行加载操作系统。(kernel大概理解起来就是安卓/Windows等系统的框架)。至于BIOS其实就是uboot的图形界面。

- uboot是怎样引导启动内核的?

uboot刚开始被放到flash中,板子上电后,会自动把其中的一部分代码拷到内存中执行,这部分代码负责把剩余的uboot代码拷到内存中,然后uboot代码再把kernel部分代码也拷到内存中,并且启动,内核启动后,挂着根文件系统,执行应用程序。

- uboot启动的大过程是怎么样的?

uboot启动主要分为两个阶段,主要在start.s文件中:

(1)第一阶段主要做的是硬件的初始化,包括,设置处理器模式为SVC模式,关闭看门狗,屏蔽中断,初始化sdram,设置栈,设置时钟,从flash拷贝代码到内存,清除bss段等,bss段是用来存储静态变量,全局变量的,然后程序跳转到start_arm_boot函数,宣告第一阶段的结束。

(2)第二阶段比较复杂,做的工作主要是1.从flash中读出内核。2.启动内核。start_arm_boot的主要流程为,设置机器id,初始化flash,然后进入main_loop,等待uboot命令,uboot要启动内核,主要经过两个函数,第一个是s=getenv("bootcmd"),第二个是run_command(s...),所以要启动内核,需要根据bootcmd环境变量的内容启动,bootcmd环境变量一般指示了从某个flash地址读取内核到启动的内存地址,然后启动,bootm。

uboot启动的内核为uImage,这种格式的内核是由两部分组成:真正的内核和内核头部组成,头部中包括内核中的一些信息,比如内核的加载地址,入口地址。

uboot在接受到启动命令后,要做的主要是,1,读取内核头部,2,移动内核到合适的加载地址,3,启动内核,执行do_bootm_linux

do_bootm_linux主要做的为,1,设置启动参数,在特定的地址,保存启动参数,函数分别为setup_start_tag,setup_memory_tag,setup_commandline_tag,setup_end_tag,根据名字我们就知道具体的段内存储的信息,memory中为板子的内存大小信息,commandline为命令行信息。

关于uboot内核传参,再说一点:

linux内核在设计的时候,设计为可以被传参。也就是说我们可以在uboot中事先给linux内核准备一些启动参数放在内存中特定位置然后传给内核,内核启动后会到这个特定位置去取uboot传给他的参数,然后在内核中解析这些参数,这些参数将被用来指导linux内核的启动过程。

- 总结,uboot到底是干嘛的

1.汇编阶段:初始化时钟、初始化内存、初始化存储、初始化串口、代码自拷贝到内存、跳转到内容

2.初始化硬件(功能性的硬件,例如外接的网卡、显示屏、USB等)、加载内核、引导内核、向内核传参(参数:Bootargs、内存大小、内存页大小)

- sansamg exnoys 4412的启动流程:

基于上电pc=0,上电后irom代码执行,会拷贝启动设备前24k代码到IRAM执行。

24k代码的组成:8k(三星加密校验码)+16k(程序员完成)

16k代码的必须功能:要初始化内存,初始化时钟来升频率,将后续代码放到内存、跳转到内存执行

- uboot的"生命周期"

1)uboot的生命周期就是指:uboot什么时候开始运行,什么时候结束运行。

2)uboot本质上是一个裸机程序(不是操作系统),一旦uboot开始SoC就会单纯运行uboot(意思就是uboot运行的时候别的程序是不可能同时运行的),一旦uboot结束运行则无法再回到uboot(所以uboot启动了内核后uboot自己本身就死了,要想再次看到uboot界面只能重启系统。重启并不是复活了刚才的uboot,重启只是uboot的另一生)

3)uboot的入口和出口。uboot的入口就是开机自动启动,uboot的唯一出口就是启动内核。uboot还可以执行很多别的任务(譬如烧录系统),但是其他任务执行完后都可以回到uboot的命令行继续执行uboot命令,而启动内核命令一旦执行就回不来了。

总结:uboot的一切都是为了启动内核。

- 为什么需要进行bootloader移植

1.因为每种不同的CPU体系结构都有不同的BootLoader

2.BootLoader依赖于具体的嵌入式板级设备的配置

3 BIOS是什么

具体细节如下:

Bios 基本输入输出系统 Basic Input Output System,是一组固化到计算机内主板上一个ROM芯片上的程序,它保存着计算机最重要的基本输入输出的程序、系统设置信息、开机后自检程序和系统自启动程序。 其主要功能是为计算机提供最底层的、最直接的硬件设置和控制。

是针对于windows上来说的。

4 根文件系统和文件系统

首先说说什么文件系统。用我的话来讲,文件系统就是用来管理块设备的。做过单片机的朋友们都知道当我们要读取块设备时,要知道数据存取在块设备的哪一个扇区号,然后一块块的去读取数据。但是我们在玩电脑的时候,读取硬盘时却是通过路径去访问文件的,这是怎么做到的呢?没错,这就是文件系统的功能,有了它,我们读取块设备时可以通过文件路径去读取,这样子访问块设备就变得十分方便了。

根文件系统是特殊的文件系统。这句话怎么理解?它具备了文件系统的功能,就是管理块设备,同时也有着文件系统没有的功能。除了管理块设备以外,我就来说说具备的其它功能。首先我们要知道,在linux操作系统中,进程是由其父进程衍生出来的,所以有一个很明显的问题,第一个进程是怎么来的?毫无疑问,是linux内核启动的时候创造出来的。但是,有架构思想的朋友们就不难想出,内核代码产生的进程是运行在内核态的,而我们的应用程序是运行在用户态的。所以这里就产生了矛盾。单纯由内核产生的进程1是无法衍生出用户态的进程,所以,此时就需要根文件系统帮忙。将进程1从内核态引导到用户态上。说到这里,我相信很多人明白了,其实根文件系统里面包含着一个应用程序,该应用呈现出就是进程1。

当然,根文件系统还由配置系统的功能。大家想一下,我们平时开机后,电脑桌面,开机账户,开机密码,开机运行的程序等等这些初始化的功能是怎么来的?没错,这些配置都存储在根文件系统里面。在linux系统下,一般都在/etc目录下,这个目录存储的都是内核启动需要的配置文件。

当然,根文件系统还提供了根目录。大家都知道文件的存储是按照树形结构存储的。树枝可以由我们这些用户去定义,当时根目录也是/是怎么生成的?就是由根文件系统生成的。

总结起来说,其实内核仅仅是提供了内核的功能,譬如说内存管理,进程调度等等那些基本的操作系统的功能。而剩下很多需要配置的文件都是由根文件系统提供的。那么为什么根文件系统不涵盖在内核里面形成一个统一的代码呢?在我个人看来,就是为了可移植性。内核中的程序是操作系统的基本功能基本在所有的CPU里面都是通用的,所以全部涵盖在内核层里面。而根文件系统是一些配置文件,不同的CPU有不同的配置模式,所以这里就有所不同。

简单来说:

Linux启动时,第一个必须挂载的是根文件系统;若系统不能从指定设备上挂载根文件系统,则系统会出错而退出启动。系统正常挂载根文件系统之后可以自动或手动挂载其他的文件系统(根文件系统是其他文件的最终挂载点)。因此,一个系统中可以同时存在不同的文件系统。

不同的文件系统类型有不同的特点,因而根据存储设备的硬件特性、系统需求等有不同的应用场合。在嵌入式Linux应用中,主要的存储设备为 RAM(DRAM, SDRAM)和ROM(常采用FLASH存储器),常用的基于存储设备的文件系统类型包括:jffs2, yaffs, cramfs, romfs, ramdisk,initramfs, ramfs/tmpfs,ubifs等。

5 BootLoader和kernel的区别

操作系统内核本身就是一个裸机程序,和我们学的uboot和其他裸机程序没有本质的区别;事实上,不少U-Boot源码就是根据相应的Linux内核源程序进行简化而形成的,尤其是一些设备的驱动程序。如果我们去琢磨U-Boot源码的注释,便会轻易的发现这一情况。

区别就是操作系统运行起来后可以分为应用层(用户态)和内核层(内核态),分层后,两层的权限不同,内存访问和设备操作的管理上更加精细(内核可以随便方位各种硬件,而应用程序只能被限制的访问硬件和内存地址)。

直观来看:uboot的镜像是u-boot.bin,Linux系统的镜像是zImage,这两个东西其实都是裸机程序镜像。

从系统启动的角度来讲,内核和uboot都是裸机程序。

6 什么叫做裸机开发

裸机编程,顾名思义,就是直接在硬件上编程写代码,或者说编写直接在硬件上运行的程序,没有操作系统的支持。

一般我们把没有操作系统的编程环境,成为裸机编程环境,比如在单片机上编程。

7 preloder和bootloader的区别?lk又是什么?

非常详细非常好的参考链接:

bootloader过程(preloader---->lk)
https://blog.csdn.net/wang714818/article/details/77816021

简单来说,对于MTK平台,没有uboot,有lk,就是little kernel,其作用相当于uboot(个人理解)。

一般平台启动流程:

Boot ROM--> uboot --> kernel

MTK启动流程:

Boot ROM -> Preloader(相当于 U-Boot SPL)-> LK -> Kernel

相关推荐
GHL2842710902 小时前
redis编译调试(linux)
linux·数据库·redis
食咗未2 小时前
Linux USB HOST EXTERNAL USB TO ETH ADAPTER
linux·网络·驱动开发
文弱书生6562 小时前
7-Robot类大体框架
linux·单片机·嵌入式硬件
jerryinwuhan2 小时前
linux_shell_1226_1
linux
纸带2 小时前
MCU 错误中断HardFault_Handler KEIL 仿真分析
单片机·嵌入式硬件
羽飞2 小时前
GCC ABI炸弹
linux·c++·python
先知后行。2 小时前
电子元器件2
单片机·学习
程序猿编码2 小时前
手动清理 TCP TIME-WAIT 套接字:Linux 内核模块的实现与原理
linux·网络·tcp/ip·linux内核·套接字
DIY机器人工房2 小时前
解决方法:用新唐 NuMicro M483这款单片机遇到的一些问题
单片机·嵌入式硬件·嵌入式·diy机器人工房·新唐m483