1.
ARM 嵌入式系统Linux的根文件系的组成:目录、Shell、库、脚本。
(1)目录
根文件系统要包含的目录:/dev /lib /etc、/proc
/dev:设备文件系统的挂接点
/lib:用于存放动态链接库
/etc:用来存放初始化脚本和其他配置文件的
/proc:用来挂载存放系统信息虚拟文件系统
(2)Shell
Shell 就是 Busybox,从网上下载来 busybox-1.9.1.tar.gz
解压缩以后找到 Makefile 里面的 ARCH 和 CROSS_COMPILE,改成:
ARCH ?= arm
CROSS_COMPILE ?= /usr/local/arm/3.3.2/bin/arm-linux-
本文关键词:嵌入式系统嵌入式开发 ARM学习 ARM嵌入式 Linux
当然 CROSS_COMPILE 由你自己的编译器位置决定,然后:
# make menuconfig
# make
# make install
默认是安装在 Busybox 下的 _install 目录里,然后我们就可以在 Busybox
生成的 Shell 基础上建根文件系统了, 以命令示之,如下:
# mkdir /home/jianbw/rootfs
# cd /home/jianbw/busybox/_install
# cp -r ./ /home/jianbw/rootfs
# cd /home/jianbw/rootfs
# mkdir dev
# mkdir etc
# mkdir lib
# mkdir proc
# mkdir sys
# mkdir tmp
以 root 身份执行(可通过 su 切换):
# cd dev
# mknod -m 660 console c 5 1
# mknod -m 660 null c 1 3
(3)库
可拷贝开发板自带的文件系统的库,如果开发板的文件系统是映像,只需把映像挂载
在某个目录下访问即可。假设映像为 demo.cramfs,以命令示之,如下:
# mkdir /home/jianbw/demo
# mount -o loop demo.cramfs /home/jianbw/demo
# cd /home/jianbw/demo/lib
# cp -r ./ /home/jianbw/rootfs/lib
(4)脚本
要使 Shell 正常工作, 还要设置初始化脚本。
首先是 /etc/inittab:
# Startup the system
null::sysinit:/bin/mount -o remount,rw /
null::sysinit:/bin/mount -t proc proc /proc
null::sysinit:/bin/mount -a
null::sysinit:/bin/hostname -F /etc/hostname# Now run any rc scripts
::sysinit:/etc/init.d/rcS # Now invoke shell
::askfirst:/bin/ash # Logging junk
null::sysinit:/bin/touch /var/log/messages
null::respawn:/sbin/syslogd -n -m 0
null::respawn:/sbin/klogd -n # Stuff to do for the 3-finger salute
::ctrlaltdel:/sbin/reboot # Stuff to do before rebooting
null::shutdown:/usr/bin/killall klogd
null::shutdown:/usr/bin/killall syslogd
null::shutdown:/bin/umount -a -r
null::shutdown:/sbin/swapoff -a
其次设置文件系统的挂载表 /etc/fstab:
#
/dev/root / ext2 rw,noauto 0 1
proc /proc proc defaults 0 0
devpts /dev/pts devpts defaults,gid=5,mode=620 0 0
tmpfs /tmp tmpfs defaults 0 0
sysfs /sys sysfs defaults 0 0
再设置 /etc/init.d/rcS:
# Start udev
/bin/mount -t tmpfs tmpfs /dev
/sbin/udevd --daemon
/sbin/udevstart # Configure net interface
/sbin/ifconfig lo 127.0.0.1 up
/sbin/route add -net 127.0.0.0 netmask 255.0.0.0 lo
/sbin/ifconfig eth0 192.168.2.25 netmask 255.255.255.0
/sbin/route add default gw 192.168.2.1
(5)生成根文件系统映像
# mkcramfs rootfs rootfs.cramfs
龙人计算机嵌入式研发中心是国内最早进入嵌入式技术研发和应用推广的技术型企业之一,成立以来在专注于嵌入式底层应用技术的研究和开发的同时为广大客户提供嵌入式系统开发技术、嵌入式解决方案和嵌入式产品(嵌入式开发板、ARM开发板、ARM9开发板、ARM开发工具、ARM仿真器和ARM工控板、ARM实验仪等)。
2.
一、内核启动完之后,首先运行/linuxrc。
/linuxrc内容:
#!/bin/sh
echo "mount /etc as ramfs"
/bin/mount -n -t ramfs ramfs /etc
/bin/cp -a /mnt/yaffs/etc/* /etc //关机的时候我们会保存/etc的内容到/mnt/yaffs/etc.
echo "re-create the /etc/mtab entries"
# re-create the /etc/mtab entries
/bin/mount -f -t cramfs -o remount,ro /dev/mtdblock/2 /
/bin/mount -f -t ramfs ramfs /etc
exec /sbin/init
首先你要看懂这个linuxrc,
1. /bin/mount -n -t ramfs ramfs /etc
这句话的作用加载一个ramfs作为/etc目录。这样/etc就是一个可写目录。
看这个脚本,得出你的根文件系统是一个cramfs,是一个只读文件系统中,而/etc作为系统运行配置文件的存放地点,可能会写一些运行状
态在这里, linuxrc第一件事情就是将一个ramfs mount 到/etc只读目录中,使得/etc/目录可写,指定参数
-n的目的是告诉mount不要写/etc/mtab, 这个文件存放当前系统mount了的所有文件系统中。
因为现在/etc/目录还是只读,所以这次mount不要写这个文件,否则会失败。
而你问到的 ramfs在哪里,这个在你的 /etc/fstab文件中应该有ramfs一项, mount 会去找这项,如果没有,mount会失败。后面就执行不下去。
2. /bin/cp -a /mnt/yaffs/etc/* /etc
/etc成为可写目录后,将所有/mnt/yaffs/etc中的配置文件拷贝到/etc/中,这说明你的ramfs可能是一个空的ramfs,没有配置文件,或者配置文件比较老。同时也说明你这个系统是一个只读系统,每次系统运行中写入的配置不会保留。
将以前mount的那些信息重新写到/etc/mtab中,命令就是下面这些。
3. /bin/mount -f -t cramfs -o remount,ro /dev/mtdblock/2 /
/bin/mount -f -t ramfs ramfs /etc
这些命令只是将这些mount信息写到/etc/mtab中,不会实际去mount这些block device,说明你的根文件系统依然是以前的那个/dev/bon/2
4. exec /sbin/init
执行根文件系统中的init执行程序,使其成为1号进程。shell正式运行。
###################################################################################
/etc/mtab介绍:
mtab同/etc/fstab的格式一样,它用于记录已经挂载的分区信息。
注意:
如果没有/linuxrc这个文件,系统默认首先运行/sbin/init。