快捷搜索:  as  test  1111  test aNd 8=8  test++aNd+8=8  as++aNd+8=8  as aNd 8=8

金冠游戏:嵌入式设备上的 Linux 系统开发



假如您刚打仗嵌入式开拓,那么大年夜量可用的向导装载法度榜样(bootloader)、规模缩小的分发版(distribution)、文件系统和 GUI 看起来可能太多了。然则这些富厚的选项实际上是一种恩赐,容许您调剂开拓或用户情况以完全相符您的必要。对 Linux 嵌入式开拓的概述将赞助您理解所有这些选项。

Linux 正在嵌入式开拓领域稳步成长。由于 Linux 应用 GPL(请参阅本文后面的参考资料),以是任何对将 Linux 定制于 PDA、掌上机或者可佩带设备感兴趣的人都可以从因特网免费下载其内核和利用法度榜样,并开始移植或开拓。许多 Linux 改善品种投合了嵌入式/实时市场。它们包括 RTLinux(实时 Linux)、uclinux(用于非 MMU 设备的 Linux)、Montavista Linux(用于 ARM、MIPS、PPC 的 Linux 分发版)、ARM-Linux(ARM 上的 Linux)和其它 Linux 系统(请参阅参考资料以链接到本文中提到的这些和其它术语及产品。)

嵌入式 Linux 开拓大年夜致涉及三个层次:向导装载法度榜样、Linux 内核和图形用户界面(或称 GUI)。在本文中,我们将集中评论争论涉及这三层的一些基础观点;深入懂得向导装载法度榜样、内核和文件系统是若何交互的;并将钻研可用于文件系统、GUI 和向导装载法度榜样的浩繁选项中的一部分。

向导装载法度榜样

向导装载法度榜样平日是在任何硬件上履行的第一段代码。在象台式机这样的老例系统中,平日将向导装载法度榜样装入主向导记录(Master Boot Record,(MBR))中,或者装入 Linux 驻留的磁盘的第一个扇区中。平日,在台式机或其它系统上,BIOS 将节制移交给向导装载法度榜样。这就提出了一个有趣的问题:谁将向导装载法度榜样装入(在大年夜多半环境中)没有 BIOS 的嵌入式设备上呢?

办理这个问题有两种老例技巧:专用软件和微小的向导代码(tiny bootcode)。

专用软件可以直接与远程系统上的闪存设备进行交互并将向导装载法度榜样安装在闪存的给定位置中。闪存设备是与存储设备功能类似的特殊芯片,而且它们能持久存储信息 — 即,在从新向导时不会擦除其内容。

这个软件应用目标(在嵌入式开拓中,嵌入式设备平日被称为目标)上的 JTAG 端口,它是用于履行外部输入(平日来自立机机械)的指令的接口。JFlash-linux 是一种用于直接写闪存的盛行对象。它支持为数浩繁的闪存芯片;它在主机机械(平日是 i386 机械 — 本文中我们把一台 i386 机械称为主机)上履行并经由过程 JTAG 接口应用并行端口造访目标的闪存芯片。当然,这意味着目标必要有一个并行接口使它能与主机通信。Jflash-linux 在 Linux 和 Windows 版本中都可应用,可以在敕令行顶用以下敕令启动它:

Jflash-linux

某些种类的嵌入式设备具有微小的向导代码 — 根据几个字节的指令 — 它将初始化一些 DRAM 设置并启用目标上的一个串行(或者 USB,或者以太网)端口与主机法度榜样通信。然后,主机法度榜样或装入法度榜样可以应用这个连接将向导装载法度榜样传送到目标上,并将它写入闪存。

在安装它并给予其节制后,这个向导装载法度榜样履行下列种种功能:

·初始化 CPU 速率

·初始化内存,包括启用内存库、初始化内存设置设置设备摆设摆设寄存器等

·初始化串行端口(假如在目标上有的话)

·启用指令/数据高速缓存

·设置客栈指针

·设置参数区域并构造参数布局和标记(这是紧张的一步,由于内核在标识根设备、页面大年夜小、内存大年夜小以及更多内容时要应用向导参数)

·履行 POST(加电自检)来标识存在的设备并申报任何问题

