编译:毛毛虫要飞
这篇关于嵌入式Linux的教程将简要介绍一个非常流行的嵌入式系统领域,即在嵌入式系统中使用开源操作系统,如Linux。我们将从嵌入式Linux的定义开始。之后将讨论嵌入式Linux的主要组成部分。
这篇文章不一定能打通你嵌入式开发的任督二脉,但是最起码可以让你找到嵌入式开发的脉搏,无论是嵌入式底层开发还是嵌入式应用开发。
让我们开始吧~
什么是嵌入式Linux?
在定义嵌入式linux之前,让我们先看看嵌入式系统的定义。
??
什么是嵌入式系统?
我们可以以多种方式定义嵌入式系统。但最简单的定义是,它是为特定应用而设计的专用计算机。换句话说,它是一个集成了微控制器或微处理器等小型计算机的系统。与台式机或笔记本电脑等通用电脑不同,这种处理器只执行特定的功能。
嵌入式系统市场已有50多年的历史。嵌入式系统基本上是单板计算机。但其功能是有限的和特定的。嵌入式处理器是专为嵌入式应用而设计的特殊类型的微处理器。嵌入式处理器包括所有组件,如内存单元、微处理器、输入/输出单元等,都嵌入在一块单板上。与台式机和笔记本电脑不同,它们的功能受到内存不足、处理速度等限制,并且作为包括硬件在内的整个设备的一部分被嵌入其中。
嵌入式Linux的介绍
嵌入式Linux只不过是在嵌入式系统应用程序开发中使用了Linux内核和其他开源软件开发工具,如开源库。因此,我们使用Linux操作系统来设计嵌入式应用程序,而不是使用裸机嵌入式系统方法,在这种方法中,我们必须自己编写软件的每个部分。
它将使我们的嵌入式开发过程快速和毫不费力。因为Linux提供了我们在嵌入式应用程序中需要使用的所有类型的软件的支持,如TCP/IP协议栈、串行通信协议、图形库等。我们只需要配置Linux并根据我们的底层处理器架构创建一个镜像,这个过程称为一个板级支持包。
嵌入式设备没有特定的Linux内核镜像。通过配置并将Linux内核代码移植到不同的处理器体系结构,可以通过相同的Linux内核代码构建各种设备、工作站和嵌入式系统。
为什么选择Linux作为嵌入式系统?
开源
因为Linux是一个开源内核,任何人都可以根据自己的需要查看和修改它的源代码。在此基础上,在为目标嵌入式硬件创建Linux镜像时,您可以根据需要删除或添加Linux内核的组件。通过这种方式,我们可以为内存受限的嵌入式设备创建一个内核映像。
可重用性
开源软件组件和库允许利用开源软件组件快速设计和开发嵌入式产品。因为Linux有一个庞大的支持社区,他们免费提供所有广泛使用的软件组件,我们不需要重新开发已经可用的组件,如图形库、TCP/IP堆栈、Linux内核、I2C、SPI库和其他设备驱动程序等。
免费或低成本
由于开源的特性,我们可以在我们的嵌入式应用程序中部署这些软件组件,无论修改与否,都是免费的。这将大大降低我们的嵌入式设备的价格。
硬件支持
Linux支持多种处理器架构,如ARM、x86、PowerPC、RiscV、MIPS、SuperH。虽然Linux主要工作在MMU架构的微处理器上。然而,非mmu体系结构也支持使用,只不过会有一些局限性。
嵌入式Linux系统的例子
无线路由
智能手机
无线热点
视频及多媒体系统
机器人
可穿戴传感器,如智能手表和生物医学设备
在嵌入式处理器上使用Linux的最低硬件要求
Linux内核支持32位和64位处理器架构,它支持几乎所有现代流行的处理器架构,如:
ARM(几乎用于各种应用程序)
X86(多媒体和工业应用)
MIPS(网络应用,如路由器和热点)
PPC/PowerPC(硬实时和截止日期限制的应用程序)
SH(多媒体应用)
为了在目标嵌入式处理器上运行Linux,至少需要8MB的RAM。但实际应用程序至少需要32MB的RAM。但RAM内存的实际需求取决于嵌入式应用程序的大小。
除了RAM外,还需要至少4MB的存储内存。存储空间有以下几种:
NAND或NOR闪存
SD卡或MMC卡
像uCLinux这样的轻量级Linux也可以在没有内存管理单元的微处理器或微控制器上运行。
嵌入式Linux架构
下面的框图展示了基于Linux的嵌入式系统的体系结构。
嵌入式linux架构
嵌入式系统的构建过程通常使用交叉编译工具在主机上完成。因为目标硬件没有足够的资源来运行用于为目标嵌入式硬件生成二进制镜像的工具。在一个系统(主机系统)上编译代码并在另一个系统上运行生成的源代码的过程称为交叉编译。
嵌入式Linux系统的主要组成部分
交叉开发工具链(安装在主机系统上)
引导装载程序
内核
设备树
根文件系统
系统程序
应用程序
现在,让我们回顾一下每个组件及其在基于嵌入式Linux的系统开发中的用途。
工具链
工具链是一组开发工具的集合,例如GCC编译器、C库和GNU调试器,它们被用来为目标嵌入式硬件创建源程序。通常,交叉编译工具链在嵌入式Linux中被使用,因为目标嵌入式处理器没有足够的资源来支持这些工具链。在交叉编译系统中,在主机系统(功能强大的PC)上进行开发,然后使用不同的接口(如串行、以太网等)将源程序部署到目标设备上。串行通信是主机系统和目标设备之间最常用的接口。
Linux环境下的通信工具有Minicom、Picocom、Gtkterm、Putty和windows环境下的超级终端。
Bootloader
这是一段当我们第一次给嵌入式硬件供电时运行的代码。引导加载程序在加载操作系统之前执行各种硬件初始化步骤。当处理器启动或重置时,每个处理器都有许多预定义的硬件步骤和配置。
以下是引导加载程序的主要角色:
目标硬件初始化
将应用程序二进制文件(操作系统、根文件系统、设备树)从非易失性外部存储加载到RAM内存中
RAM外部连接到SOC,它存储运行时数据、操作系统、根文件系统、应用软件和栈/堆。
然后从RAM内存中执行主操作系统代码
不同的微处理器可能有不同的启动顺序,但其基本概念是相同的。
在嵌入式Linux中,有两种很流行的通用或普遍的引导加载程序,例如Uboot和barebox。
嵌入式Linux引导流程
成功引导嵌入式Linux主板如BeagleBone、Raspberry Pi等Linux内核的具体步骤和要求是什么?如果我们以Beaglebone Black为例,这个板有一个由德州仪器制造的AM335x SoC。为了在这个Soc上启动Linux,有如下图所示的四个主要组件:
嵌入式Linux引导流程
第一个组件是第一阶段 bootloader 或 ROM bootloader 。这通常是制造商存储在SoC的闪存里的,我们无法更改。
RBL的主要作用是从SoC的内部SRAM上加载第二个阶段的 bootloader,即SPL(二级程序加载程序)或MLO(内存加载程序)。
MLO的工作是从开发板的DDR内存中加载和执行第三阶段引导加载程序,例如U-Boot,但是DDR不在SoC上。
第三阶段引导加载程序是U-boot,它将Linux内核从SD卡等持久存储器加载到开发板的DDR存储器中。
之后系统开始执行它的第一个进程init并挂载根文件系统。
Linux内核
它是一个软件或操作系统内核,以最优和有效地管理嵌入式处理器的资源。嵌入式Linux的主要核心组件是Linux内核。它是一种分层的操作系统架构,这意味着它分为两层,即用户空间和内核空间内存空间。
它提供各种服务,例如:
进程管理(通过调度器将CPU资源并发地分配给进程/任务)
进程调度(通过调度算法将并发运行的进程调度到CPU上)
内存管理(通过虚拟内存支持为不同进程管理内存)
进程间通信(有时任务需要彼此共享数据,而进程间通信特性通过共享内存提供了这种支持)
文件管理(管理系统如何存储和访问信息)
I/O管理(通过设备驱动程序支持,如字符、块和USB设备驱动程序)
网络(支持网络设备驱动程序)
通过设备驱动程序与硬件连接
设备树
基于linux的嵌入式硬件平台还包含外围设备,这些外围设备不具备向操作系统内核承认其存在的能力。必须有一种方法将这些硬件外设告知Linux内核。
Linux内核包含数千个设备驱动程序,在引导过程中,内核应该知道哪些不可发现的硬件设备连接到基于Linux的嵌入式系统。问题是内核如何找到连接的硬件设备的详细信息?答案是设备树。
设备树是一种树状数据结构,它提供了关于连接的硬件设备的信息,这些硬件设备本身和一个SoC的其他片上外围设备是不可发现的。一些自动无法发现的片上外设有I2C、UART、SP、以太网等。相反,USB设备具有动态地将其存在通知操作系统的能力或智能。
根文件系统
在Linux中,文件系统将数据组织成存储设备内部的文件和目录。实际上,Linux中的一切都是文件,存储和访问都是通过文件进行的。这些文件和目录在表单层次结构中可用。
在引导过程中,Linux内核还需要一个根文件系统组件。根文件系统是一种特殊类型的文件系统,它包含为嵌入式设备准备执行环境所需的所有配置文件,例如,准备图形显示等。它还包含运行在Linux上的第一个父进程(init)。
Linux内核与根文件系统一起工作。这是可以挂载根目录的文件系统。桌面发行版和服务器发行版有两种类型的文件系统。这是初始根系和实际根系。初始根系统用于安装和运行后者。初始根系统用于加载桌面驱动程序。在初始根文件系统和实际根文件系统之间的切换称为 pivot。
配置文件
内核需要配置文件来区分系统中的用户和组。它还需要配置文件来管理文件权限。这些文件不是由程序读取的,而是由内核提供的系统库函数。
嵌入式Linux系统的分类
结合嵌入式Linux系统的结构,对嵌入式Linux系统进行了分类。它也可以根据规模和时间限制进行分类。
Linux的特点是采用微架构,通常消耗较小的内存(100 KB)。它结合了网络堆栈和一些基本的实用程序,可以非常有效地适应在500k的内存中,它是可在较少的RAM和ROM上工作的。ETLinux, LEM, uClinux, uLinux, ThinLinux是嵌入式Linux的一些例子。嵌入式系统的实际大小决定了硬件提供的功能。根据资源使用大小的不同,将嵌入式系统分为小、中、大三种类型。
小型系统
小型系统有低功耗的CPU, ROM小于4 MB, RAM是8到16 MB。
中型系统
中等大小的系统包含中等功率的CPU, 32 MB的RAM和可移动存储卡。
大型系统
大容量系统包含强大的CPU或多CPU、大RAM和永久存储。
要开始学习嵌入式Linux,首先要熟悉Linux操作系统、Linux内核内部以及Linux的不同发行版本。Linux是一种开源操作系统。它是嵌入式系统开发的一个巨大平台。嵌入式系统无处不在,在所有范围内都可用,小型控制应用需要更小的微处理器,而大型并行处理器则需要巨大的内存。
热门文章:systemd相关命令讲解使用 nmon 对 Linux 系统性能进行故障排除和监控