<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          新聞中心

          EEPW首頁 > 嵌入式系統(tǒng) > 設計應用 > 構建 arm-linux 仿真運行環(huán)境 (skyeye + arm-linux + NFS)

          構建 arm-linux 仿真運行環(huán)境 (skyeye + arm-linux + NFS)

          作者: 時間:2016-11-10 來源:網(wǎng)絡 收藏
          一 前言

          本文旨在將 arm-linux 在 skyeye 上搭建起來,并在 arm-linux 上能成功 mount

          本文引用地址:http://www.ex-cimer.com/article/201611/317266.htm

          NFS 為目標, 最終我們能在 arm-linux 里運行我們自己的應用程序. 其實在 skyeye 上移

          植 arm-linux 并非難事,網(wǎng)上也有不少資料, 只是大都遺漏細節(jié), 以致細微之處卡殼,所以本

          文力求詳實清析, 希望能對大家有點用處。

          二 安裝 Skyeye

          我們選定 skyeye 的 1.2.4 這個版本, 為了能讓它上面運行的 arm-linx 能掛接 NFS,我

          們需要修改 device/net/dev_net_cs8900a.c (修改后的文件在附件里), 再編譯 skyeye。

          操作如下, 先解壓源碼包:

          #tar xzf skyeye-1.2.4_Rel.tar.gz

          #cd skyeye-1.2.4

          請用附件里的 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

          三 編譯內核

          我們選定 linux-2.6.14.tar.bz2 這個版本, 交叉編譯器用 arm-linux-gcc 3.4.1 (對

          2.6 內核用 3.4 以下的版本編譯經常會出現(xiàn)問題)。操作步驟如下:

          1.假定內核源碼包在 /root 下, 首先解壓源碼:

          #cd /root

          #tar xjf linux-2.6.14.tar.bz2

          2.進入內核目錄:

          #cd linux-2.6.14

          修改此目錄下的 Makefile, 將

          ARCH ?= $(SUBARCH)

          CROSS_COMPILE ?=

          改為

          ARCH ?= arm

          CROSS_COMPILE ?= /usr/local/arm/3.4.1/bin/arm-linux-

          3.生成默認的內核配置文件(for s3c2410):

          #make smdk2410_defconfig

          4.為內核添加 cs8900(見附件) 網(wǎng)卡驅動,以支持 NFS 掛接:

          (1)復制 cs8900 驅動到 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.

          注:在運行 make menuconfig 命令時就會出現(xiàn): [ ] CS8900 support 這一選項

          (3)修改 drivers/net/arm 目錄下的Makefile文件,在最后添加如下內容:

          obj-$(CONFIG_ARM_CS8900) += cs8900.o

          注:2.6 版本內核的 Makefile 也與 2.4 的有所不同, 添加以上語句, 就會使內核在

          編譯的時候根據(jù)配置將cs8900A的驅動程序以模塊或靜態(tài)的方式編譯到內核當中。

          (4)修改 arch/arm/mach-s3c2410/mach-smdk2410.c

          在此文件中找到 smdk2410_iodesc[] 結構數(shù)組,添加如下如下內容:

          {vSMDK2410_ETH_IO,pSMDK2410_ETH_IO, SZ_1M, MT_DEVICE}

          修改之后變成:

          static struct map_desc smdk2410_iodesc[] __initdata = {

          /* nothing here yet */

          /* Map the ethernet controller CS8900A */

          {vSMDK2410_ETH_IO,pSMDK2410_ETH_IO, SZ_1M, MT_DEVICE}

          };

          并且添加一個頭文件引用:

          #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修改內核文件

          修改 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.裁剪/定制內核

          (1)#make menuconfig

          (2)設置內核啟動參數(shù)

          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 內核了

          四 制作根文件系統(tǒng) initrd.img(Initial RAM disk)

          我們選定 busybox-1.9.2.tar.bz2 這個版本, 以靜態(tài)方式編譯, 即生成的 busybox 不需

          要共享庫的支持就能運行。這樣做我們就不需要布署程序庫了。缺點是自己寫的 arm-linux 程序在

          這個根文件系統(tǒng)中是不能運行的,因為缺少共享程序庫的支持。不過別擔心,我們會解決這個問題的,稍

          后你將看到,通過在 arm-linux 里以掛接 NFS 的方式, 將宿主機的 arm-linux-gcc 編譯器的

          庫文件掛到 arm-linux 的 /lib 下, 就可完美的運行我們自己的程序了。好,一步步來,先來看看

          根文件系統(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-

          注:這個版本的 busybox 用 3.4.1 的 arm-linux-gcc 編譯有些問題, 用 3.3.2 版則可順利編譯。

          3.定制 busybox

          #make menuconfig

          設置靜態(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

          編譯出錯, 信息如下:

          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.

          注釋掉:

          /*#error Aborting compilation.*/

          執(zhí)行 make 重新編譯

          #make

          編譯通過, busybox 被生成了, 然后執(zhí)行

          #make install

          busybox 就被安裝到默認的臨時目錄 _install 下了

          5.制作 initrd.img

          有了 busybox 后制作 initrd.img 就容易多了,只是說起來比較煩瑣。以命令演示如下:

          創(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

          建立設備文件

          #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, 內容如下:

          ::sysinit:/etc/init.d/rcS

          ::askfirst:-/bin/sh

          ::restart:/sbin/init

          ::ctrlaltdel:/sbin/reboot

          ::shutdown:/bin/umount -a -r

          ::shutdown:/sbin/swapoff -a

          設置此腳本執(zhí)行權限

          #chmod 644 etc/inittab

          創(chuàng)建腳本文件 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

          設置此腳本執(zhí)行權限

          #chmod 755 etc/init.d/rcS

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

          cd ..

          umount initrd

          五 運行 arm-linux

          現(xiàn)在我們有了內核 vmlinux, 映像文件 initrd.img, 模擬程序 skyeye, 我們還需要一個

          配置文件 skyeye.conf 進行 arm-linux 的仿真運行。

          #mkdir /root/test

          #cd /root/test

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

          skyeye.conf, 文件內容如下:

          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

          好了,試運行吧:

          skyeye -e vmlinux

          看到你的 arm-linux 運行了嗎 :-)

          六 在 arm-linux 里運行我們自己的程序

          現(xiàn)在 arm-linux 在 skyeye 上跑起來了, 我們能運行里面的命令, 但這些都是 busybox

          的,是系統(tǒng)程序。怎樣才能在 arm-linux 里運行我們自己的程序呢? 有兩種方案,我們不妨討論一

          下,擇優(yōu)而錄之:

          1.在制作根文件系統(tǒng) initrd.img 的時候把我們自己的程序加進去,比如放在 /usr/bin 里

          目錄下,然后重新生成 initrd.img,并用這個新的根文件系統(tǒng)來運行 arm-linux。其實這

          是我們的產品在 arm-linux 上發(fā)布的最終方式,但這有個缺點: 在產品開發(fā)/調試階段這么

          做比較麻煩,每修改一次代碼就得 build 一次根文件系統(tǒng)。

          2.利用掛接 NFS(Network file system) 的方式,我們訪問/執(zhí)行一個網(wǎng)絡文件系統(tǒng)上的文件

          就像它在本地一樣,顯然這么做能避免第一種方案的弊端! 如何實現(xiàn)呢? 隨我來:

          (1)在 arm-linux 的宿主機里配置 NFS Server (我用是 ubuntu,而且是在 vmware 里)

          #apt-get install nfs-kernel-server

          #apt-get install nfs-common

          (2)編輯文件 /etc/exports, 內容如下(具體需求由你而定):

          /test *(rw,sync,no_root_squash)

          /usr/local/arm/3.3.2/lib *(ro,sync,no_root_squash)

          (3)配置宿主機的 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 -r

          #/etc/init.d/nfs-kernel-server restart

          #/etc/init.d/portmap restart

          注:可用 showmount -e 來驗證你的配置是否成功

          (5)在 skyeye 運行 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

          注:可將這幾個命令加到 rcS 腳本里,讓 arm-linux 啟動時幫你做

          (6)在 skyeye 上運行 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

          在宿主機的 /test 下建立文件 hello.c,用 arm-linux-gcc 3.3.2 編譯

          #cd /test

          #arm-linux-gcc -o hello hello.c

          在 arm-linux 的 /tmp 下看看,是不是有 hello.c 和 hello 這兩個文件了? 試著運行看看:

          #cd /tmp

          #./hello

          注:為了確認 arm-linux 能和宿主機通信, 可嘗試以下手段:

          (1)在宿主機上 ping 你的 arm-linux

          #ping 10.0.0.2 -c 2

          (2)在 arm-linux 里 ping 你的宿主機

          #ping 10.0.0.1 -c 2

          (3)如果相互都 ping 不通過,可這樣做:

          重新設置一下 arm-linux 的網(wǎng)絡:

          #ifconfig eth0 down

          #ifconfig eth0 up

          再重新設置一下宿主機的網(wǎng)絡:

          #ifconfig eth1 down

          #ifconfig eth1 up

          然后再像上一步那樣,相互 ping 對方,直至 ping 通為止。能說的就這么多了,祝你好運!



          評論


          相關推薦

          技術專區(qū)

          關閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();