好文档 - 专业文书写作范文服务资料分享网站

Linux嵌入式系统环境搭建、内核配置、最小系统启动与设备文件分析

天下 分享 时间: 加入收藏 我要投稿 点赞

别,流程非常简单,cpio-initrd并没有使用额外的ramdisk,而是将其内容输入到rootfs中,其实rootfs本身也是一个基于内存的文件系统。这样就省掉了ramdisk的挂载、卸载等步骤。 cpio-initrd启动完/init进程,内核的任务就结束了,剩下的工作完全交给/init处理;而对于image-initrd,内核在执行完/linuxrc进程后,还要进行一些收尾工作,并且要负责执行真正的根文件系统的/sbin/init。 4.1.1.3

u-boot启动参数如何设置ramdisk作为文件系统

当使用u-boot启动内核时,如果ramdisk作为根文件系统设置参数如下: setenv bootargs root=/dev/ram rw; tftp 1000000 zImage;

tftp 2000000 ramdisk.image; bootm 1000000 4.1.1.4

grub关于initrd参数的设置

以上是grub的截图,其中initrd 的参数/initrd-2.4.18-14.img就是镜像,通过此参数可以测试用户定制的initrd。 4.1.1.5

嵌入式系统RamDisk综述

Ram:内存,Disk:磁盘,在Linux中可以将一部分内存当作分区来使用,称之为RamDisk。对于一些经常被访问、并且不会被更改的文件,可以将它们通过RamDisk放在内存中,能够明显地提高系统性能。RamDisk工作于虚拟文件系统(VFS)层,不能格式化,但可以创建多个RamDisk。虽然现在硬盘价钱越来越便宜,但对于一些我们想让其访问速度很高的情况下,RamDisk还是很好用的。

如果对计算速度要求很高,可以通过增加内存来实现,使用ramdisk技术。 一个RamDisk就是把内存假设为一个硬盘驱动器,并且在它的上面存储文件。假设有几个文件要频繁的使用,如果将它们加到内存当中,程序运行速度会大幅度提高,因为内存的读写速度远高于硬盘。划出部分内存提高整体性能,不亚于更换新的CPU。像Web服务器这样的计算机,需要大量读取和交换特定的文件。因此,在Web服务器上建立RamDisk会大大提高网络读取速度。

RamDisk就是将内存模拟为硬盘空间。无论什么时候你使用RamDisk,实际上你是在使用内存而不是硬盘。在这一点上既有优点又有缺点。最基本的,最大的优点是你是在使用内存,你所做的一切都会快一些,因为硬盘的速度较内存慢。最大的缺点是如果你改变了数据库服务器的内容并且重新启动机器时,所做的一切改动都将丢失。

4.2 日志闪存文件系统(JFFS2)

4.3 NFS文件系统

4.4 第二版扩展文件系统(Ext2fs)

5 第五章busyBox移植与应用

BusyBox 是为构建内存有限的嵌入式系统的一个优秀工具。BusyBox 通过将很多必需的工具放入一个可执行程序,并让它们可以共享代码中相同的部分,从而对它们的大小进行了很大程度的缩减,BusyBox 对于嵌入式系统来说是一个非常有用的工具,因此值得我们花一些时间进行探索。

5.1 Busybox获取

http://www.busybox.net/downloads/可以下载到最新的代码。 以下以busybox-1.1.3为例进行说明 $ tar xvfz busybox-1.1.1.tar.gz $ cd busybox-1.1.1

5.2 Busybox的编译与配置

5.2.1 BusyBox 编译选项

BusyBox 包括了几个编译选项,可以帮助为我们编译和调试正确的 BusyBox。

目标 help

说明

显示 make 选项的完整列表 启用默认的(通用)配置 禁用所有的应用程序(空配置) 启用所有的应用程序(完整配置) 启用所有的应用程序,但是不包括子特性 基于文本的配置工具

N-curses(基于菜单的)配置工具

编译 BusyBox 二进制文件和文档(./docs) 编译 BusyBox 二进制文件 清除源代码树 彻底清除源代码树

显示所启用的应用程序的文本/数据大小

defconfig allnoconfig allyesconfig config all clean sizes

allbareconfig menuconfig busybox distclean

在定义配置时,我们只需要输入 make 就可以真正编译 BusyBox 二进制文件。例如,要为所有的应用程序编译 BusyBox,我们可以执行下面的命令:

$ make allyesconfig $ make

5.2.2 定制与编译busybox

$make menuconfig Busybox Settings -->

General Configuration -->

[*] Support for devfs Build Options -->

[*] Build BusyBox as a static binary (no shared libs)

/* 将busybox编译为静态连接,少了启动时找动态库的麻烦 */ [*] Do you want to build BusyBox with a Cross Compiler? (/home/arm/3.3.2/bin/armlinux) Cross Compiler prefix /* 指定交叉编译工具路径 */

Init Utilities >

[*] init

[*] Support reading an inittab file

/* 支持init读取/etc/inittab配置文件,一定要选上 */ Shells >

