跳转至

Embedded Linux Concept

1. Security

信息安全是指对计算机上的数据和资源的访问以及对计算机处理的数据保持机密性。Linux 的开放性是其安全性的关键。因为所有人都可以查看源代码,所以安全漏洞是所有人是可见、可理解并且可修复的。

安全性有几个不同的维度,所有这些维度对于嵌入式系统或任何其他系统都是必要的。一种是确保用户和程序对资源拥有最低程度的权利,以便能够执行。另一种方法是将信息隐藏起来,直到拥有正确凭证的用户请求查看或更改它。Linux的优点是所有这些工具都是免费提供的,因此您可以选择正确的工具来满足您的项目需求。

1.1. SELinux

几年前,一个对信息安全感兴趣的政府机构——美国国家安全局(NSA)和其他几家有类似兴趣的私营公司一起,按照强制访问控制 MAC(Mandatory Access Control)模型,对Linux内核进行了研究,并引入了数据保护(data protection)、程序隔离(program isolation)和安全策略(security policies)等概念。这个项目被称为 SELinux(其中SE代表Security Enhanced),该项目的变更及概念最终成为了Linux 内核 2.6.0 发行版的一部分。

SELinux 中的 MAC 概念指定了一些控制,其中必须为程序分配执行某些活动的权限,如:打开套接字(socket)或文件,作为其安全策略的一部分。作业必须首先由管理员下达,系统的普通用户并不能进行任何修改。SELinux 的系统在最小特权原则下运行,这意味着一个进程只有被授予的权限,而没有其他更多的权限。最小权限概念(The least-privilege concept)使错误或被破坏的程序在正确配置的环境中危险性降低,依赖于管理员已经为程序授予了运行所需的最小权限集。所以创建安全策略本身就是一个大项目。

1.2. PAM

可插入身份验证模块PAM(Pluggable Authentication Modules)是一种为用户身份验证过程创建统一接口的方法。传统上,Linux系统上的用户身份验证是通过在 /etc/passwd 文件中查找用户名并检查其中加密的密码,或者使用影子密码文件(shadow password file)进行的。PAM 框架同时也提供了会话管理,在用户通过身份验证后,以及退出系统之前,执行某些特殊的操作。

PAM 系统的开放设计对于公司环境中连接到网络的嵌入式项目非常重要。例如:如果设备用作共享驱动器,一些目标市场可能使用 LDAP 来决定谁可以访问设备,而另一些目标市场可能将使用放在NT域中的帐户。PAM 对这两种技术都同样有效,您可以通过简单的配置更改在这两种技术之间切换。

1.3. IPsec

IPsec 是一种通过IP网络在两个受信任的主机之间进行身份验证和传输数据的系统。IPsec 位于 OSI 堆栈的网络层的第3层,它不是一个单独的软件,而是一组可以一起工作,并提供安全通信的工具。通过在这一层运行,IPsec 可以在主机之间提供安全通信(secure communication),而不需要堆栈任何上层运行的协议的参与。

IPSec 的一个经典用途是加密虚拟专用网络流量。它还可以用于想要使用简单协议来发送数据的情况(比如:HTTP协议 甚至纯文本内容),但又希望数据保持安全。

嵌入式 Linux 的优点之一,就是您可以在桌面计算机上使用 IPsec 执行所有配置工作,并将这些配置文件传输到嵌入式目标设备中。因为当您创建嵌入式 Linux 系统时,您可以在用于开发的桌面上使用在目标上运行的相同软件,从而使其成为模拟目标硬件的理想平台。

2. 嵌入式 Linux 系统

2.1. 引导加载程序 Boot Loader

引导加载程序(Boot Loader)可以加载一些特性,但它们的主要职责是初始化处理器并准备好运行操作系统。它是首先在系统上运行的软件。

在大多数现代嵌入式Linux系统中,内核存储在闪存中的一个分区中。引导加载程序将该闪存分区复制到 RAM 中的某个位置,将指令指针设置到该内存位置,并告诉处理器从指令指针的当前位置开始执行。在此之后,正在运行的程序会随意地重写引导加载程序。需要注意的重要一点是,引导加载程序对于正在加载和运行的内容是不可知的。它可以是Linux内核或其他操作系统,也可以是编写为在没有操作系统的情况下运行的程序。引导加载程序在所有这些使用场景中执行相同的基本操作。

当引导加载程序越来越成熟,它们变得更像具有网络、视频的操作系统,并支持越来越多的闪存存储设备。更重要的一点是,引导加载程序现在基本无处不在,作为嵌入式Linux开发人员,很少需要为调试板考虑移植引导加载程序。唯一可能希望重新编译引导加载程序,是为了能删除功能以节省空间,并加速引导时间,但底层工程是由调试板供应商完成。

2.2. 内核 Kernel

Linux 内核是以教学辅助操作系统 MINIX 为蓝本。Linux 最初只在 x86 主机上运行,接着被移植到摩托罗拉 68KB 处理器上。移植的过程是一个痛苦的过程,导致Linus Torvalds为了可移植性而设计了 Linux 内核。通过做正确的事情,他为Linux在接下来的十年中移植到几乎所有主要处理器上奠定了基础。

由于Linux的成熟和广泛的设备支持,工程师无需花大量时间去做内核的开发工作,如:创建设备驱动程序,而花更多的时间和精力创建用户价值的应用程序。通过删除不需要的组件或进行其他调整来加速引导时间,可能需要对内核进行定制,但通常并不需要在开始时就进行Linux内核运行所必需的低级编程。

尽管内核是必不可少的重要组件,但它与它所运行的软件有着共生关系。重要的不是轻视Linux内核或降低它的重要性,而是要清楚地说明内核如何适应Linux系统的整体功能。如果没有要运行的东西,内核就会停止执行并陷入恐慌(Panic)。这就是根文件系统和应用程序需发挥作用的地方。

2.3. 根文件系统 Root File System

文件系统是表示目录层次集合的一种方式,其中每个目录可以包含更多目录或文件。对于计算机科学类型,这个层次结构是一个树结构,其中文件总是叶子节点,目录包含某些内容时属于内部节点,否则就是叶子节点。沿着数据结构内存通道进行这一旅程的重点是,树结构中的顶部节点是根节点,在Linux中,挂载在顶部节点上的文件系统被恰当地称为根文件系统。

只需输入mount即可显示所有已挂载的文件系统。大多数Linux系统都挂载了几个文件系统,但是所有文件系统都是相对于根文件系统挂载的。

当Linux内核引导时,它必须能够挂载根文件系统。在引导过程中,根文件系统可以替换为另一个根文件系统,但一次只能挂载一个根文件系统。挂载根文件系统失败,意味着系统找不到要运行的东西。因为文件系统是程序的容器,内核会恐慌并停止。

根据调试板的硬件和应用程序需求,您可以自由选择任意数量的根文件系统类型。一个完整的设备包含一个挂载在根上的文件系统,但可能使用挂载在根文件系统内其他目录上的几个不同的文件系统。只能在根目录(/)上挂载一个文件系统,但是Linux允许在根文件系统的其他位置上挂载任意数量的文件系统。例如:使用闪存进行存储的系统会挂载基于RAM的文件系统进行临时存储,因为这样更快,而且闪存的占空比比RAM小得多。