是以能够从因特网上得到已预编译的二进制文件是一件好事(但不太好的一点是,今朝它们大年夜多半只限于基于 ARM 的系统,但迟早会改变的)。一些对照盛行的已预编译的对象链包括那些来自 Compaq(Familiar Linux )、LART(LART Linux)和 Embedian(基于 Debian 但与它无关)的对象链 — 所有这些对象链都用于基于 ARM 的平台。

内核设置

Linux 社区正积极地为新硬件添加功能部件和支持、在内核中修正差错并且及时地进行老例改进。这导致大年夜约每 6 个月(或 6 个月不到)就有一个稳定的 Linux 树的新发行版。不合的掩护者掩护针对特定体系布局的不合内核树和补丁。当为一个项目选择了一个内核时,您必要评估最新发行版的稳定性若何、它是否相符项目请乞降硬件平台、从编程角度来看它的舒适程度以及其它难以确定的方面。还有一点也异常紧张:找到必要利用于基础内核的所有补丁,以便为特定的体系布局调剂内核。

内核结构

内核结构分为特定于体系布局的部分和与体系布局无关的部分。内核中特定于体系布局的部分首先履行,设置硬件寄存器、设置设置设备摆设摆设内存映射、履行特定于体系布局的初始化,然后将节制转给内核中与体系布局无关的部分。系统的另外部分在这第二个阶段时代进行初始化。内核树下的目录 arch/ 由不合的子目录组成,每个子目任命于一个不合的体系布局(MIPS、ARM、i386、SPARC、PPC 等)。每一个这样的子目录都包孕 kernel/ 和 mm/ 子目录,它们包孕特定于体系布局的代码来完成象初始化内存、设置 IRQ、启用高速缓存、设置内核页面表等操作。一旦装入内核并给予其节制,就首先调用这些函数,然后初始化系统的另外部分。

根据可用的系统资本和向导装载法度榜样的功能,内核可以编译成 vmlinux、Image 或 zImage。vmlinux 和 zImage 之间的主要差别在于 vmlinux 是实际的(未压缩的)可履行文件,而 zImage 是或多或少包孕相同信息的自解压压缩文件金冠游戏 — 只是压缩它以处置惩罚(平日是 Intel 强制的)640 KB 向导光阴的限定。有关所有这些的势力巨子性解释,请参阅 Linux Magazine 的文章“Kernel Configuration: dealing with the unexpected”(请参阅参考资料)。

LMA 是装入模块地址;它表示将要装入内核的目标虚拟内存中的地址。TEXTADDR 是内核的虚拟肇端地址,并且在 arch// 下的 Makefile 中指定它的值。这个地址必须与向导装载法度榜样应用的地址相匹配。

一旦向导装载法度榜样将内核复制到闪存或 DRAM 中,内核就被从新定位到 TEXTADDR — 它平日在 DRAM 中。然后,向导装载法度榜样将节制转给这个地址,以便内核能开始履行。

参数通报和内核向导

stext 是内核进口点,这意味着在内核向导时将首先履行这一节下的代码。它平日用汇编说话编写,并且平日它在 arch// 内核目录下。这个代码设置内核页面貌录、创建身份内核映射、标识体系布局和处置惩罚器以及履行分支 start_kernel(初始化系统的主例程)。

start_kernel 调用 setup_arch 作为履行的第一步,在此中完成特定于体系布局的设置。这包括初始化硬件寄存器、标识根设备和系统中可用的 DRAM 和闪存的数量、指定系统中可用页面的数目、文件系统大年夜小等等。所有这些信息都以参数形式从向导装载法度榜样通报到内核。

将参数从向导装载法度榜样通报到内核有两种措施:parameter_structure 和标记列表。在这两种措施中,不同意应用参数布局,由于它强加了限定:指定在内存中,每个参数必须位于 param_struct 中的特定偏移量处。最新的内核期望参数作为标记列表的款式来通报,并将参数转化为已标记款式。param_struct 定义在 include/asm/setup.h 中。它的一些紧张字段是:

