微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > 关于嵌入式设备上的Linux 系统开发

关于嵌入式设备上的Linux 系统开发

时间:08-28 来源:互联网 点击:

载源代码、修补补盯配置、编译、设置头文件、安装以及很多很多的操作。另外,这样一个彻底的构建过程对内存和硬盘的需求是巨大的。如果没有足够的内存和硬盘空间,那么在构建阶段由于相关性、配置或头文件设置等问题会突然冒出许多问题。

因此能够从因特网上获得已预编译的二进制文件是一件好事(但不太好的一点是,目前它们大多数只限于基于 ARM 的系统,但迟早会改变的)。一些比较流行的已预编译的工具链包括那些来自 Compaq(Familiar Linux )、LART(LART Linux)和 Embedian(基于 Debian 但与它无关)的工具链 D 所有这些工具链都用于基于 ARM 的平台。

内核设置

Linux 社区正积极地为新硬件添加功能部件和支持、在内核中修正错误并且及时地进行常规改进。这导致大约每 6 个月(或 6 个月不到)就有一个稳定的 Linux 树的新发行版。不同的维护者维护针对特定体系结构的不同内核树和补丁。当为一个项目选择了一个内核时,您需要评估最新发行版的稳定性如何、它是否符合项目要求和硬件平台、从编程角度来看它的舒适程度以及其它难以确定的方面。还有一点也非常重要:找到需要应用于基本内核的所有补丁,以便为特定的体系结构调整内核。

内核布局

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

根据可用的系统资源和引导装载程序的功能,内核可以编译成 vmlinux、Image 或 zImage。vmlinux 和 zImage 之间的主要区别在于 vmlinux是实际的(未压缩的)可执行文件,而 zImage是或多或少包含相同信息的自解压压缩文件 D 只是压缩它以处理(通常是 Intel 强制的)640 KB 引导时间的限制。有关所有这些的权威性解释,请参阅 Linux Magazine的文章“Kernel Configuration: dealing with the unexpected”(请参阅 参考资料)。

内核链接和装入

一旦为目标系统编译了内核后,通过使用引导装载程序(它已经被装入到目标的闪存中),内核就被装入到目标系统的内存(在 DRAM 中或者在闪存中)。通过使用串行、USB 或以太网端口,引导装载程序与主机通信以将内核传送到目标的闪存或 DRAM 中。在将内核完全装入目标后,引导装载程序将控制传递给装入内核的地址。

内核可执行文件由许多链接在一起的对象文件组成。对象文件有许多节,如文本、数据、init 数据、bass 等等。这些对象文件都是由一个称为 链接器脚本的文件链接并装入的。这个链接器脚本的功能是将输入对象文件的各节映射到输出文件中;换句话说,它将所有输入对象文件都链接到单一的可执行文件中,将该可执行文件的各节装入到指定地址处。 vmlinux.lds是存在于 arch// 目录中的内核链接器脚本,它负责链接内核的各个节并将它们装入内存中特定偏移量处。典型的 vmlinux.lds 看起来象这样:

清单 2. 典型的 vmlinux.lds 文件

output_ARCH() /* includes architecture type */

ENTRY(stext) /* stext is the kernel entry point */

SECTIONS /* SECTIONS command describes the layout

of the output file */

{

. = TEXTADDR; /* TEXTADDR is LMA for the kernel */

.init : { /* Init code and data*/

_stext = .; /* First section is stext followed

by __init data section */

__init_begin = .;

*(.text.init)

__init_end = .;

}

.text : { /* Real text segment follows __init_data section */

_text = .;

*(.text)

_etext = .; /* End of text section*/

}

.data :{

_data=.; /* Data section comes after text section */

*(.data)

_edata=.;

} /* Data section ends here */

.bss : { /* BSS section follows symbol table section */

__bss_start = .;

*(.bss)

_end = . ; /* BSS section ends here */

}

}

LMA 是装入模块地址;它表示将要装入内核的目标虚拟内存中的地址。 TEXTADDR 是内核的虚拟起始地址,并且在 arch// 下的 Makefile 中指定它的值。这个地址必须与引导装载程序使用的地址相匹配。

一旦引导装载

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top