Choose your default shell (ash) >

/* (X) ash 选中ash,这样生成的时候才会生成bin/sh文件 * 看看我们前头的linuxrc脚本的头一句: * #!/bin/sh 是由bin/sh来解释执行的 */ [*] ash

Coreutils >

[*] cp [*] cat [*] ls [*] mkdir

[*] echo (basic SuSv3 version taking no options) [*] env [*] mv [*] pwd [*] rm [*] touch Editors >

[*] vi

Linux System Utilities >

[*] mount [*] umount

[*] Support loopback mounts [*] Support for the old /etc/mtab file Networking Utilities >

[*] inetd /*

* 支持inetd超级服务器

* inetd的配置文件为/etc/inetd.conf文件,

* \在该部分的4: 相关配置文件的创建\一节会有说明 */

$make TARGET_ARCH=arm CROSS=armlinux all install # ls _install/

bin lib linuxrc sbin usr 此目录就是默认的安装目录。

5.3 如何向Busybox添加命令

将这个新命令称为 newcmd,并将它放到了 ./miscutils 目录中。这个新命令的源代码如下:

#include \

int newcmd_main( int argc, char *argv[] )

{ int i;

printf(\ for (i = 0 ; i < argc ; i++) {

printf(\ } return 0; }

l 第一个步骤是为新命令的源代码选择一个位置。我们要根据命令的类型(网络,shell

等)来选择位置,并与其他命令保持一致。这一点非常重要,因为这个新命令最终会在 menuconfig 的配置菜单中出现(在这个例子中,是 Miscellaneous Utilities 菜单)。

l 修改makefile,我们要将这个新命令的源代码添加到所选子目录中的 Makefile.in

中。在本例中,我更新了 ./miscutils/Makefile.in 文件。按照字母顺序来添加新命令,以便维持与现有命令的一致性:

将命令添加到 Makefile.in 中

MISCUTILS-$(CONFIG_MT) += mt.o MISCUTILS-$(CONFIG_NEWCMD) += newcmd.o MISCUTILS-$(CONFIG_RUNLEVEL) += runlevel.o

l 修改config.in,更新 ./miscutils 目录中的配置文件,以便让新命令在配置过程中是

可见的。这个文件名为 Config.in,新命令是按照字母顺序添加的:

将命令添加到 Config.in 中

config CONFIG_NEWCMD

bool \default n help

newcmd is a new test command.

这个结构定义了一个新配置项(通过 config 关键字)以及一个配置选项(CONFIG_NEWCMD)。新命令可以启用,也可以禁用,因此我们对配置的菜单属性使用了 bool (Boolean)值。这个命令默认是禁用的(n 表示 No),我们可以最后放上一个简短的 Help 描述。在源代码树的 ./scripts/config/Kconfig-language.txt 文件中,我们可以看到配置语法的完整文法。

l 更新 ./include/applets.h 文件,使其包含这个新命令。将下面这行内容添加到这个

文件中,记住要按照字母顺序。维护这个次序非常重要,否则我们的命令就会找不到。

将命令添加到 applets.h 中

USE_NEWCMD(APPLET(newcmd, newcmd_main, _BB_DIR_USER_BIN, _BB_SUID_NEVER))

这定义了命令名(newcmd),它在 Busybox 源代码中的函数名(newcmd_main),应该在哪里会为这个新命令创建链接(在这种情况中,它在 /usr/bin 目录中),最后这个命令是否有权设置用户 id(在本例中是 no)。

l 向 ./include/usage.h 文件中添加详细的帮助信息。正如您可以从这个文件的例子中

看到的一样,使用信息可能非常详细。在本例中,只添加了一点信息,这样就可以编译这个新命令了:

向 usage.h 添加帮助信息

#define newcmd_trivial_usage \

#define newcmd_full_usage \

l 最后一个步骤是启用新命令(通过 make menuconfig,然后在 Miscellaneous Utilities

菜单中启用这个选项)然后使用 make 来编译 BusyBox。

使用新的 BusyBox,我们可以对这个新命令进行测试,如

$ ./busybox newcmd arg1 newcmd called: arg[0] = newcmd arg[1] = arg1

$ ./busybox newcmd --help

BusyBox v1.1.1 (2006.04.12-13:47+0000) multi-call binary

Usage: newcmd None None

5.4 采用busybox建立根文件系统

参照,创建定制 initrd 的shell脚本,一节

Linux嵌入式系统环境搭建、内核配置、最小系统启动与设备文件分析

别,流程非常简单,cpio-initrd并没有使用额外的ramdisk,而是将其内容输入到rootfs中,其实rootfs本身也是一个基于内存的文件系统。这样就省掉了ramdisk的挂载、卸载等步骤。cpio-initrd启动完/init进程,内核的任务就结束了,剩下的工作完全交给/init处理;而对于image-initrd,内核在执行完/linuxrc进程后,还要进行一些收尾工作,并且
推荐度:
点击下载文档文档为doc格式
95se126yqz6tzp833x1q
领取福利

微信扫码领取福利

微信扫码分享