Chinaunix首页 | 论坛 | 博客

Go

  • 博客访问: 227663
  • 博文数量: 67
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 783
  • 用 户 组: 普通用户
  • 注册时间: 2013-10-12 16:29
文章分类

全部博文(67)

文章存档

2015年(1)

2014年(47)

2013年(19)

我的朋友

分类: LINUX

2013-10-23 23:12:44

原创:kylin_zeng ;http://blog.chinaunix.net/uid/23795897.html 参考国嵌教育,再次感谢各位国嵌的老师。
1、嵌入式Linux系统由Linux内核与根文件系统两部分构成,两者缺一不可。

2、制作嵌入式平台使用的Linux内核,方法和制作PC平台的Linux内核基本一致,下面使用对比的方式介绍如何制作用于mini2440开发板的内核。
1)清除原有配置与中间文件  x86:  make distclean      arm: make distclean
2)配置内核x86:  make menuconfig   arm: make menuconfig ARCH=arm  /*nfs与ramdisk启动的区别*/
3)编译内核 x86:  make bzImage    arm: make uImage ARCH=arm     CROSS_COMPILE=arm-linux-

二、根文件系统
根文件系统是Linux启动时使用的第一个文件系统。没有根文件系统,Linux将无法正常启动。根文件系统由一系列目录组成,目录中包含了应用程序、C库、以及相关的配置文件。

1)创建根文件系统的目录
mkdir rootfs 
cd rootfs
mkdir bin dev etc lib proc sbin sys usr mnt tmp var
mkdir usr/bin usr/lib usr/sbin lib/modules

2)创建设备文件
cd dev/
mknod -m 666 console c 5 1
mknod -m 666 null c 1 3
cd ..
3)安装/etc
tar etc.tar.gz –C /xxx/rootfs

4)编译内核模块
进入Linux内核目录(linux 2.6.29)
make modules ARCH=arm 
CROSS_COMPILE=arm-linux-
5)安装内核模块
make modules_install ARCH=arm 
INSTALL_MOD_PATH=/xxx/rootfs
6)配置busybox
进入busybox目录执行 make menuconfig
a.进入Busybox Settings ->
build Options->
选中“Build busybox as a static binary”, 静态链接
Cross Compiler prefix (arm-linux-)
Installation Options->
选中“Don‘t use /usr”, 选中该项可以避免busybox 被安装到宿主系统的
/usr目录下,破坏宿主系统
Busybox Installation Prefix (/xxx/rootfs)
该选项表明编译后的busybox的安装位置

7)编译、安装busybox
vmake ARCH=arm CROSS_COMPILE=arm-linux-
vmake install

三、ramdisk
基于前面步骤制作好的根文件系统,可进
一步制作ramdisk,步骤如下:
1)genext2fs-b 8192 -d /xxx/rootfsramdisk
** genext2fs 为产生ramdisk的工具**
2)gzip -9 -f ramdisk


四、linux文件系统:
Linux支持多种文件系统类型,包括ext2、ext3、vfat、jffs、romfs和nfs等,为了对各类文件系统进行统一管理,Linux引入了虚拟文件系统VFS(Virtual File System),为各类文件系统提供一个统一的应用编程接口。
图:

五、文件系统类型
根据存储设备的硬件特性、系统需求,不同的文件系统类型有不同的应用场合。在嵌入式Linux应用中,主要的存储设备为RAM 和FLASH,常用的基于存储设备的文件系统类型包括:jffs2, yaffs, cramfs, ramdisk, ramfs等。

1)基于FLASH的文件系统:Flash(闪存)作为嵌入式系统的主要存储媒介,主要有NOR和NAND两种技术。Flash存储器的擦写次数是有限的,NAND闪存还有特殊的硬件接口和读写时序。因此,必须针对Flash的硬件特性设计符合应用要求的文件系统。

2)JFFS文件系统:JFFS文件系统最早是由瑞典Axis Communications公司基于Linux2.0内核为嵌入
式系统开发的文件系统。JFFS2是RedHat公司基于JFFS开发的闪存文件系统,最初是针对RedHat公司的嵌入式产品eCos开发的嵌入式文件系统,所以JFFS2也可以用在Linux, uCLinux中。

3)Jffs2: 日志闪存文件系统版本2 (Journalling Flash FileSystem v2)主要用于NOR型flash,基于MTD驱动层,特点是:可读写、支持数据压缩的日志型文件系统,并提供了崩溃/掉电安全保护等。缺点主要是当文件系统已满或接近满时,因为垃圾收集的关系而使jffs2的运行速度大大放慢。

