手机站
网通分站
电信主站
密 码:
用户名:
当前位置 : 主页>网站运营>建站经验>列表

我也来学做嵌入式Linux系统V0.1(完整版)

来源:互联网 作者:west263.com 时间:2008-04-16
西部数码-全国虚拟主机10强!40余项虚拟主机管理功能,全国领先!双线多线虚拟主机南北访问畅通无阻!免费赠送企业邮局,.CN域名,自助建站480元起,免费试用7天,满意再付款! P4主机租用799元/月.月付免压金!

# mkdir bin dev etc lib proc sbin tmp usr var root home
# chmod 1777 tmp
# mkdir usr/bin usr/lib usr/sbin
# ls
dev etc lib proc sbin tmp usr var
# mkdir var/lib var/lock var/log var/run var/tmp
# chmod 1777 var/tmp

对于单用户系统来说,root和home并不是必须的。
准备好根文档系统的骨架后,把前面建立的文档安装到对应的目录中去。
2、拷贝链接库
把uclibc的库文档拷贝到刚才建立的lib文档夹中:
# cd ${PREFIX}/lib
[root@skynet lib]# cp *-*.so ${PRJROOT}/rootfs/lib
[root@skynet lib]# cp -d *.so.[*0-9] ${PRJROOT}/rootfs/lib

3、 拷贝内核映像和内核模块
因为没有模块,所以拷贝模块就省了,
新建boot目录,把刚才建立好的内核拷贝过来
# cd /home/kendo/control-project/daq-module/rootfs/
# mkdir boot
# cd ${PRJROOT}/images
# cp bzImages-2.4.18-rmk5 /home/kendo/control-project/daq-module/rootfs/boot

4、 建立/dev下边的设备文档
在linux中,任何的的设备文档都存放在/dev中,使用mknod命令创建基本的设备文档。
mknod命令需要root权限,但是偶本身就是用的root用户,本来是新建了一个用户专门用于嵌入式制作的,但是后来忘记用了……
# mknod -m 600 mem c 1 1
# mknod -m 666 null c 1 3
# mknod -m 666 zero c 1 5
# mknod -m 644 random c 1 8
# mknod -m 600 tty0 c 4 0
# mknod -m 600 tty1 c 4 1
# mknod -m 600 ttyS0 c 4 64
# mknod -m 666 tty c 5 0
# mknod -m 600 console c 5 1
基本的设备文档建立好后,再创建必要的符号链接:
# ln -s /proc/self/fd fd
# ln -s fd/0 stdin
# ln -s fd/1 stdout
# ln -s fd/2 stderr
# ls
console fd mem null random stderr stdin stdout tty tty0 tty1 ttyS0 zero

设备文档也能够不用手动创建,听说RedHat /dev下的脚本MAKEDEV 能够实现这一功能,但是没有试过……

基本上差不多了,但是打算用硬盘/CF卡来做存储设备,还需要为他们建立相关文档,因为我的CF在目标机器上是CF-to-IDE,能够把他们等同来对待,先看看Redhat 下边had的相关属性:
# ls -l /dev/hda
brw-rw---- 1 root disk 3, 0 Jan 30 2003 /dev/hda
# ls -l /dev/hda1
brw-rw---- 1 root disk 3, 1 Jan 30 2003 /dev/hda1
对比一下,能够看出,had类型是b,即块设备,主编号为3,次编号从0递增,根限位是
rw-rw----,即660,所以:
# mknod -m 660 hda b 3 0
# mknod -m 660 hda1 b 3 1
# mknod -m 660 hda2 b 3 2
# mknod -m 660 hda3 b 3 3


5、添加基本的应用程式
未来系统的应用程式,基本上能够分为三类:
 基本系统工具,如ls、ifconfig这些……
 一些服务程式,管理工具,如WEB、Telnet……
 自己研发的应用程式

这里先添加基本的系统工具,有想过把这些工具的代码下载下来交叉编译,但是实在是麻烦,用BusyBox,又精简又好用……
将busybox-1.00.tar.gz下载至sysapps目录下,解压:
#tar zxvf busybox-1.00.tar.gz
#cd busybox-1.00
//进入配置菜单
#make TARGET_ARCH=i386 CROSS=i386-linux- PREFIX=${PRJROOT}/rootfs menuconfig
//建立依存关系
#make TARGET_ARCH=i386 CROSS= i386-linux- PREFIX=${PRJROOT}/rootfs dep
//编译
#make TARGET_ARCH=i386 CROSS= i386-linux- PREFIX=${PRJROOT}/rootfs
//安装
#make TARGET_ARCH=i386 CROSS= i386-linux- PREFIX=${PRJROOT}/rootfs install

# cd ${PRJROOT}/rootfs/bin
# ls
addgroup busybox chown delgroup echo kill ls mv ping rm sleep
adduser chgrp cp deluser grep ln mkdir netstat ps rmdir umount
ash chmod date dmesg hostname login mount pidof pwd sh vi
一下子多了这么多命令……
配置busybox的说明:
A、假如编译时选择了:
Runtime SUID/SGID configuration via /etc/busybox.conf
系统每次运行命令时,都会出现“Using fallback suid method ”
能够将他去掉,但是我还是在/etc为其建了一个文档busybox.conf搞定;
B、[*] Do you want to build BusyBox with a Cross Compiler? (i386-linux-gcc) Cross Compiler prefix
这个指明交叉编译器名称(其实在编译时的命令行已指定过了……)
C、安装选项下的(${PRJROOT}/rootfs) BusyBox installation prefix,这个指明了编译好后的工具的安装目录。
D、静态编译好还是动态编译好?即是否选择
[ ] Build BusyBox as a static binary (no shared libs)
动态编译的最大好处是节省了宝贵空间,一般来说都是用动态编译,但是我以前动态编译出过问题(其实是库的问题,不关busybox的事),出于惯性,我选择了静态编译,为此多付出了107KB的空间。
E、其他命令,根据需要,自行权衡。


6、系统初始化文档
内核启动时,最后一个初始化动作就是启动init程式,当然,大多数发行套件的Linux都使用了和System V init相仿的init,能够在网上下载System V init套件,下载下来交叉编译。另外,我也找到一篇写得很不错的讲解如何编写初始化文档的文档,bsd-init,回头附在后面。但是,对于嵌入式系统来讲,BusyBox init可能更为合适,在第6步中选择命令的时候,应该把init编译进去。

文章整理:西部数码--专业提供域名注册虚拟主机服务
http://www.west263.com
以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!