执行力心得体会怎么写:从makefile到内核&文件系统

来源:百度文库 编辑:中财网 时间:2024/05/04 04:59:32

从makefile到内核&文件系统

分类: LINUX 内核 2009-09-20 17:25 401人阅读 评论(0) 收藏 举报

内核源代码树在/usr/local/icom_new目录下
从顶层makefile分析开始(/usr/local/icom_new/Makefile)
17ifeq (.config,$(wildcard .config))
18include .config
19# all: ucfront subdirs romfs modules modules_install image
20all: ucfront cksum subdirs romfs image
21else
22all: config_error
23endif
在第20行的all是make首次要更新的目标,此目标依赖于ucfront cksum subdirs romfs image这5个目标.


1.ucfront目标


87.PHONY: ucfront
88ucfront: tools/ucfront/*.c
89    $(MAKE) -C tools/ucfront
90    ln -sf $(ROOTDIR)/tools/ucfront/ucfront tools/ucfront-gcc
91    ln -sf $(ROOTDIR)/tools/ucfront/ucfront tools/ucfront-g++
92    ln -sf $(ROOTDIR)/tools/ucfront/ucfront-ld tools/ucfront-ld
展开为:
make -C tools/ucfront
make[1]: Entering directory `/usr/local/icom_new/tools/ucfront'
make[1]: “ucfront”是最新的。
make[1]: Leaving directory `/usr/local/icom_new/tools/ucfront'
上述代码生成了目标ucfront
ucfront的作用:
根据用户选择的c库,来配置编译器的动态链接库的路径。

2.cksum目标


94.PHONY: cksum
95cksum: tools/sg-cksum/*.c
96    $(MAKE) -C tools/sg-cksum
97    ln -sf $(ROOTDIR)/tools/sg-cksum/cksum tools/cksum
展开为:
make -C tools/sg-cksum
make[1]: Entering directory `/usr/local/icom_new/tools/sg-cksum'
make[1]: “cksum”是最新的。
make[1]: Leaving directory `/usr/local/icom_new/tools/sg-cksum'
ln -sf /usr/local/icom_new/tools/sg-cksum/cksum tools/cksum
上述代码生成了目标cksum


3.subdirs目标


327.PHONY: subdirs
328subdirs: linux modules
329    echo "Build start unix"
330    echo $(BUILD_START_UNIX)
331    for dir in $(DIRS) ; do [ ! -d $$dir ] || $(MAKEARCH_KERNEL) -C $$dir || exit 1 ; done
可见subdirs目标依赖于linux和modules,更新完linux和modules,才会执行如下语句:
    echo "Build start unix"
    echo $(BUILD_START_UNIX)
    for dir in $(DIRS) ; do [ ! -d $$dir ] || $(MAKEARCH_KERNEL) -C $$dir || exit 1 ; done

3.1.linux目标

.PHONY: linux
linux linux%_only:
    @if [ $(LINUXDIR) != linux-2.5.x /
        -a $(LINUXDIR) != linux-2.6.x /
        -a $(LINUXDIR) != linux-2.6.16.RT.x /
        -a ! -f $(LINUXDIR)/.depend ] ; then /
        echo "ERROR: you need to do a 'make dep' first" ; /
        exit 1 ; /
    fi
    $(MAKEARCH_KERNEL) -j$(HOST_NCPU) -C $(LINUXDIR) $(LINUXTARGET) || exit 1
    if [ -f $(LINUXDIR)/vmlinux ]; then /
        ln -f $(LINUXDIR)/vmlinux $(LINUXDIR)/linux ; /
    fi
    @echo "Strip Linux kernel image from ELF to binary..."
    rm -f linux.bin
    $(CROSS_COMPILE)objcopy -I elf32-littlearm -O binary $(LINUXDIR)/linux $(LINUXDIR)/linux.bin
    @if [ ! -d images ] ; then /
        mkdir images; /
    fi
    cp -f $(LINUXDIR)/linux.bin images/.
展开为:
make ARCH=arm CROSS_COMPILE=arm-linux-  ARCH=arm CROSS_COMPILE=arm-linux- -j4 -C linux-2.6.16.RT.x zImage || exit 1
make[1]: Entering directory `/usr/local/icom_new/linux-2.6.16.RT.x'
  CHK     include/linux/version.h
  HOSTCC  scripts/basic/fixdep
  HOSTCC  scripts/basic/split-include
  HOSTCC  scripts/basic/docproc
  HOSTCC  scripts/kconfig/conf.o
  HOSTCC  scripts/kconfig/kxgettext.o
  HOSTCC  scripts/kconfig/mconf.o
  HOSTCC  scripts/kconfig/zconf.tab.o
  HOSTLD  scripts/kconfig/conf
scripts/kconfig/conf -s arch/arm/Kconfig
#
# using defaults found in .config
#
  SPLIT   include/linux/autoconf.h -> include/config/*
  SYMLINK include/asm-arm/arch -> include/asm-arm/arch-ixp4xx
  HOSTCC  scripts/kallsyms
  CC      scripts/mod/empty.o
  HOSTCC  scripts/mod/mk_elfconfig
  MKELF   scripts/mod/elfconfig.h
  HOSTCC  scripts/mod/file2alias.o
  ...
    部分省略,基本都是AS、CC、LD的信息,后面我们在分析
  ...
  LD      net/ipv4/netfilter/ip_conntrack.o
  LD      net/ipv4/netfilter/ip_nat.o
  LD      net/ipv4/netfilter/ip_conntrack_pptp.o
  LD      net/ipv4/netfilter/built-in.o
  LD      net/ipv4/built-in.o
  LD      net/built-in.o
  GEN     .version
  CHK     include/linux/compile.h
  UPD     include/linux/compile.h
  CC      init/version.o
  LD      init/built-in.o
  LD      .tmp_vmlinux1
  KSYM    .tmp_kallsyms1.S
  AS      .tmp_kallsyms1.o
  LD      .tmp_vmlinux2
  KSYM    .tmp_kallsyms2.S
  AS      .tmp_kallsyms2.o
  LD      vmlinux
  SYSMAP  System.map
  SYSMAP  .tmp_System.map
  OBJCOPY arch/arm/boot/Image
  Kernel: arch/arm/boot/Image is ready
  AS      arch/arm/boot/compressed/head.o
  GZIP    arch/arm/boot/compressed/piggy.gz
  CC      arch/arm/boot/compressed/misc.o
  AS      arch/arm/boot/compressed/head-xscale.o
  AS      arch/arm/boot/compressed/big-endian.o
  AS      arch/arm/boot/compressed/piggy.o
  LD      arch/arm/boot/compressed/vmlinux
  OBJCOPY arch/arm/boot/zImage                            
  Kernel: arch/arm/boot/zImage is ready
make[1]: Leaving directory `/usr/local/icom_new/linux-2.6.16.RT.x'
if [ -f linux-2.6.16.RT.x/vmlinux ]; then /
        ln -f linux-2.6.16.RT.x/vmlinux linux-2.6.16.RT.x/linux ; /
    fi
Strip Linux kernel image from ELF to binary...
rm -f linux.bin
arm-linux-objcopy -I elf32-littlearm -O binary linux-2.6.16.RT.x/linux linux-2.6.16.RT.x/linux.bin
cp -f linux-2.6.16.RT.x/linux.bin images/.
到此为止,内核镜像已经生成了,在/usr/local/icom_new/linux-2.6.16.RT.x/arch/arm/boot/下面,而在/usr/local/icom_new/vendors/AdvantechPlatform/EKI-1126L下的makefile中有如下语句:
cp $(ROOTDIR)/$(LINUXDIR)/arch/arm/boot/zImage $(KERNELZ)
    if [ -d /tftpboot ]; then /
        cp $(KERNELZ) /tftpboot/$(USER)-$(MODELNAME).zImage 2> /dev/null; /
上述语句仅仅把内核镜像改名,并存放到/tftpboot目录下。
所以,截止到这一步,内核的最终镜像已经生成了。

3.2.module目标

203.PHONY: modules
204modules:
205    . $(LINUXDIR)/.config; if [ "$$CONFIG_MODULES" = "y" ]; then /
206        [ -d $(LINUXDIR)/modules ] || mkdir $(LINUXDIR)/modules; /
207        $(MAKEARCH_KERNEL) -C $(LINUXDIR) modules; /
208    fi
展开为:
. linux-2.6.16.RT.x/.config; if [ "$CONFIG_MODULES" = "y" ]; then /
        [ -d linux-2.6.16.RT.x/modules ] || mkdir linux-2.6.16.RT.x/modules; /
        make ARCH=arm CROSS_COMPILE=arm-linux-  ARCH=arm CROSS_COMPILE=arm-linux- -C linux-2.6.16.RT.x modules; /
    fi
make ARCH=arm CROSS_COMPILE=arm-linux-  ARCH=arm CROSS_COMPILE=arm-linux- -C linux-2.6.16.RT.x modules;这句话要求进入linux-2.6.16.RT.x目录执行make modules
linux-2.6.16.RT.x目录下的makefile文件中对modules目标的描述如下:
.PHONY: modules
modules: $(vmlinux-dirs) $(if $(KBUILD_BUILTIN),vmlinux)
    @echo '  Building modules, stage 2.';
    $(Q)$(MAKE) -rR -f $(srctree)/scripts/Makefile.modpost
展开为:
make[1]: Entering directory `/usr/local/icom_new/linux-2.6.16.RT.x'
  CHK     include/linux/version.h
make[2]: “include/asm-arm/mach-types.h”是最新的。
  CC [M]  drivers/net/ixp400_eth.o
  Building modules, stage 2.
  MODPOST
  CC      drivers/net/ixp400_eth.mod.o
  LD [M]  drivers/net/ixp400_eth.ko
make[1]: Leaving directory `/usr/local/icom_new/linux-2.6.16.RT.x'
到此处为止,集成在内核源代码里边的网卡驱动生成了。

3.3.subdirs生成规则

至此subdirs的linux和modules目标更新结束,我们回到顶层makefile的subdirs目标下查看生成规则:
329    echo "Build start unix"
330    echo $(BUILD_START_UNIX)
331    for dir in $(DIRS) ; do [ ! -d $$dir ] || $(MAKEARCH_KERNEL) -C $$dir || exit 1 ; done
展开如下
echo "Build start unix"
Build start unix
echo 1250797288
1250797288
for dir in  include lib include user ; do [ ! -d $dir ] || make ARCH=arm CROSS_COMPILE=arm-linux-  ARCH=arm CROSS_COMPILE=arm-linux- -C $dir || exit 1 ; done
这段语句描述了,linux和modules目标如何生成subdirs,这应该是最核心的内容了.
这段代码显示,将分别进入icow_new下的inlucde,lib,include,user目录下执行make.

3.3.1.include目录:

/usr/local/icom_new/include下makefile如下:
all: clean
    @echo "Making symlinks in include/"
    @for p in $(LINKHDRS); do /
        src=`expr "$$p" : '/(.*/),.*'` ; /
        dst=`expr "$$p" : '.*,/(.*/)'` ; /
        for i in $$src; do /
            [ ! -e "$$i" ] && continue; /
            [ "`basename $$i`" = CVS ] && continue; /
            [ -L "$$dst/`basename $$i`" ] && continue; /
            [ -d $$dst ] || mkdir $$dst; /
            ln -s $$i $$dst/.; /
        done ; /
    done
    @rm -rf include-linux
    @mkdir -p include-linux
    @ln -s $(ROOTDIR)/$(LINUXDIR)/include/linux include-linux/linux