4)jffsx不适合用于NAND闪存主要是因为NAND闪存的容量一般较大,这样导致jffs为维护日志节点所占用的内存空间迅速增大。另外,jffsx文件系统在挂载时需要扫描整个FLASH,以找出所有的日志节点,建立文件结构,对于大容量的NAND闪存会耗费大量时间。

5)Yaffs:yaffs/yaffs2 (Yet Another Flash File System)是专为NAND型flash而设计的一种日志型文件系统。与jffs2相比,它减少了一些功能(例如不支持数据压缩),所以速度更快,挂载时间很短,对内存的占用较小。另外,它还是跨平台的文件系统,除了Linux和eCos,还支持WinCE,pSOS和ThreadX等。

yaffs与yaffs2的主要区别在于,前者仅支持小页(512 Bytes) NAND闪存,后者则可支持大页(2KB) NAND闪存。同时,yaffs2在内存空间占用、垃圾回收速度、读/写速度等方面均有大幅提升。

6)Cramfs:Cramfs是Linux的创始人Linus 参与开发的一种只读的压缩文件系统,它也基于MTD驱动程序。Cramfs文件系统以压缩方式存储,在运行时解压缩,所有的应用程序要求被拷到RAM里运行。另外,它的速度快,效率高,其只读的特点有利于保护文件系统免受破坏,提高了系统的可靠性。

7)基于RAM的文件系统:Ramdisk是将一部分固定大小的内存当作分区来使用。它并非一个实际的文件系统,而是一种将实际的文件系统(如ext2)装入内存的机制。将一些经常被访问而又无需更改的文件通过Ramdisk放在内存中,可以明显地提高系统的性能。

8)NFS:NFS (Network File System)是由Sun开发的一种在不同机器之间通过网络共享文件的技术。在嵌入式Linux系统的开发调试阶段,可以利用该技术在主机上建立基于NFS的根文件系统,挂载到嵌入式设备,可以很方便地修改根文件系统的内容。


*******************************************************************************

以下装载:http://ccgang1989.blog.163.com/blog/static/499261762012422104624972/

1.nfs
(1)创建实验目录
# mkdir -p /home/chen/guoqian/4-3-3
将国嵌光盘的linux-2.6.29(在源代码4-3-1目录下)内核拷贝到当前目录
#pwd
/home/chen/guoqian/4-3-3/
# cp -r ../4-3-1/linux-2.6.29   ./ 
(2)清理内核中间文件、配置文件
# pwd
/home/chen/guoqian/4-3-3/linux-2.6.29
# make distclean
(3)选择参考配置文件
将配置文件config-mini2440改成.config
#cp config-mini2440  .config 
修改.config将下面一行改成:
CONFIG_CMDLINE="root=/dev/nfs rw nfsroot=192.168.2.103:/home/chen/mini2440share/rootfs ip=192.168.2.102 console=ttySAC0 mem=64M"
注:CMDLINE ==>命令行启动参数定义了内核挂载根文件系统的方式
root=/dev/nfs ==>表示内核采用nfs的方式起根文件系统
rw  ==>文件可读可写
nfsroot=192.168.2.103:/home/chen/mini2440share/rootfs  ==>表示nfs的根文件系统位于nfs服务器/home/chen/mini2440share/rootfs目录,服务器的IP为192.168.2.103
console=ttySAC0 mem=64M ==>ttySAC0做为控制台,内存64M
(4)配置内核
# pwd
/home/chen/guoqian/4-3-3/linux-2.6.29
make  menuconfig ARCH=arm
进入File systems --> Network File Systems -->
<*> NFS client support
[*] NFS client support for NFS version 3
[*] Root file system on NFSnfs/ramdisk/initramfs文件系统的制作 - 至庸 - THE BOLG OF CHEN
上面三项必须选上,保存后退出。
(5) 编译内核
# pwd
/home/chen/guoqian/4-3-3/linux-2.6.29
# make uImage ARCH=arm  CROSS_COMPILE=arm-linux-
编译后内核映像位于arch/arm/boot目录下

在uboot下通过tftp下载uImage到开发板后启动内核就可以看到被nfs挂载的根文件系统
Mini2440# tftp 31000000 uImage 
Mini2440# bootm 3100000


