一.首先一个嵌入式linux产品开发大致分为以下几个流程:
1. 硬件工程师:硬件规划,硬件设计,制板,焊接,硬件调试
2. 系统工程师或驱动工程师:bootloader移植到1中所开发出来的硬件平台,移植linux内核,制作供内核启动的根文件系统
3. 驱动工程师:按照产品规划书,要求,移植必备的驱动
linux创建文件指令4. 应用工程师:业务相关的应用程序,开发和产品密切相关的应用程序,驱动程序
5. 功能测试,性能测试,系统集成此时
6. 实验(系统设备)发布
二.根文件系统分析
1.根文件系统简介
Windows操作系统可以将硬盘划分为C,D,E,F等各个盘分别访问,linux同理将MTD设备划分为
若干个分区,在不同的分区存放不同类别的文件。与windows的C盘类似,linux一样要在一个分区上存放系统启动所必需的文件如下图所示:
内核启动后运行的第一个程序init,给用户提供操作界面的shell脚本程序,应用程序所依赖的库等,这些必需、基本的文件合称为根文件系统,存放在一个分区中,linux系统启动后首先挂接这个分区,称为挂接根文件系统。其他分区上所有的目录,文件的集合,也称为文件系统。有此可见linux启动时使用的第一个文件系统便是根文件系统,若此文件系统挂接不成功或者参数配置不正确则linux内核无法正常启动。
按照FHS标准,根文件系统顶层下一般有如下几个目录:
bin:存放所有用户都可以使用的,基本的命令
sbin:存放基本的系统命令,用于启动系统,修复系统
dev:存放设备文件和其它特殊文件
etc:存放系统配置文件,包括启动文件
usr:存放共享,只读的程序和数据
proc:空目录,常作为proc文件系统的挂接点
lib:存放共享库和可加载模块,共享库用于启动系统,运行根文件系统中的可执行程序
boot:引导加载程序使用的静态文件
home:用户目录,可选的,包括供服务帐号锁使用的主目录,如FTP
mnt:用于临时挂接某个文件系统的挂接点,通常是空目录
opt:给主机额外安装软件所摆放的目录
root:root用户的主目录
tmp:存放临时文件,通常是空目录
var:存放可变数据
2.根文件系统制作工具Busybox
Busybox俗称嵌入式开发中的瑞士军刀,将众多的unix命令集合进一个很小的可执行程序中,可以用来替换GNUfileutils,shellutils等工具集,支持uclibc库和glibc库,为www.busybox进行下载。
下载完毕,解压后会发现有如下一些配置选项如图:
进入第一个目录如图:
第一项是一些通用的设置第二项是链接方式,编译选项,接下来是调试选项等等。
主目录下
Archival utilities:各种压缩,截压缩工具
Coreutils:核心的命令,比如ls,cp等
Console utiities:控制台相关的命令,比如清屏指令clear等
Debian utilities:debian命令
Editors:编辑命令,一般都选用vi
Finding utilities:查命令
Init utilities:init程序的配置选项
。。。到networking utilities:网络方面的命令,可以选择一些可以方便调试的命令,如telnetd,ping,tftp等
修改根目录下的makefile 指定交叉编译工具然后执行make编译
最后执行CONFIG_PREFIX=dir_path install 就可以将编译好的busybox安装在dir_name指定的目录下。
使用 Busybox 可以自动生成根文件系统所需的bin、sbin、usr 目录和 linuxrc 文件。
3.文件系统分类,2张图互相弥补如图:
Jffs2:主要用于norflash,基于MTD驱动层,可读写,支持数据压缩的日志型文件系统
Yaffs:专为nandflash设计的一种文件系统不支持数据压缩,速度更快,挂载时间更短
cramfs:一种只读的压缩文件系统,基于MTD程序,速度快,效率高
ramdisk:将一部分固定大小的内存当作分区来使用
nfs:网络共享文件技术,用于开发调试阶段,挂载到嵌入式设备,可非常方便的修改根文件系统的内容。
三.根文件系统的制作
1.根文件系统的制作
a.首先进入一个你想创建根文件系统rootfs的目录创建一shell脚本文件,取名只要自己便于识别即可这里取名为create_rootfs_bash,打开后输入以下内容
#!/bin/sh //脚本解析命令
echo "------Create rootfs --------"
mkdir rootfs //在当前目录创建rootfs目录
cd rootfs //进入rootfs目录
echo "--------Create ----------"
mkdir root dev etc boot tmp var sys proc lib mnt home usr//创建一系列必备子目录
mkdir etc/init.d etc/rc.d etc/sysconfig //同上
mkdir usr/sbin usr/bin usr/lib usr/modules//同上
echo "make node in dev/console dev/null"
mknod -m 600 dev/console c 5 1 //创建设备节点,若失败则启动时不到console
echo "------Create rootfs --------"
mkdir rootfs //在当前目录创建rootfs目录
cd rootfs //进入rootfs目录
echo "--------Create ----------"
mkdir root dev etc boot tmp var sys proc lib mnt home usr//创建一系列必备子目录
mkdir etc/init.d etc/rc.d etc/sysconfig //同上
mkdir usr/sbin usr/bin usr/lib usr/modules//同上
echo "make node in dev/console dev/null"
mknod -m 600 dev/console c 5 1 //创建设备节点,若失败则启动时不到console
mknod -m 600 dev/null c 1 3 //同上
mkdir mnt/etc mnt/jffs2 mnt/yaffs mnt/data mnt/temp
mkdir var/lib var/lock var/run var/tmp
chmod 1777 tmp //改变使用权使得只有用户有权删除他
chmod 1777 var/tmp
echo "-------make direction done---------"
mkdir mnt/etc mnt/jffs2 mnt/yaffs mnt/data mnt/temp
mkdir var/lib var/lock var/run var/tmp
chmod 1777 tmp //改变使用权使得只有用户有权删除他
chmod 1777 var/tmp
echo "-------make direction done---------"
b.因为这里使用动态链接库也可使用静态链接库(也可使用静态库,但静态库比较大,实际开发时往往使用动态库),这里直接拷贝友善之臂的动态库,root_qtopia下载后打开将lib下的所有文件复制到rootfs目录下的lib目录
在这里我的为 cp /home/root_qtopia/lib* /home/filesystem/rootfs/lib
c.配置busybox,进入busybox目录修改makefile文件指定交叉编译器和平台
CROSS_COMPILE ?=arm-linux- //大约在164行
ARCH ?=arm //大约在189行
接下来执行make menuconfig开始配置若你有友善的默认配置的话可以直接参考拷贝
配置过程如下(1)Busybox Settings--->
一项项配置如下打开第一项
Build Options--->
[*] Build BusyBox as a static binary(no shared libs)//指定使用静态链接库,可选可不选,这里使用动态链接库。
Busybox Library Tuning --->
(1024)Maximum length of input
[*] vi-style line editing commands
[*]Fancy shell prompts
(2)Linux System Utilities --->
[*]Support /f //自动产生驱动程序所需设备节点
[*]Support command execution at device addition/removal
(3) Linux Module Utilities---> [ ]simplified modutils
[*] insmod
[*] rmmod
[*] lsmod
[*] modprobe
d.执行编译 make CONFIG_PREFIX=/home/filesystem/rootfs install
/home/filesystem/rootfs为rootfs所在目录。
在rootfs目录下会生成目录bin、sbin、usr和文件linuxrc的内容。
e.修改etc配置文件进入创建的rootfs目录
(1)拷贝主机etc目录下的passwd、group、shadow文件到rootfs/etc目录下。
(2)在etc/下创建f文件(内容为空)
(3)etc/sysconfig目录下新建文件HOSTNAME,内容为” mini2440”。
(4)etc/inittab文件:仿照Busybox的examples/inittab文件,在etc/目录下创建一个inittab文件,写上以下内容:
#etc/inittab
::sysinit:/etc/init.d/rcS
::askfirst:-/bin/sh
::ctrlaltdel:/sbin/reboot
::shutdown:/bin/umount -a –r
(5)创建etc/init.d/rcS文件:
这是一个脚本文件,可以在里面添加自动执行的命令
#!/bin/sh
PATH=/sbin:/bin:/usr/sbin:/usr/bin
runlevel=S
prevlevel=N
umask 022
export PATH runlevel prevlevel
echo"--------- munt all--------"
mount –a
echo /sbin/mdev>/proc/sys/kernel/hotplug
mdev -s
echo "*************************"
echo "**********************mini2440ARM**************"
echo "Kernel version:linux-2.6.32"
echo "author:sun"
echo "Data:2010,05,08"
echo "***********************"
/bin/hostname -F /etc/sysconfig/HOSTNAME
export PATH runlevel prevlevel
echo"--------- munt all--------"
mount –a
echo /sbin/mdev>/proc/sys/kernel/hotplug
mdev -s
echo "*************************"
echo "**********************mini2440ARM**************"
echo "Kernel version:linux-2.6.32"
echo "author:sun"
echo "Data:2010,05,08"
echo "***********************"
/bin/hostname -F /etc/sysconfig/HOSTNAME
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论