ifndef CONFIG_DEFAULTS_LIBC_NONE
    @rm -f gcc
    @ln -s `$(CC) -print-file-name=include` gcc
    @echo "Making include/c++ symlink to compiler c++ includes"
    @rm -f c++
    @ln -s /usr/local/include/g++-v3 c++
    @for i in `$(CXX) -v -E -xc++ /dev/null 2>&1 | sed -e '/^Reading specs/,/^#include /d' -e '/End of search list/Q'`; do /
        if [ -f $$i/new ]; then rm -f c++; ln -s $$i c++; break; fi; /
    done
    @ln -s c++ `$(CC) --version | head -1 | cut -d " " -f3`
    @ln -s c++ g++-v3
endif

romfs:

clean:
    -find . -depth -type l -a ! -name Makefile | xargs rm > /dev/null 2>&1 || exit 0
    -find . -depth -type d | grep -v .svn | xargs rmdir > /dev/null 2>&1 || exit 0
展开为:
make[1]: Entering directory `/usr/local/icom_new/include'
find . -depth -type l -a ! -name Makefile | xargs rm > /dev/null 2>&1 || exit 0
find . -depth -type d | grep -v .svn | xargs rmdir > /dev/null 2>&1 || exit 0
Making symlinks in include/
Making include/c++ symlink to compiler c++ includes
make[1]: Leaving directory `/usr/local/icom_new/include'

3.3.2.lib目录


4.romfs目标


.PHONY: romfs
romfs: romfs.subdirs modules_install romfs.post

.PHONY: romfs.subdirs
romfs.subdirs:
    for dir in vendors $(DIRS) ; do [ ! -d $$dir ] || $(MAKEARCH) -C $$dir romfs || exit 1 ; done

.PHONY: modules_install
modules_install:
    . $(LINUXDIR)/.config; if [ "$$CONFIG_MODULES" = "y" ]; then /
        [ -d $(ROMFSDIR)/lib/modules ] || mkdir -p $(ROMFSDIR)/lib/modules; /
        $(MAKEARCH_KERNEL) -C $(LINUXDIR) INSTALL_MOD_PATH=$(ROMFSDIR) DEPMOD="../user/busybox/examples/depmod.pl -k vmlinux" modules_install; /
        rm -f $(ROMFSDIR)/lib/modules/*/build; /
        rm -f $(ROMFSDIR)/lib/modules/*/source; /
        find $(ROMFSDIR)/lib/modules -type f -name "*o" | xargs -r $(STRIP) -R .comment -R .note -g --strip-unneeded; /
    fi

.PHONY: romfs.post
romfs.post:
    $(MAKEARCH) -C vendors romfs.post
    -find $(ROMFSDIR)/. -name CVS | xargs -r rm -rf