2. ramdisk
(1)创建实验目录
# mkdir -p /home/chen/guoqian/4-3-4
将国嵌光盘的linux-2.6.29(在源代码4-3-1目录下)内核拷贝到当前目录
#pwd
/home/chen/guoqian/4-3-4/
# cp -r ../4-3-1/linux-2.6.29  ./ 
(2)清理内核中间文件、配置文件
# pwd
/home/chen/guoqian/4-3-4/linux-2.6.29
make distclean
(3)选择参考配置文件
将配置文件config-mini2440改成.config
cp config-mini2440  .config 
修改.config将下面一行改成:
CONFIG_CMDLINE="root=/dev/ram  rw initrd=0x32000000,0x200000 console=ttySAC0 mem=64M"
注:root=/dev/ram ==>表示内核采用ramdisk的方式起根文件系统
rw  ==>文件可读可写initrd=0x32000000,0x200000 ==>表示内核从0x32000000开始读取,读取0x200000大小的ramdisk
console=ttySAC0 mem=64M ==>ttySAC0做为控制台,内存64M
(4)配置内核
 # pwd
/home/chen/guoqian/4-3-4/linux-2.6.29
# make  menuconfig ARCH=arm
1) General setup -->选中下面的选项
nfs/ramdisk/initramfs起根文件系统 - 至庸 - THE BOLG OF CHEN
 2) Device Driver -->Block device -->选中如下选项
nfs/ramdisk/initramfs起根文件系统 - 至庸 - THE BOLG OF CHEN

(5) 编译内核
# pwd
/home/chen/guoqian/4-3-4/linux-2.6.29
# make uImage ARCH=arm  CROSS_COMPILE=arm-linux-
编译后内核映像位于arch/arm/boot目录下
(6) ramdisk文件制作
#pwd
/home/chen/guoqian/4-3-4/
# ls
genext2fs  linux-2.6.29
用genext2fs  工具产生ramdisk文件,rootfs中不要的文件可以事先删除,如lib/modules/2.6.29.4-FriendlyARM/*下的文件暂时用不上可以删除。
#./genext2fs  -b 8192 -d  ../4-3-2/rootfs/
压缩ramdisk生成 ramdisk.gz
# gzip -9 -f ramdisk 

在uboot下通过tftp先后下载uImage和ramdisk.gz到开发板后启动内核就可以看到ramdisk方式的根文件系统
Mini2440# tftp 31000000 uImage 
Mini2440# tftp 32000000 ramdisk.gz
Mini2440# bootm 3100000



3.initramfs
(1)创建实验目录
# mkdir -p /home/chen/guoqian/4-3-5
将国嵌光盘的linux-2.6.29(在源代码4-3-1目录下)内核拷贝到当前目录
#pwd
/home/chen/guoqian/4-3-5/
# cp -r ../4-3-1/linux-2.6.29   ./ 
(2)修改根文件系统,将init软链接到busybox
#pwd
/home/chen/guoqian/4-3-2/rootfs
# ln -s ./bin/busybox  init
linux kernel在自身初始化完成后,需要能够找到并运行第一个用户程序(通常叫做init程序)。用户程序库存在于文件系统中,因此内核必须找到并挂载一个文件系统文件系统才可以成功完成系统的引导过程。
(3)清理内核中间文件、配置文件
# pwd
/home/chen/guoqian/4-3-5/linux-2.6.29
# make distclean
(3)选择参考配置文件
将配置文件config-mini2440改成.config
#cp config-mini2440  .config 
修改.config将下面一行改成:
CONFIG_CMDLINE="console=ttySAC0 mem=64M"
注:CMDLINE ==>命令行启动参数定义了内核挂载根文件系统的方式
console=ttySAC0 mem=64M ==>ttySAC0做为控制台,内存64M
(4)配置内核
# pwd
/home/chen/guoqian/4-3-5/linux-2.6.29
make  menuconfig ARCH=arm
进入General setup -->选中如下选项
nfs/ramdisk/initramfs起根文件系统 - 至庸 - THE BOLG OF CHEN
 在Initial RAM filesystem and RAM disk (initramfs/initrd) support下面的Initramfs source file(s) 中输入根文件的目录/home/chen/guoqian/4-3-2/rootfs
nfs/ramdisk/initramfs起根文件系统 - 至庸 - THE BOLG OF CHEN
 
(5) 编译内核
# pwd
/home/chen/guoqian/4-3-5/linux-2.6.29
# make uImage ARCH=arm  CROSS_COMPILE=arm-linux-
编译后内核映像位于arch/arm/boot目录下

在uboot下通过tftp下载uImage到开发板后启动内核就可以看到根文件系统
Mini2440# tftp 31000000 uImage 
Mini2440# bootm 3100000

Initramfs起根文件系统编译产生的内核映像uImage包括kernel和文件系统,相当于将内核和文件系统合在一起








阅读(2406) | 评论(0) | 转发(0) |
0

上一篇:指针

下一篇:linux下的 fdisk

给主人留下些什么吧!~~