linux仿真运行环境 (NFS启动)(2)

6.裁剪/定制内核
(1)#make menuconfig
(2)设置内核启动参数
     Boot options ---> Default kernel command string:
     mem=32M console=ttySAC0 root=/dev/ram initrd=0xc0800000,0x00800000 ramdisk_size=8192 rw
(3)设置 CS8900 的支持
     Device Drivers --->
     Network device support --->
     Ethernet (10 or 100Mbit) ---> []   CS8900 support
     选中 [*]   CS8900 support
(4)设置 initrd 的支持
     Device Drivers ---> Block devices ---> [ ] RAM disk support
     下面三项必须设置:
     1.确保 RAM disk support 被选中
     2.相应的将默认的 (4096) Default RAM disk size (kbytes) 改成 8192;
     3.Initial RAM disk (initrd) support 一定要选中, 切记!
(5)设置 NFS 的支持
     File systems ---> Network File Systems --->
     至少确保下面两项被选中:
     [*] NFS file system support
     [*]   Provide NFSv3 client support
(6)设置 ROM file system 的支持
     File systems ---> [*] ROM file system support
     确保 [*] ROM file system support 被选中
(7)设置 ext2 的支持
     File systems ---> [*] Second extended fs support
     确保 [*] Second extended fs support 被选中

7.编译
#make
编译完成后会有个 vmlinux 在当前目录下, 这就是我们要的 arm-linux 内核了

四 制作根文件系统 initrd.img(Initial RAM disk)
我们选定 busybox-1.9.2.tar.bz2 这个版本, 以静态方式编译, 即生成的 busybox 不需要共享库的支持就能运行。这样做我们就不需要布署程序库了。缺点是自己写的 arm-linux 程序在这个根文件系统中是不能运行的,因为缺少共享程序库的支持。不过别担心,我们会解决这个问题的,稍后你将看到,通过在 arm-linux 里以挂接 NFS 的方式, 将宿主机的 arm-linux-gcc 编译器的库文件挂到 arm-linux 的 /lib 下, 就可完美的运行我们自己的程序了。好,一步步来,先来看看根文件系统的制作:

1.解压源码包
#tar xjf busybox-1.9.2.tar.bz2
#cd busybox-1.9.2
2.修改 Makefile, 将
ARCH          ?= $(SUBARCH)                                                                                                                              
CROSS_COMPILE ?=
改为
ARCH          ?= arm                                                                                                                                     
CROSS_COMPILE ?= /usr/local/arm/3.3.2/bin/arm-linux-

注:这个版本的 busybox 用 3.4.1 的 arm-linux-gcc 编译有些问题, 用 3.3.2 版则可顺利编译。
3.定制 busybox
#make menuconfig

设置静态编译方式
Busybox Settings ---> Build Options ---> [*] Build BusyBox as a static binary (no shared libs)
确保 [*] Build BusyBox as a static binary (no shared libs) 被选中
4.执行 make 编译
#make

编译出错, 信息如下:
applets/applets.c:15:2: warning: #warning Static linking against glibc produces buggy executables
applets/applets.c:16:2: warning: #warning (glibc does not cope well with ld --gc-sections).
applets/applets.c:17:2: warning: #warning See sources.RedHat.com/bugzilla/show_bug.cgi?id=3400
applets/applets.c:18:2: warning: #warning Note that glibc is unsuitable for static linking anyway.
applets/applets.c:19:2: warning: #warning If you still want to do it, remove -Wl,--gc-sections
applets/applets.c:20:2: warning: #warning from scripts/trylink and remove this warning.
applets/applets.c:21:2: error: #error Aborting compilation.
make[1]: *** [applets/applets.o] Error 1

按照提示,修改 scripts/trylink, 将此文件里面有 -Wl,--gc-sections 的行都删除掉,
然后重新 make
#make

还是出错, 信息如下:
root@hukq-desktop:~/busybox/busybox-1.9.2# make
CC      applets/applets.o
applets/applets.c:15:2: warning: #warning Static linking against glibc produces buggy executables
applets/applets.c:16:2: warning: #warning (glibc does not cope well with ld --gc-sections).
applets/applets.c:17:2: warning: #warning See sources.redhat.com/bugzilla/show_bug.cgi?id=3400
applets/applets.c:18:2: warning: #warning Note that glibc is unsuitable for static linking anyway.
applets/applets.c:19:2: warning: #warning If you still want to do it, remove -Wl,--gc-sections
applets/applets.c:20:2: warning: #warning from scripts/trylink and remove this warning.
applets/applets.c:21:2: error: #error Aborting compilation.
make[1]: *** [applets/applets.o] Error 1
make: *** [applets] Error 2

修改文件 applets/applets.c 第 21 行, 将
#error Aborting compilation.
注释掉:

执行 make 重新编译
#make

编译通过, busybox 被生成了, 然后执行
#make install

busybox 就被安装到默认的临时目录 _install 下了
5.制作 initrd.img
有了 busybox 后制作 initrd.img 就容易多了,只是说起来比较烦琐。以命令演示如下:

创建映像文件并挂到 initrd 目录
#mkdir initrd
#dd if=/dev/zero of=initrd.img bs=1k count=4096
#mke2fs -F -v initrd.img
#mount -o loop initrd.img initrd

将添加 busybox 到此映像文件
#cd initrd
#cp -r ../_install/* .

#创建必要的目录
#mkdir proc lib etc dev root home var tmp
#chmod 777 tmp

建立设备文件
#cd dev
#mknod -m 644 console c 5 1
#mknod -m 644 null c 1 3
#mknod -m 640 ram b 1 1
#mknod -m 644 mem c 1 1
#cd ..

创建脚本文件 etc/inittab, 内容如下:
::sysinit:/etc/init.d/rcS
::askfirst:-/bin/sh
::restart:/sbin/init
::ctrlaltdel:/sbin/reboot
::shutdown:/bin/umount -a -r
::shutdown:/sbin/swapoff -a

设置此脚本执行权限
#chmod 644 etc/inittab

创建脚本文件 etc/init.d/rcS, 内容如下:
#!/bin/sh
/bin/mount -t proc none /proc
/sbin/ifconfig lo 127.0.0.1 up
/sbin/ifconfig eth0 10.0.0.2 netmask 255.0.0.0 up
hostname skyeye
mkdir /var/tmp
mkdir /var/log
mkdir /var/run
mkdir /var/lock
/bin/ash

设置此脚本执行权限
#chmod 755 etc/init.d/rcS

最后一步,执行实际的写入操作,生成 initrd.img
cd ..
umount initrd

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wzywyz.html