清单 3. 样本参数布局struct param_struct {

unsigned long page_size; /* 0: Size of the page */

unsigned long nr_pages; /* 4: Number of pages in the system */

unsigned long ramdisk /* 8: ramdisk size */

unsigned long rootdev; /* 16: Number representing the root device */

unsigned long initrd_start; /* 64:金冠游戏 starting address of initial ramdisk */

/* This can be either in flash/dram */

unsigned long initrd_size; /* 68: size of initial ramdisk */

}

设备驱动法度榜样

嵌入式系统平日有许多设备用于与用户交互,象触摸屏、小键盘、滚动轮、传感器、RA232 接口、LCD 等等。除了这些设备外,还有许多其它专用设备,包括闪存、USB、GSM 等。内核经由过程所有这些设备各自的设备驱动法度榜样来节制它们,包括 GUI 用户利用法度榜样也经由过程造访这些驱动法度榜样来造访设备。本节着重评论争论平日险些在每个嵌入式情况中都邑应用的一些紧张设备的设备驱动法度榜样。

帧缓冲区驱动法度榜样

这是最紧张的驱动法度榜样之一,由于经由过程这个驱动法度榜样才能使系统屏幕显示内容。帧缓冲区驱动法度榜样平日有三层。最底层是基础节制台驱动法度榜样 drivers/char/console.c,它供给了文本节制台老例接口的一部分。经由过程应用节制台驱动法度榜样函数,我们能将文本打印到屏幕上 — 但图形或动画还不能(这样做必要应用视频模式功能,平日呈现在中心层,也便是 drivers/video/fbcon.c 中)。这个第二层驱动法度榜样供给了视频模式中绘图的老例接口。

帧缓冲区是显卡上的内存,必要将它内存映射到用户空间以便可以将图形和文本能写到这个内存段上:然后这个信息将反应到屏幕上。帧缓冲区支持前进了绘图的速率和整体机能。这也是顶层驱动法度榜样惹人留意之处:顶层是异常特定于硬件的驱动法度榜样,它必要支持显卡不合的硬件方面 — 象启用/禁用显卡节制器、深度和模式的支持以及调色板等。所有这三层都互相依附以实现精确的视频功能。与帧缓冲区有关的设备是 /dev/fb0(主设备号 29,次设备号 0)。

输入设备驱动法度榜样

可触摸板是用于嵌入式设备的最基础的用户交互设备之一 — 小键盘、传感器和滚动轮也包孕在许多不合设备中以用于不合的用途。

触摸板设备的主要功能是随时申报用户的触摸,并标识触摸的坐标。这平日在每次发生触摸时,经由过程天生一其中断来实现。

有两个盛行的用户模块可启用对闪存的造访:MTD_CHAR 和 MTD_BLOCK。

MTD_CHAR 供给对闪存的原始字符造访,而 MTD_BLOCK 将闪存设计为可以在上面创建文件系统的老例块设备(象 IDE 磁盘)。与 MTD_CHAR 关联的设备是 /dev/mtd0、mtd1、mtd2(等等),而与 MTD_BLOCK 关联的设备是 /dev/mtdblock0、mtdblock1(等等)。因为 MTD_BLOCK 设备供给象块设备那样的模拟,平日更可取的是在这个模拟根基上创建象 FTL 和 JFFS2 那样的文件系统。

为了进行这个操作,可能必要创建分区表将闪存设备分拆到向导装载法度榜样节、内核节和文件系统节中。样本分区表可能包孕以下信息:

清单 5. MTD 的简单闪存设备分区struct mtd_partition sample_partition = {

{

/* First partition */

name : bootloader, /* Bootloader section */

size : 0x00010000, /* Size */

offset : 0, /* Offset from start of flash- location 0x0*/金冠游戏

mask_flags : MTD_WRITEABLE /* This partition is not writable */

},

{ /* Second partition */

name : Kerne金冠游戏l, /* Kernel section */

size : 0x00100000, /* Size */

offset : MTDPART_OFS_APPEND, /* Append after bootloader section */

mask_flags : MTD_WRITEABLE /* This partition is not writa金冠游戏ble */

},

{ /* Third partition */

name : JFFS2, /* JFFS2 filesystem */

size : MTDPART_SIZ_FULL, /* Occupy rest of flash */

offset : MTDPART_OFS_APPEND /* Append after kernel section */

}

}

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

您可能还会对下面的文章感兴趣: