自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

構(gòu)建arm-linux仿真運(yùn)行環(huán)境 (NFS啟動(dòng))

企業(yè)動(dòng)態(tài)
本文旨在將 arm-linux 在 skyeye 上搭建起來(lái),并在 arm-linux 上能成功 mount NFS 為目標(biāo), 最終我們能在 arm-linux 里運(yùn)行我們自己的應(yīng)用程序. 其實(shí)在 skyeye 上移植 arm-linux 并非難事,網(wǎng)上也有不少資料, 只是大都遺漏細(xì)節(jié), 以致細(xì)微之處卡殼,所以本文力求詳實(shí)清析, 希望能對(duì)大家有點(diǎn)用處。

一 前言
本文旨在將 arm-linux 在 skyeye 上搭建起來(lái),并在 arm-linux 上能成功 mount NFS 為目標(biāo), 最終我們能在 arm-linux 里運(yùn)行我們自己的應(yīng)用程序. 其實(shí)在 skyeye 上移植 arm-linux 并非難事,網(wǎng)上也有不少資料, 只是大都遺漏細(xì)節(jié), 以致細(xì)微之處卡殼,所以本文力求詳實(shí)清析, 希望能對(duì)大家有點(diǎn)用處。

二 安裝 Skyeye

 我們選定 skyeye 的 1.2.4 這個(gè)版本, 為了能讓它上面運(yùn)行的 arm-linx 能掛接 NFS,我們需要修改 device/net/dev_net_cs8900a.c (修改后的文件在附件里), 再編譯 skyeye。操作如下, 先解壓源碼包:
    #tar xzf skyeye-1.2.4_Rel.tar.gz
    #cd skyeye-1.2.4

    請(qǐng)用附件里的 dev_net_cs8900a.c 替換 device/net/dev_net_cs8900a.c 后執(zhí)行編譯:
    #make NO_DBCT=1 NO_BFD=1

    編譯完后生成的 skyeye 在 binary 下,將其拷貝至 /usr/local/bin/ 下:
    #cp binary/skyeye /usr/local/bin

三 編譯內(nèi)核

我們選定 linux-2.6.14.tar.bz2 這個(gè)版本, 交叉編譯器用 arm-linux-gcc 3.4.1 (對(duì)2.6 內(nèi)核用 3.4 以下的版本編譯經(jīng)常會(huì)出現(xiàn)問(wèn)題)。操作步驟如下:

    1.假定內(nèi)核源碼包在 /root 下, 首先解壓源碼:
    #cd /root
    #tar xjf linux-2.6.14.tar.bz2

    2.進(jìn)入內(nèi)核目錄:
    #cd linux-2.6.14

    修改此目錄下的 Makefile, 將
    ARCH          ?= $(SUBARCH)
    CROSS_COMPILE ?=
    改為
    ARCH          ?= arm
    CROSS_COMPILE ?= /usr/local/arm/3.4.1/bin/arm-linux-

    3.生成默認(rèn)的內(nèi)核配置文件(for s3c2410):
    #make smdk2410_defconfig

    4.為內(nèi)核添加 cs8900(見(jiàn)附件) 網(wǎng)卡驅(qū)動(dòng),以支持 NFS 掛接:
    (1)復(fù)制 cs8900 驅(qū)動(dòng)到 drivers/net/arm 目錄
         #cp cs8900.c drivers/net/arm
         #cp cs8900.h drivers/net/arm

    (2)修改 drivers/net/arm 目錄下的 Kconfig 文件, 在最后添加:
         config arm_CS8900
            tristate "CS8900 support"
            depends on NET_ETHERNET && arm && ARCH_SMDK2410
            help
              Support for CS8900A chipset based Ethernet cards. If you have a network
              (Ethernet) card of this type, say Y and read the Ethernet-HOWTO, available
              from as well as .To compile this driver as a module, choose M here and read.
              The module will be called cs8900.o.

         注:在運(yùn)行 make menuconfig 命令時(shí)就會(huì)出現(xiàn): [ ] CS8900 support 這一選項(xiàng)

    (3)修改 drivers/net/arm 目錄下的Makefile文件,在最后添加如下內(nèi)容:
         obj-$(CONFIG_arm_CS8900) += cs8900.o

         注:2.6 版本內(nèi)核的 Makefile 也與 2.4 的有所不同, 添加以上語(yǔ)句, 就會(huì)使內(nèi)核在編譯的時(shí)候根據(jù)配置將cs8900A的驅(qū)動(dòng)程序以模塊或靜態(tài)的方式編譯到內(nèi)核當(dāng)中。

    (4)修改 arch/arm/mach-s3c2410/mach-smdk2410.c 在此文件中找到 smdk2410_iodesc[] 結(jié)構(gòu)數(shù)組,添加如下如下內(nèi)容:

         {vSMDK2410_ETH_IO,pSMDK2410_ETH_IO, SZ_1M, MT_DEVICE}

         修改之后變成:

         static struct map_desc smdk2410_iodesc[] __initdata = {


         {vSMDK2410_ETH_IO,pSMDK2410_ETH_IO, SZ_1M, MT_DEVICE}
         };

         并且添加一個(gè)頭文件引用:
         #include

    (5)在 include/asm-arm/arch-s3c2410 目錄下創(chuàng)建文件 smdk2410.h
         #ifndef _INCLUDE_SMDK2410_H_
         #define _INCLUDE_SMDK2410_H_

         #include
         #define pSMDK2410_ETH_IO 0x19000000
         #define vSMDK2410_ETH_IO 0xE0000000
         #define SMDK2410_ETH_IRQ IRQ_EINT9

         #endif

    5.參照 http://skyeye.wiki.sourceforge.net/Linux 修改內(nèi)核文件
    修改 include/asm-arm/arch-s3c2410/map.h
    #define S3C2410_CS6 (0x30000000UL)
    to
    #define S3C2410_CS6 (0xC0000000UL)

    修改 include/asm-arm/arch-s3c2410/memory.h
    #define PHYS_OFFSET (0x30000000UL)
    to
    #define PHYS_OFFSET (0xC0000000UL)


    6.裁剪/定制內(nèi)核
    (1)#make menuconfig
    (2)設(shè)置內(nèi)核啟動(dòng)參數(shù)
         Boot options ---> Default kernel command string:
         mem=32M console=ttySAC0 root=/dev/ram initrd=0xc0800000,0x00800000 ramdisk_size=8192 rw

    (3)設(shè)置 CS8900 的支持
         Device Drivers --->
         Network device support --->
         Ethernet (10 or 100Mbit) ---> []   CS8900 support
         選中 [*]   CS8900 support
    (4)設(shè)置 initrd 的支持
         Device Drivers ---> Block devices ---> [ ] RAM disk support
         下面三項(xiàng)必須設(shè)置:
         1.確保 RAM disk support 被選中
         2.相應(yīng)的將默認(rèn)的 (4096) Default RAM disk size (kbytes) 改成 8192;
         3.Initial RAM disk (initrd) support 一定要選中, 切記!
    (5)設(shè)置 NFS 的支持
         File systems ---> Network File Systems --->
         至少確保下面兩項(xiàng)被選中:
         [*] NFS file system support
         [*]   Provide NFSv3 client support
    (6)設(shè)置 ROM file system 的支持
         File systems ---> [*] ROM file system support
         確保 [*] ROM file system support 被選中
    (7)設(shè)置 ext2 的支持
         File systems ---> [*] Second extended fs support
         確保 [*] Second extended fs support 被選中

    7.編譯
    #make
    編譯完成后會(huì)有個(gè) vmlinux 在當(dāng)前目錄下, 這就是我們要的 arm-linux 內(nèi)核了

#P#

四 制作根文件系統(tǒng) initrd.img(Initial RAM disk)
 我們選定 busybox-1.9.2.tar.bz2 這個(gè)版本, 以靜態(tài)方式編譯, 即生成的 busybox 不需要共享庫(kù)的支持就能運(yùn)行。這樣做我們就不需要布署程序庫(kù)了。缺點(diǎn)是自己寫的 arm-linux 程序在這個(gè)根文件系統(tǒng)中是不能運(yùn)行的,因?yàn)槿鄙俟蚕沓绦驇?kù)的支持。不過(guò)別擔(dān)心,我們會(huì)解決這個(gè)問(wèn)題的,稍后你將看到,通過(guò)在 arm-linux 里以掛接 NFS 的方式, 將宿主機(jī)的 arm-linux-gcc 編譯器的庫(kù)文件掛到 arm-linux 的 /lib 下, 就可完美的運(yùn)行我們自己的程序了。好,一步步來(lái),先來(lái)看看根文件系統(tǒng)的制作:

    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-

    注:這個(gè)版本的 busybox 用 3.4.1 的 arm-linux-gcc 編譯有些問(wèn)題, 用 3.3.2 版則可順利編譯。
    3.定制 busybox
    #make menuconfig

    設(shè)置靜態(tài)編譯方式
    Busybox Settings ---> Build Options ---> [*] Build BusyBox as a static binary (no shared libs)
    確保 [*] Build BusyBox as a static binary (no shared libs) 被選中
    4.執(zhí)行 make 編譯
    #make

    編譯出錯(cuò), 信息如下:
    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

    還是出錯(cuò), 信息如下:
    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.
    注釋掉:

    執(zhí)行 make 重新編譯
    #make

    編譯通過(guò), busybox 被生成了, 然后執(zhí)行
    #make install

    busybox 就被安裝到默認(rèn)的臨時(shí)目錄 _install 下了
    5.制作 initrd.img
    有了 busybox 后制作 initrd.img 就容易多了,只是說(shuō)起來(lái)比較煩瑣。以命令演示如下:

    創(chuàng)建映像文件并掛到 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/* .

    #創(chuàng)建必要的目錄
    #mkdir proc lib etc dev root home var tmp
    #chmod 777 tmp

    建立設(shè)備文件
    #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 ..

    創(chuàng)建腳本文件 etc/inittab, 內(nèi)容如下:
    ::sysinit:/etc/init.d/rcS
    ::askfirst:-/bin/sh
    ::restart:/sbin/init
    ::ctrlaltdel:/sbin/reboot
    ::shutdown:/bin/umount -a -r
    ::shutdown:/sbin/swapoff -a

    設(shè)置此腳本執(zhí)行權(quán)限
    #chmod 644 etc/inittab

    創(chuàng)建腳本文件 etc/init.d/rcS, 內(nèi)容如下:
    #!/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

    設(shè)置此腳本執(zhí)行權(quán)限
    #chmod 755 etc/init.d/rcS

    最后一步,執(zhí)行實(shí)際的寫入操作,生成 initrd.img
    cd ..
    umount initrd

五 運(yùn)行 arm-linux
現(xiàn)在我們有了內(nèi)核 vmlinux, 映像文件 initrd.img, 模擬程序 skyeye, 我們還需要一個(gè)
配置文件 skyeye.conf 進(jìn)行 arm-linux 的仿真運(yùn)行。
    #mkdir /root/test
    #cd /root/test

    將 vmlinux, initrd.img 都拷貝到此目錄, 在此目錄下建立一個(gè) skyeye 的配制文件

    skyeye.conf, 文件內(nèi)容如下:
    cpu: arm920t
    mach: s3c2410x

    # physical memory
    mem_bank: map=M, type=RW, addr=0xc0000000, size=0x00800000
    mem_bank: map=M, type=RW, addr=0xc0800000, size=0x00800000, file=./initrd.img
    mem_bank: map=M, type=RW, addr=0xc1000000, size=0x01000000

    # all peripherals I/O mapping area
    mem_bank: map=I, type=RW, addr=0x48000000, size=0x20000000

    mem_bank: map=I, type=RW, addr=0x19000300, size=0x00000020
    net: type=cs8900a, base=0x19000300, size=0x20,int=9, mac=0:4:3:2:1:f, ethmod=tuntap, hostip=10.0.0.1

    lcd: type=s3c2410x, mod=gtk
    #dbct:state=on


    好了,試運(yùn)行吧:
    skyeye -e vmlinux

    看到你的 arm-linux 運(yùn)行了嗎 :-)

 

#P#

六 在 arm-linux 里運(yùn)行我們自己的程序
現(xiàn)在 arm-linux 在 skyeye 上跑起來(lái)了, 我們能運(yùn)行里面的命令, 但這些都是 busybox的,是系統(tǒng)程序。怎樣才能在 arm-linux 里運(yùn)行我們自己的程序呢? 有兩種方案,我們不妨討論一下,擇優(yōu)而錄之:
    1.在制作根文件系統(tǒng) initrd.img 的時(shí)候把我們自己的程序加進(jìn)去,比如放在 /usr/bin 里目錄下,然后重新生成 initrd.img,并用這個(gè)新的根文件系統(tǒng)來(lái)運(yùn)行 arm-linux。其實(shí)這是我們的產(chǎn)品在 arm-linux 上發(fā)布的最終方式,但這有個(gè)缺點(diǎn): 在產(chǎn)品開發(fā)/調(diào)試階段這么做比較麻煩,每修改一次代碼就得 build 一次根文件系統(tǒng)。

    2.利用掛接 NFS(Network file system) 的方式,我們?cè)L問(wèn)/執(zhí)行一個(gè)網(wǎng)絡(luò)文件系統(tǒng)上的文件就像它在本地一樣,顯然這么做能避免第一種方案的弊端! 如何實(shí)現(xiàn)呢? 隨我來(lái):

    (1)在 arm-linux 的宿主機(jī)里配置 NFS Server (我用是 Ubuntu,而且是在 vmware 里)
         #apt-get install nfs-kernel-server
         #apt-get install nfs-common
    (2)編輯文件 /etc/exports, 內(nèi)容如下(具體需求由你而定):
         /test                          *(rw,sync,no_root_squash)
         /usr/local/arm/3.3.2/lib       *(ro,sync,no_root_squash)
    (3)配置宿主機(jī)的 ip
         #ifconfig eth1 down
         #ifconfig eth1 10.0.0.1 netmask 255.0.0.0 up
         注:你的可能是 eth0, 另外 ip 地址你也可自己定義,只要能和 arm-liux 通信
    (4)重啟 nfs server
         #/usr/sbin/exportfs
         #/etc/init.d/nfs-kernel-server restart
         #/etc/init.d/portmap restart
    (5)在 skyeye 運(yùn)行 arm-linux,為其配置 ip
         #ifconfig lo down
         #ifconfig eth0 down
         #ifconfig lo 127.0.0.1 up
         #ifconfig eth0 10.0.0.2 netmask 255.0.0.0 up
         注:可將這幾個(gè)命令加到 rcS 腳本里,讓 arm-linux 啟動(dòng)時(shí)幫你做
    (6)在 skyeye 上運(yùn)行 arm-linux,演示 nfs 掛接
         #mount -o nolock 10.0.0.1:/usr/local/arm/3.3.2/lib /lib
         #export LD_LIBRARY_PATH=/lib
         #mount -o nolock 10.0.0.1:/test /tmp

         在宿主機(jī)的 /test 下建立文件 hello.c,用 arm-linux-gcc 3.3.2 編譯
         #cd /test
         #arm-linux-gcc -o hello hello.c

         在 arm-linux 的 /tmp 下看看,是不是有 hello.c 和 hello 這兩個(gè)文件了? 試著運(yùn)行看看:
         #cd /tmp
         #./hello

    注:為了確認(rèn) arm-linux 能和宿主機(jī)通信, 可嘗試以下手段:
    (1)在宿主機(jī)上 ping 你的 arm-linux
       #ping 10.0.0.2 -c 2
    (2)在 arm-linux 里 ping 你的宿主機(jī)
       #ping 10.0.0.1 -c 2
    (3)如果相互都 ping 不通過(guò),可這樣做:
       重新設(shè)置一下 arm-linux 的網(wǎng)絡(luò):
       #ifconfig eth0 down
       #ifconfig eth0 up

       再重新設(shè)置一下宿主機(jī)的網(wǎng)絡(luò):
       #ifconfig eth1 down
       #ifconfig eth1 up

       然后再像上一步那樣,相互 ping 對(duì)方,直至 ping 通為止。

【編輯推薦】

  1. LINUX PXE網(wǎng)絡(luò)安裝
  2. 玩轉(zhuǎn)linux之二-驅(qū)動(dòng)開發(fā)技術(shù)探析
  3. Linux初學(xué)者入門優(yōu)秀教程
責(zé)任編輯:張燕妮 來(lái)源: 中國(guó)IT實(shí)驗(yàn)室
相關(guān)推薦

2011-04-22 14:59:14

RedHat編譯器

2011-06-28 13:27:13

ARM Linux

2010-08-02 17:20:12

nfs啟動(dòng)Linux

2009-12-23 11:32:56

nfs啟動(dòng)Linux

2010-02-02 15:41:00

Linux內(nèi)核

2017-11-14 08:27:13

AndroidLinuxAPP

2011-06-29 10:18:20

LINUX QT ARM

2017-05-31 14:35:17

大數(shù)據(jù)運(yùn)行環(huán)境數(shù)據(jù)管道

2010-02-25 13:58:22

Linux JDK

2023-09-19 10:00:34

Linux虛擬

2015-09-15 11:13:52

光盤Parsix GNULinux

2011-02-13 13:44:08

Linux關(guān)機(jī)重新啟動(dòng)

2021-09-28 15:03:06

Linux內(nèi)核arm

2009-12-11 18:00:50

Linux KVM

2009-06-22 11:13:00

linuxJava運(yùn)行環(huán)境

2010-09-17 11:01:05

Java運(yùn)行環(huán)境

2010-08-05 13:40:06

NFS服務(wù)器

2015-11-17 10:12:03

Linux運(yùn)行環(huán)境

2010-07-30 13:23:52

Linux NFS端口

2011-06-17 08:59:27

QT Embedded Arm
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)