4.1.romfs.subdirs目标

.PHONY: romfs.subdirs
romfs.subdirs:
    for dir in vendors $(DIRS) ; do [ ! -d $$dir ] || $(MAKEARCH) -C $$dir romfs || exit 1 ; done
展开为:
for dir in vendors  include lib include user ; do [ ! -d $dir ] || make ARCH=arm CROSS_COMPILE=arm-linux- -C $dir romfs || exit 1 ; done
4.1.1.vendors目标(/usr/local/icom_new/vendors)
all image clean romfs romfs.post vendor_%:
    $(MAKE) -C $(dir_v) dir_v=$(dir_v) -f $(VEND)/vendors-common.mak $@
展开为:
make -C /usr/local/icom_new/vendors/AdvantechPlatform/EKI-1126L/. dir_v=/usr/local/icom_new/vendors/AdvantechPlatform/EKI-1126L/. -f /usr/local/icom_new/vendors/vendors-common.mak romfs
此语句将进入/usr/local/icom_new/vendors/AdvantechPlatform/EKI-1126L/Makefile执行make romfs:
romfs:
    if [ ! -d $(IX_XSCALE_SW) ] ; then /
        echo $(CONFIG_PRODUCT) " needs the IXP400 software library"; /
    fi
    $(MAKE) -C $(IX_XSCALE_SW) all
    if [ ! -d $(ROOTDIR)/adv950_modules/adv950_v3_26/2.6 ] ; then /
        echo $(CONFIG_PRODUCT) " needs the adv950 driver"; /
    fi
    $(MAKEARCH) M=$(ROOTDIR)/adv950_modules/adv950_v3_26/2.6
    # $(MAKE) -f Makefile.uclinux -C $(ROOTDIR)/adv950_modules/adv950_v3_26/2.6 all
    [ -d $(ROMFSDIR)/$$i ] || mkdir -p $(ROMFSDIR)
    for i in $(ROMFS_DIRS); do /
        [ -d $(ROMFSDIR)/$$i ] || mkdir -p $(ROMFSDIR)/$$i; /
    done
    $(ROMFSINST) /etc/rc
   
    $(ROMFSINST) /etc/inittab
    $(ROMFSINST) ../../Generic/romfs/etc/services /etc/services
    $(ROMFSINST) /etc/motd
    $(ROMFSINST) /etc/passwd
    $(ROMFSINST) /etc/group
    #I added begin 08/07
    $(ROMFSINST) /etc/inetd.conf
    #I added end
    echo "$(VERSIONSTR) -- " `date` > $(ROMFSDIR)/etc/version
