具体步骤如下:
1.解压内核源码树
解压 linux-2.6.29-mini2440-20090708.tgz 到自己的工作目录,会生成一个友善之臂修改过的
并且有几个 mini2440 默认配置文件的内核源码目录 linux-2.6.29。具体步骤参照友善之臂
mini2440 开发板用户手册,具体不详述了。
2.修改内核配置选项
进入内核源码目录 linux-2.6.29 目录
#cp config_mini2440_t35 .config
#make menuconfig ARCH=arm
打开配置菜单,修改两个配置项,分别是:
a):General setup-->选择 Initial RAM filesystem and RAM disk...... 项
b):Device Drivers-->Block devices-->选择 RAM block device support 项
并检查 Optimize for size 是否被选中,如果没有则选中,此项优化内核大小,根据需要进行
配置。
修改(8192)Default RAM disk size kbytes 选项为(4096)Default RAM disk size kbytes,之所
以修改是因为我之后制作的 ramdisk 是 4096KB 大小的。当然如果你想制作 8192KB 大小的
ramdisk,这里就要对应为 8192 了,以此类推。但是最小系统嘛,是不用那么大的 ramdisk
的。此项的默认配置就是(4096),以前我改过这个配置,所以是(8192)了。如果这个大
小和你做的 ramdisk 不匹配,则启动时仍然会出现 kernel panic 内核恐慌,提示 ramdisk 格式
不正确,挂载不上 ramdisk。
然后特别要注意的一点是,ramdisk 是一种内存虚拟磁盘技术,实质上并不是一种文件系统,
它使用的文件系统时 ext2 文件系统。所以一定要在 make menuconfig ARCH=arm 的时候进入
File systems 菜单,选上<*> Second extended fs support。以提供内核对 ext2 文件系统的支持。
我以前添加过了 ext2 文件系统了,所以开始的时候在此没有说明,在此为了说明为什么有
的人照着我的方法做了,但是仍然 kernel panic,特别把这一步也加上。
然后保存配置退出。
这样就为内核添加好了 ramdisk 启动功能和 ramdisk 的驱动支持了。
3.修改内核启动参数
方法有二:
a):修改.config 的第 310 行,修改 CONFIG_CMDLINE=""的定义
修 改 为 CONFIG_CMDLINE="initrd=0x31000000,0x200000 root=/dev/ram rw init=/linuxrc
console=ttySAC0 mem=64"
保存。
意思为从 ramdisk 启动,ramdisk 压缩文件起始地址在内存地址 0x31000000 处,文件大小为
0x200000。
此参数也可以在 make menuconfig ARCH=arm 时进入 Boot options 菜单,然后在 Default kernel
command string 里修改。效果是一样的。
b):或者不修改.config 的的第 310 行 CMDLINE 定义,而是用 u-boot 的 bootargs 环境变量来传
递启动参数。
同 样 也 是 修 改 该 环 境 变 量 为 bootargs=initrd=0x31000000,0x200000 root=/dev/ram rw
init=/linuxrc console=ttySAC0 mem=64
并 saveenv 保存 u-boot 环境变量
以上 a),b)的效果是一样的。
4.编译内核
#make zImage ARCH=arm CROSS_COMPILE=arm-linux-
然后是二十分钟左右的等待。
编译完成后在当前目录下就出现了 zImage 内核映像了。
好像友善之臂把内核源码目录里的 uImage 目标给注释了,以前在论坛里看到过有人说,直
接 make uImage 好像提示没有 uImage 的目标。所以我就先制作 zImage,然后再用 u-boot 的
mkimage 工具转化为 uImage。其实 uImage 就是在 zImage 的开头部分增加了一个 64 字节的
内核映像说明。
5.制作 uImage 内核映像
由于我使用的 Bootloader 是 u-boot,所以要将 zImage 转化为 uImage,方法如下:
#mkimage -A arm -O linux -T kernel -C none -a 0x30008000 -e 0x30008000 -n "Linux kernel
Image" -d zImage uImage-ramdisk
说明:mkimage 工具是 u-boot 格式 uImage 内核映像制作工具。如果成功编译 u-boot 之后,
它会在 u-boot 源码树下的 tools 目录之下。建议将其拷贝到宿主机的/sbin/目录下,以方便
使用。mkimage 使用时的具体参数不再详述,不清楚的请自己查阅。
6.制作 ramdisk 根文件系统
该过程是制作 ramdisk 根文件系统的核心步骤,方法如下:
a)创建根文件系统目录:
#cd 转入到你的工作目录。
#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
b)创建最基本的设备文件:
#cd dev
#mknod -m 666 console c 5 1
#mknod -m 666 null c 1 3
#cd ..
c)安装/etc 配置文件:
这里可以直接把友善之臂的 root_qtopia 里的几个基本的配置文件拷贝过来,只拷贝必要的
即可,并对其内容进行删减,因为我做的 ramdisk 并不包含 Qtopia 等,全拷贝过来也没有用。
我是从网上找的最小系统的 etc 配置文件直接解压到我制作的根文件系统里了,并做参照友
善之臂的 root_qtopia 添加了一些内容,见最后的说明。
操作如下:
#tar etc.tar.gz -C /xxx/rootfs
xxx 表示你要制作的 rootfs 所在的目录。
d)编译内核模块:
方法是如下:
进入 Linux 内核源码目录(linux-2.6.29)
#make modules ARCH=arm CROSS_COMPILE=arm-linux-
e)安装内核模块:
#make modules_install ARCH=arm INSTALL_MOD_PATH=/xxx/rootfs
xxx 表示你要制作的 rootfs 所在的目录。
f)配置 busybox
进入 busybox 目录执行#make menuconfig
进入 Busybox Settings -> build Options ->选中"Build busybox as a static binary“,即静态链
接,免去拷贝大量的库文件。
Installation Options -> 选中"Don't use /usr",以免 busybox 不慎被安装到宿主机系统的相
应目录下,破坏宿主机系统。
Busybox Installation Prefix (/xxx/rootfs),修改该选项表明编译后的 busybox 将安装到该
位置。
g)编译、安装 busybox
#make ARCH=arm CROSS_COMPILE=arm-linux-
几分钟编译完成后
#make install
安装到 Busybox Installation Prefix (/xxx/rootfs)设定的目录里。当前为我要制作的根文件系
统目录(/xxx/rootfs)。
h)制作 ramdisk 根文件系统镜像
方法如下:
上 http://genext2fs.sourceforge.net/ 下 载 可 以 简 单 方 便 的 制 作 ramdisk 文 件 系 统 的 工 具
genext2fs,这样就不用像网上大多数说的那样繁琐的制作 ramdisk 映像了,当前最新版本为
genext2fs-1.4.1.tar.gz 。
编译生成该工具 genext2fs,并将其放入宿主机的/sbin/目录下以方便使用。
跳转到要制作的 rootfs 的上一级目录
#genext2fs -b 4096 -d rootfs ramdisk
-b 是指制作的 ramdisk 大小为 4096K 字节
-d 是指要制作成 ramdisk 的根文件系统目录
最后的 ramdisk 是制作出来的 ramdisk 的名字,当然可以改名了。
#gzip -9 -f ramdisk
将该 ramdisk 以最优方式压缩为 ramdisk.gz
7.下载内核映像和 ramdisk 映像
启动 u-boot,暂停 u-boot 自动启动,在 u-boot 命令行中键入如下命令下载内核和 ramdisk
映像:
[u-boot@MINI2440]# tftp 0x32000000 uImage-ramdisk
dm9000 i/o: 0x20000300, id: 0x90000a46
DM9000: running in 16 bit mode
MAC: 08:08:11:18:12:27
operating at 100M full duplex mode
Using dm9000 device
TFTP from server 192.168.31.117; our IP address is 192.168.31.230
Filename 'uImage-ramdisk'.
Load address: 0x32000000
Loading: T T #################################################################
#################################################################
#
done
Bytes transferred = 1917752 (1d4338 hex)
[u-boot@MINI2440]# tftp 0x31000000 ramdisk.gz
dm9000 i/o: 0x20000300, id: 0x90000a46
DM9000: running in 16 bit mode
MAC: 08:08:11:18:12:27
operating at 100M full duplex mode
Using dm9000 device
TFTP from server 192.168.31.117; our IP address is 192.168.31.230
Filename 'ramdisk.gz'.
Load address: 0x31000000
Loading: T T #################################################################
####
done
Bytes transferred = 1002594 (f4c62 hex)
8)使用 ramdisk 根文件系统启动内核
在 u-boot 命令行下键入如下命令启动系统:
bootm 0x32000000
## Booting kernel from Legacy Image at 32000000 ...
2010-04-09 15:13:52 UTC
Linux-2.6.29.4-FriendlyARM
Image Name:
Created:
Image Type: ARM Linux Kernel Image (uncompressed)
Data Size: 1917688 Bytes = 1.8 MB
Load Address: 30008000
Entry Point: 30008000
Verifying Checksum ... OK
Loading Kernel Image ... OK
OK
Starting kernel ...
Uncompressing Linux.............................................................
................................................................ done, booting t
he kernel.
Linux version 2.6.29.4-FriendlyARM (root@localhost.localdomain) (gcc version 4.3
.2 (Sourcery G++ Lite 2008q3-72) ) #3 Fri Apr 9 23:13:36 CST 2010
CPU: ARM920T [41129200] revision 0 (ARMv4T), cr=c0007177
CPU: VIVT data cache, VIVT instruction cache
Machine: FriendlyARM Mini2440 development board
Memory policy: ECC disabled, Data cache writeback
……中间过长的内容在此省略了……
RAMDISK: Compressed image found at block 0
VFS: Mounted root (ext2 filesystem) on device 1:0.
Freeing init memory: 136K
eth0: link down
Processing /etc/profile... Done
# eth0: link up, 100Mbps, full-duplex, lpa 0x45E1
至此系统启动成功。
----------------------------------------------------------------------------------
后记:由于友善之臂 mini2440 默认的配置文件是将驱动等直接编译到内核里去了,并没有
使用内核模块。所以上述第 6 步制作根文件系统中的 d)编译和 e)安装内核模块的步骤可
以 不 做 。 我 就 没 有 编 译 内 核 模 块 。 因 为 参 照 友 善 之 臂 的 root_qtopia 根 文 件 系 统 发 现
/lib/modules/`uname -r`里根本没有东西。而且以前用友善之臂的 config_mini2440_t35 默认配
置编译内核模块的时候。发现友善只做了个 hello_modules 的内核模块示例。在此我们不需
要使用这个 hello_modules,所以这两步就略过去了。
说明:由于最小系统里的 etc 配置文件没有写自动启动网卡的脚本,所以我做的 ramdisk 开
始时并不能自动启动网卡。后来参照友善之臂的 root_qtopia 根文件系统里的脚本做如下修
改,即可自动启动脚本。
修改如下:
修改要制作的 ramdisk 根文件系统的 rootfs 下的/etc/init.d/rcS 文件
在最下边添加如下两行命令即可自动启动网卡:
/sbin/ifconfig lo 127.0.0.1
/sbin/ifconfig eth0 192.168.31.230 netmask 255.255.255.0 up
这个方法是通过分析友善之臂的 root_qtopia 根文件系统的启动流程时发现的。
通过分析友善之臂的 root_qtopia 根文件系统,我们还能发现更多的内容。在此不在详述。
锻炼一下自己分析解决问题的能力吧。呵呵。