可见,romfs目标完成如下工作:
(1).进入/usr/local/icom_new/ixp400_xscale_sw目录和/usr/local/icom_new/ixp_osal目录进行编译,即把intel的库编译出来
(2).查看串口驱动的目录是否存在,若存在,则编译之
(3),创建文件系统的基本目录:bin dev etc etc/config etc/default home home/httpd home/cgi-bin lib lib/modules mnt proc sbin tmp usr usr/bin usr/sbin var var/lock var/log var/run var/tmp var/empty home home/cgi-bin
(4).初步复制一些配置文件到/usr/local/icom_new/romfs/etc目录下

4.1.2.include目标

include录下的makfile中,romfs目标下面是个空语句,什么都不做


4.1.3.lib目标
lib目录下makefile中romfs的描述如下:
romfs:
    $(ROMFSINST) -e CONFIG_USER_FLATFSD_FLATFSD -s config/passwd /etc/passwd
    $(ROMFSINST) -e CONFIG_USER_FLATFSD_FLATFSD -s config/group /etc/group
    $(ROMFSINST) -e CONFIG_USER_FLATFSD_FLATFSD -s config/mtab /etc/mtab
    $(ROMFSINST) -e CONFIG_USER_FLATFSD_FLATFSD -s config/fstab /etc/fstab
    $(ROMFSINST) -e CONFIG_USER_FLATFSD_FLATFSD -s config/resolv.conf /etc/resolv.conf
    $(ROMFSINST) -e CONFIG_USER_FLATFSD_FLATFSD -e CONFIG_USER_TINYLOGIN_SHADOWPASSWDS -s config/shadow /etc/shadow
    for i in $(DIRS_y) ; do /
        [ ! -d $$i ] || make -C $$i romfs || exit $$? ; /
    done
展开为:
make[1]: Entering directory `/usr/local/icom_new/lib'
romfs-inst.sh -e CONFIG_USER_FLATFSD_FLATFSD -s config/passwd /etc/passwd
romfs-inst.sh -e CONFIG_USER_FLATFSD_FLATFSD -s config/group /etc/group
romfs-inst.sh -e CONFIG_USER_FLATFSD_FLATFSD -s config/mtab /etc/mtab
romfs-inst.sh -e CONFIG_USER_FLATFSD_FLATFSD -s config/fstab /etc/fstab
romfs-inst.sh -e CONFIG_USER_FLATFSD_FLATFSD -s config/resolv.conf /etc/resolv.conf
romfs-inst.sh -e CONFIG_USER_FLATFSD_FLATFSD -e CONFIG_USER_TINYLOGIN_SHADOWPASSWDS -s config/shadow /etc/shadow
for i in uClibc  zlib  /usr/local/icom_new/prop ; do /
        [ ! -d $i ] || make -C $i romfs || exit $? ; /
    done
最后的for循环告诉我们,需要进入uClibc和zlib目录下执行make romfs.

4.1.3.1.uClib(/usr/local/icom_new/uClib)
romfs:
    [ -e $(ROMFSDIR)/lib ] || mkdir $(ROMFSDIR)/lib
    @if [ "$(SHARED_TARGET)" ]; then /
        $(ROMFSINST) $(SHARED_TARGET) /lib/lib$(LIBID).so; /
    fi
ifeq ($(strip $(HAVE_SHARED)),y)
    @set -e; for i in lib/lib*-$(UCLIBC_VERSION).so lib/*.so.*; do /
        $(ROMFSINST) -p 755 $$i /lib; /
    done
    @set -e; if [ -x lib/ld-uClibc-$(UCLIBC_VERSION).so ] ; then /
        $(ROMFSINST) -p 755 lib/ld-uClibc-$(UCLIBC_VERSION).so /lib; /
        $(ROMFSINST) -s /
            /lib/ld-uClibc-$(UCLIBC_VERSION).so /
            /lib/ld-linux.so.2; /
    fi;
endif
上述代码将/usr/local/icom_new/uClibc/lib目录下的动态库文件进行连接、strip,然后拷贝到/usr/local/icom_new/romfs/lib目录下


4.1.3.2.zlib(/usr/local/icom_new/lib/zlib)

/usr/local/icom_new/lib/zlib目录下的makefile对romfs目标没有描述.

4.1.4.include目标

include录下的makfile中,romfs目标下面是个空语句,什么都不做

4.1.5.user目标(/usr/local/icom_new/user)

/usr/local/icom_new/user目录下makefile对romfs的描述如下:
romfs:
    for i in $(sort $(dir_y)) $(dir_p) ; do /
        [ ! -d $$i ] || $(MAKE) -C $$i romfs || exit $$? ; /
    done
展开为:
for i in bash busybox ftp games init lrzsz mtd-utils /usr/local/icom_new/prop ; do /
        [ ! -d $i ] || make -C $i romfs || exit $? ; /
    done

上述语句进而进入应用程序目录下进行应用程序的编译,并将可执行文件安装到/usr/local/icom_new/romfs/bin或/usr/local/icom_new/romfs/sbin下面

 

5.image目标

顶层makefile对image目标的描述如下:
.PHONY: image
image:
    [ -d $(IMAGEDIR) ] || mkdir $(IMAGEDIR)
    $(MAKEARCH) -C vendors image
展开为:
[ -d /usr/local/icom_new/images ] || mkdir /usr/local/icom_new/images
make ARCH=arm CROSS_COMPILE=arm-linux- -C vendors image
将进入vendors目录执行make image

5.1.vendors(/usr/local/icom_new/vendors)
/usr/local/icom_new/vendors下的makefile对image的描述如下
$(MAKE) -C $(dir_v) dir_v=$(dir_v) -f $(VEND)/vendors-common.mak $@
词语就显示:它将执行/usr/local/icom_new/vendors/AdvantechPlatform/EKI-1126L/makefile中的image目标
/usr/local/icom_new/vendors/AdvantechPlatform/EKI-1126L/makefile中对image目标的定义如下
image:
    cp $(IX_XSCALE_SW)/$(IX_DEVICE)/lib/$(IX_TARGET)/ixp400.ko $(ROMFSDIR)/lib/modules/.
    cp $(ROOTDIR)/adv950_modules/adv950_v3_26/2.6/adv950.ko $(ROMFSDIR)/lib/modules/.
   
    #I added begin 08/05
    #cp $(PWD)/arp/ixp400_eth.ko  $(ROMFSDIR)/lib/modules/.
    #I added end 08/05
   
    cp $(PWD)/IxNpeMicrocode.dat $(ROMFSDIR)/etc/.
    cp $(PWD)/ssh/sshd_config $(ROMFSDIR)/etc/.
    cp $(PWD)/ssh/id_rsa $(ROMFSDIR)/etc/.
    cp $(PWD)/ssh/id_rsa.pub $(ROMFSDIR)/etc/.
    cp $(PWD)/arp/arp_announce $(ROMFSDIR)/home/.
    cp $(PWD)/arp/arp_ignore $(ROMFSDIR)/home/.
    cp $(PWD)/sslkey/*.pem $(ROMFSDIR)/etc/config/.
    [ -d $(IMAGEDIR) ] || mkdir -p $(IMAGEDIR)
    -$(ROMFSINST) -e CONFIG_IXP400_LIB_2_0 /
        -d $(ROOTDIR)/modules/ixp425/ixp400-2.0/IxNpeMicrocode.dat /
        /etc/IxNpeMicrocode.dat
    -$(ROMFSINST) -e CONFIG_IXP400_LIB_2_1 /
        -d $(ROOTDIR)/modules/ixp425/ixp400-2.1/IxNpeMicrocode.dat /
        /etc/IxNpeMicrocode.dat
    #genext2fs -b 8192 -f dev.txt -d $(ROMFSDIR) $(RAMDISK)
    #advlzo -c $(RAMDISK) $(RAMDISK).lzo
    #rm -f $(RAMDISK).gz
    #gzip $(RAMDISK)
    #chmod 777 $(RAMDISK).gz
    mkfs.jffs2 -U -d $(ROOTDIR)/romfs -D devtable.jffs2.txt -b -e 0x20000 -p 0x00D00000 -o $(JFFS2DISK).img
    cp $(ROOTDIR)/$(LINUXDIR)/arch/arm/boot/zImage $(KERNELZ)
    if [ -d /tftpboot ]; then /
        cp $(KERNELZ) /tftpboot/$(USER)-$(MODELNAME).zImage 2> /dev/null; /
        #cp $(RAMDISK).gz /tftpboot/$(USER)-$(MODELNAME).ramdisk.gz 2> /dev/null; /
        #cp $(RAMDISK).lzo /tftpboot/$(USER)-$(MODELNAME).ramdisk.lzo 2> /dev/null; /
         cp $(JFFS2DISK).img /tftpboot/$(USER)-$(MODELNAME).jffs2fs.img 2> /dev/null; /
    fi
展开为:
make[1]: Entering directory `/usr/local/icom_new/vendors'
make -C /usr/local/icom_new/vendors/AdvantechPlatform/EKI-1126L/. dir_v=/usr/local/icom_new/vendors/AdvantechPlatform/EKI-1126L/. -f /usr/local/icom_new/vendors/vendors-common.mak image
make[2]: Entering directory `/usr/local/icom_new/vendors/AdvantechPlatform/EKI-1126L'
cp /usr/local/icom_new/ixp400_xscale_sw/ixp43X/lib/linuxbe/ixp400.ko /usr/local/icom_new/romfs/lib/modules/.
cp /usr/local/icom_new/adv950_modules/adv950_v3_26/2.6/adv950.ko /usr/local/icom_new/romfs/lib/modules/.
#I added begin 08/05
#cp /usr/local/icom_new/vendors/AdvantechPlatform/EKI-1126L/arp/ixp400_eth.ko  /usr/local/icom_new/romfs/lib/modules/.
#I added end 08/05
cp /usr/local/icom_new/vendors/AdvantechPlatform/EKI-1126L/IxNpeMicrocode.dat /usr/local/icom_new/romfs/etc/.
cp /usr/local/icom_new/vendors/AdvantechPlatform/EKI-1126L/ssh/sshd_config /usr/local/icom_new/romfs/etc/.
cp /usr/local/icom_new/vendors/AdvantechPlatform/EKI-1126L/ssh/id_rsa /usr/local/icom_new/romfs/etc/.
cp /usr/local/icom_new/vendors/AdvantechPlatform/EKI-1126L/ssh/id_rsa.pub /usr/local/icom_new/romfs/etc/.
cp /usr/local/icom_new/vendors/AdvantechPlatform/EKI-1126L/arp/arp_announce /usr/local/icom_new/romfs/home/.
cp /usr/local/icom_new/vendors/AdvantechPlatform/EKI-1126L/arp/arp_ignore /usr/local/icom_new/romfs/home/.
cp /usr/local/icom_new/vendors/AdvantechPlatform/EKI-1126L/sslkey/*.pem /usr/local/icom_new/romfs/etc/config/.
[ -d /usr/local/icom_new/images ] || mkdir -p /usr/local/icom_new/images
romfs-inst.sh -e CONFIG_IXP400_LIB_2_0 /
        -d /usr/local/icom_new/modules/ixp425/ixp400-2.0/IxNpeMicrocode.dat /
        /etc/IxNpeMicrocode.dat
romfs-inst.sh -e CONFIG_IXP400_LIB_2_1 /
        -d /usr/local/icom_new/modules/ixp425/ixp400-2.1/IxNpeMicrocode.dat /
        /etc/IxNpeMicrocode.dat
genext2fs -b 8192 -f dev.txt -d /usr/local/icom_new/romfs /usr/local/icom_new/images/ramdisk
advlzo -c /usr/local/icom_new/images/ramdisk /usr/local/icom_new/images/ramdisk.lzo
Ratio = 0.204247
rm -f /usr/local/icom_new/images/ramdisk.gz
gzip /usr/local/icom_new/images/ramdisk
chmod 777 /usr/local/icom_new/images/ramdisk.gz
mkfs.jffs2 -U -d /usr/local/icom_new/romfs -D devtable.jffs2.txt -b -e 0x20000 -p 0x00D00000 -o /usr/local/icom_new/images/jffs2fs.img
cp /usr/local/icom_new/linux-2.6.16.RT.x/arch/arm/boot/zImage /usr/local/icom_new/images/zImage
if [ -d /tftpboot ]; then /
        cp /usr/local/icom_new/images/zImage /tftpboot/root-EKI-1126L.zImage 2> /dev/null; /
        cp /usr/local/icom_new/images/ramdisk.gz /tftpboot/root-EKI-1126L.ramdisk.gz 2> /dev/null; /
        cp /usr/local/icom_new/images/ramdisk.lzo /tftpboot/root-EKI-1126L.ramdisk.lzo 2> /dev/null; /
         cp /usr/local/icom_new/images/jffs2fs.img /tftpboot/root-EKI-1126L.jffs2fs.img 2> /dev/null; /
    fi
make[2]: Leaving directory `/usr/local/icom_new/vendors/AdvantechPlatform/EKI-1126L'
make[1]: Leaving directory `/usr/local/icom_new/vendors'
可见,此处的image目标完成了以下内容:
(1).向/usr/local/icom_new/romfs/etc目录下拷贝一些必要的配置文件
(2).把模块拷贝到/usr/local/icom_new/romfs/lib/modules目录下
(3).到此为止,/usr/local/icom_new/romfs目录下已经是一个完整的文件系统的目录结构,使用如下命令将此目录作成jffs2的文件系统:
mkfs.jffs2 -U -d /usr/local/icom_new/romfs -D devtable.jffs2.txt -b -e 0x20000 -p 0x00D00000 -o /usr/local/icom_new/images/jffs2fs.img
-D devtable.jffs2.txt参数告诉我们使用devtable.jffs2.txt作为设备表文件,mkfs.jffs2会根据此文件的内容生成/dev目录下的设备文件。(若不使用此参数,你必须手动创建一些启动文件系统所必须的设备文件,比如:console等)
至此文件系统和内核镜像都已经生成了。