Linux与ARM仿真建立.docx

上传人:b****1 文档编号:2364351 上传时间:2023-05-03 格式:DOCX 页数:24 大小:31.92KB
下载 相关 举报
Linux与ARM仿真建立.docx_第1页
第1页 / 共24页
Linux与ARM仿真建立.docx_第2页
第2页 / 共24页
Linux与ARM仿真建立.docx_第3页
第3页 / 共24页
Linux与ARM仿真建立.docx_第4页
第4页 / 共24页
Linux与ARM仿真建立.docx_第5页
第5页 / 共24页
Linux与ARM仿真建立.docx_第6页
第6页 / 共24页
Linux与ARM仿真建立.docx_第7页
第7页 / 共24页
Linux与ARM仿真建立.docx_第8页
第8页 / 共24页
Linux与ARM仿真建立.docx_第9页
第9页 / 共24页
Linux与ARM仿真建立.docx_第10页
第10页 / 共24页
Linux与ARM仿真建立.docx_第11页
第11页 / 共24页
Linux与ARM仿真建立.docx_第12页
第12页 / 共24页
Linux与ARM仿真建立.docx_第13页
第13页 / 共24页
Linux与ARM仿真建立.docx_第14页
第14页 / 共24页
Linux与ARM仿真建立.docx_第15页
第15页 / 共24页
Linux与ARM仿真建立.docx_第16页
第16页 / 共24页
Linux与ARM仿真建立.docx_第17页
第17页 / 共24页
Linux与ARM仿真建立.docx_第18页
第18页 / 共24页
Linux与ARM仿真建立.docx_第19页
第19页 / 共24页
Linux与ARM仿真建立.docx_第20页
第20页 / 共24页
亲,该文档总共24页,到这儿已超出免费预览范围,如果喜欢就下载吧!
下载资源
资源描述

Linux与ARM仿真建立.docx

《Linux与ARM仿真建立.docx》由会员分享,可在线阅读,更多相关《Linux与ARM仿真建立.docx(24页珍藏版)》请在冰点文库上搜索。

Linux与ARM仿真建立.docx

Linux与ARM仿真建立

Linux@ARM(在ARM9上安装Linux,利用SkyEye模拟器及U-BOOT引导)

提示:

本人在2008年进行Linux@ARM实验,在ARM9上安装Linux、利用SkyEye模拟器及U-BOOT引导。

这是实验报告、以及实验过程中留下的记录,按日期倒序排列。

本文以CreativeCommonsBY-NC3.0协议授权

嵌入式系统作业二:

Linux@ARM

5050369043石君霄

一、实验环境

主机硬件:

DELLINSPIRON600m

操作系统:

Ubuntu8.04Hardy

主机编译器:

gcc4.2.3

仿真环境:

SkyEye1.2.4

交叉编译器:

arm-unknown-linux-gnu-gcc3.4.5withglibc2.3.6

二、实验目标

安装SkyEye硬件仿真器,对arm920t处理器和AtmelAT91RM9200dk开发板进行仿真;

在仿真开发板上安装linux-2.6.25及BusyBox-1.9.2。

三、实验步骤

--------------------------------------------------------------------------------

#1编译安装SkyEye

SkyEye是清华大学制作的一款开源硬件仿真器,支持ARM和BlackFin平台。

qemu只能仿真ARM的指令集,而SkyEye可以仿真整块开发板。

4月4日,我下载了SkyEye-1.2.4,下载地址是:

编译SkyEye的方法与普通Linux程序完全一致,应使用主机平台(i386)的编译器。

我使用的编译命令行是:

$makeSTATIC=1NO_DBCT=1NO_LCD=1NO_NET=1NO_BFD=1

我指定了很多NO,禁止了不使用的功能,这有助于减少出错几率。

5月20日使用的skyeye.conf内容如下:

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

#,2008-05-14

#CreativeCommonsBY-NC3.0

cpu:

arm920t

mach:

at91rm92

#mainmemory,32MB

mem_bank:

map=M,type=RW,addr=0x20000000,size=0x02000000,file=./myimage,boot=yes

#definedinarch/arm/mach-at91/Makefile.boot

#kernel->20008000

#kernelparam->20000100

#ramdisk->20410000

#IOportsoftheboard

mem_bank:

map=I,type=RW,addr=0xfffa0000,size=0x00060000

uart:

mod=stdio

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

--------------------------------------------------------------------------------

#2获得交叉编译器

5月8日,我下载了一个二进制格式的交叉编译器,下载地址是:

这个编译器在i386平台上工作,能将代码编译为arm平台的目标代码。

在不加特别说明的情况下,后面的所有交叉编译操作都是使用这个交叉编译器完成。

5月21日,我尝试自己编译一套交叉编译器,但是没有成功。

这部分操作的详情,请看本文末尾。

--------------------------------------------------------------------------------

#3编译Linux内核

5月8日,我下载了linux-2.6.25,下载地址是:

5月8日当天,我根据下列步骤尝试编译了Linux内核:

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

操作很简单的,kernel解压后在Documentation/arm/README可以找到说明:

1.打开顶层的Makefile,找到ARCH,改成ARCH=arm;

下面的CROSS_COMPILE写上编译器的路径,比如

CROSS_COMPILE=/usr/local/arm/bin/arm-unknown-linux-gnu-,

就是gcc可执行文件的绝对路径去掉最后的gcc

2.makeconfig,出现数千个选项,

我找个东西压住键盘上的ENTER键,然后去喝杯茶,几分钟后接受了所有默认选择

3.makezImage,再喝杯茶,几分钟后完毕,

arch/arm/boot/zImage就是成品,1382436字节,压缩前的Image为2777632字节

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

当然,上述编译方法显然不是最优的,再随后的数十、上百次重新编译前,都进行了优化的配置:

$sudoapt-getinstalllibncruses5-dev#下载一个使用menuconfig所必须的组件

$makemenuconfig#这条命令会打开菜单式配置

改了很多地方

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

GlobalSetup

  Localversion=-yoursunny#先给自己做个广告

  swap=N#嵌入式系统是不需要虚拟内存换出的

  initramfs/initrdsupport=Y#根文件系统,一定选上

Enableloadablemodulesupport=Y

Enabletheblocklayer=Y#自动选上并锁定了

  LargeBlockDevices=N#一共才多大,没有超过2TB的块设备

  LargeSingleFiles=N#一共才多大,没有超过2TB的文件

SystemType

  ARMsystemtype=AtmelAT91

  AtmelAT91System-on-chip=AT91RM9200-DK

BusSupport

  PCCard=N#没有SD卡

KernelFeatures#里面全不选

Bootoptions

  Defaultkernelcommandstring#在后面不用U-Boot的情况下,这个非常有用

UserspaceBinaryformats

  ELF=Y

  a.out=Y

Powermanagementoptions

  Powermanagement=N

Networking

  Networking=N#编译SkyEye时已经禁止网络,这里开了也没用

DeviceDrivers#下面没提到的全部关闭

  BlockDevices

    Loopback=Y#个人喜好

    RAMblockdevice=Y#ramdisk,当然要!

  CharacterDevices

    Virtualterminal=Y#自动选上

    SerialDrivers

      AT91on-chipserialport=Y#串口,不选就什么也看不到了

        consoleonAT91serialport=Y

        DMAonAT91serialport=Y

        installasttyATn=Y

  Graphic

    Consoledisplaydriver

      VGAtextconsole=N#VGA是指PC显示器,无需开启,否则编译错误

Filesystems#下面没提到的全部关闭

  Misc

    Minix=Y#我就用了这一种

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

--------------------------------------------------------------------------------

#4编译U-Boot

5月8日,我下载了U-Boot-1.3.2,下载地址是:

最初的编译步骤是

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

打开顶层的Makefile,找到对应arm平台的CROSS_COMPILE,写上编译器的路径

makeat91rm9200dk_config,调用了AT91RM9200开发板的配置

makeall,几分钟后完毕,u-boot.bin或u-boot就是成品,分别为96724字节、324517字节

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

但是,无论使用go命令还是bootm命令都不能正常调用Linux内核,看不见内核的任何输出

5月14日,了解到U-Boot只能识别uImage格式,又使用mkimage工具制作了uImage

../u-boot-1.3.2/tools/mkimage-Aarm-Olinux-Tkernel-Cnone-a20008000-e20008000-nlinux-2.6.25-d./zImageuImage

能够看见uncompressinglinux,但是uncompress完毕后就停止了输出、没反应了

5月15日,我放弃了U-Boot,将内核参数直接编译进内核,直接引导Linux内核。

当时的记录文字(事实上当时已经创建了根文件系统,但是那个根文件系统有问题):

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

我想到,能否不用U-Boot,直接引导Linux呢?

写了个SHELL脚本myimage.sh,创建一个32M的文件准备装载在0x20000000,然后把zImage或Image、initrd写在合适的位置。

[0.000000]Linuxversion2.6.25yoursunny(sunny@hardy)(gccversion3.4.5)#29ThuMay1521:

22:

46CST2008

[0.000000]CPU:

ARM920T[41009200]revision0(ARMvundefined/unknown),cr=00003177

[0.000000]Machine:

AtmelAT91RM9200-DK

内核参数只能在内核的menuconfig里指定,因为没有U-Boot给它传参数了:

[0.007812]Kernelcommandline:

root=/dev/raminitrd=0x20410000,0x00100000rwconsole=ttyS0mem=32Minit=/sbin/init

但是——

[10.007812]Failedtoexecute/sbin/init.Attemptingdefaults...

[10.039062]Kernelpanic-notsyncing:

Noinitfound.Trypassinginit=optiontokernel.

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

--------------------------------------------------------------------------------

#5编译BusyBox

5月8日,我下载了BusyBox-1.9.2,下载地址是:

(实际上是在4月4日下载的,当时1.10.0已出但标注了unstable;今天最新为1.10.2)

当时的编译过程

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

1.打开顶层的Makefile,ARCH=arm、CROSS_COMPILE=编译器的路径

2.makedefconfig,默认配置

3.make,成品busybox,753072字节

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

后来又进行了menuconfig,只留下很少的功能,210.9KB

--------------------------------------------------------------------------------

#6创建根文件系统

/dev/ram、loopback,方法很多,最终目标就是获得一个文件系统映像

由于这个工作一次成功很难,需要重复进行,所以我写了个脚本来完成这个操作:

下面是5月20日版本的initrd.sh:

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

#!

/bin/sh

#scripttocreateinitrdramdiskimage

INITRD_FILE=~/study/IS222/m/initrd

INITRD_SIZE=4M

INITRD_GZ=~/study/IS222/m/initrd.gz

CPIO_FILE=~/study/IS222/m/initrd.cpio

INODE_COUNT=512

MNT_PATH=/mnt

BUSYBOX_PATH=~/study/IS222/busybox-1.9.2

LIB_PATH=/usr/local/arm/arm-unknown-linux-gnu/lib

echo

echoStartcreatinginitrd

#createanyemptyfile

rm$INITRD_FILE

ddif=/dev/zeroof=$INITRD_FILEbs=$INITRD_SIZEcount=1

#createminixfilesystemonthisfile

mkfs.minix-i$INODE_COUNT$INITRD_FILE

#mountasloopbackdisk

sudomount-tminix-oloop$INITRD_FILE$MNT_PATH

#createdevices

cd$MNT_PATH

mkdirdev

sudomknoddev/consolec51

sudomknoddev/kmemc12

sudomknoddev/memc11

sudomknoddev/nullc13

sudomknoddev/ram0b10

sudomknoddev/ramb10

sudomknoddev/ttyAT0c204154

sudomknoddev/zeroc15

ln-s/proc/self/fd/0dev/stdin

ln-s/proc/self/fd/1dev/stdout

ln-s/proc/self/fd/2dev/stderr

#installbusybox

cd$BUSYBOX_PATH

makeCONFIG_PREFIX=$MNT_PATHinstall

#createotherdirectories

cd$MNT_PATH

mkdirmntrootvartmpprocbootetclib

mkdirvar/{lock,log,mail,run,spool}

#create/etc/inittab

touchetc/inittab

echo':

:

sysinit:

/etc/init.d/rcS'>>etc/inittab

#create/etc/init.d/rcS

mkdiretc/init.d

touchetc/init.d/rcS

echo'#!

/bin/sh'>>etc/init.d/rcS

echo'exportPATH=/bin:

/sbin:

/usr/sbin:

/usr/bin'>>etc/init.d/rcS

echo'mount-tprocproc/proc'>>etc/init.d/rcS

echo'echoyoursunnyLinux@ARMproject,2008-05-19'>>etc/init.d/rcS

echo'/bin/sh'>>etc/init.d/rcS

chmod755etc/init.d/rcS

#create/etc/passwd,group,shadow

touchetc/passwd

echo'root:

x:

0:

0:

:

/root:

/bin/sh'>>etc/passwd

chmod644etc/passwd

touchetc/group

echo'root:

x:

0:

root'>>etc/group

chmod644etc/group

touchetc/shadow

echo'root:

:

0:

0:

99999:

7:

:

:

'>>etc/shadow#nopasswordrequired,andpasswordneverexpires

chmod640etc/shadow

#create/etc/busybox.conf

touchetc/busybox.conf

#copylibsrequiredbybusybox`arm-unknown-linux-gnu-readelf-abusybox|grepShared`

cd$MNT_PATH

cp$LIB_PATH/ld-2.3.6.solib/

lnlib/ld-2.3.6.solib/ld-linux.so.2

lnlib/ld-2.3.6.solib/ld-linux.so

lnlib/ld-2.3.6.solib/ld.so

cp$LIB_PATH/libc-2.3.6.solib/

lnlib/libc-2.3.6.solib/libc.so.6

lnlib/libc-2.3.6.solib/libc.so

unlink$MNT_PATH/sbin/init

cp/home/sunny/study/IS222/m/helloworld$MNT_PATH/sbin/init

#chown

sudochownroot:

root-R$MNT_PATH/*

#umount&gzip

cd/

find$MNT_PATH|cpio--quiet-Hnewc-o|gzip-9-n>$CPIO_FILE

sudoumount$MNT_PATH

gzip-c$INITRD_FILE>$INITRD_GZ

#done

echoDonecreatinginitrd

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

使用shell脚本可以极大的提高工作效率。

上述脚本可以一次生成三个格式的根文件系统:

initrd,initrd.gz,cpio(initramfs)

三个格式都是可用的。

其中initrd无需解压,启动速度最快。

有很多资料仅仅提及copyfilesintodevbinsbin...

这些复制操作用BusyBox的安装可以很轻易完成。

特别重要的是这几个文件:

/etc/inittab

/etc/init.d/rcS

BusyBox中登录相关的组件(getty、login)我没有选择,

因为我从未见过手机上弹出“linuxlogin”。

我曾经选择过login,所以在根文件系统还需要创建:

/etc/passwd

/etc/group

/etc/shadow

上述文件,我的脚本里都创建了。

5月15日的initnotfound问题,原因是没有加入lib目录。

如果BusyBox是动态链接的,必须把交叉编译器目录内的.so库文件复制入initrd。

用以下命令可以看出BusyBox可执行文件所依赖的库:

arm-unknown-linux-gnu-readelf-abusybox|grepShared

看到的曾经有libcrypt,后来关闭shadow密码支持后就不再需要。

libc总是需要的,要照原样复制进去、做好符号链接。

5月19日看到,ld这个库也必须加进去,否则程序也是无法执行的。

--------------------------------------------------------------------------------

#7产生“myimage”

5月15日我放弃了U-Boot,而内核与initrd必须位于同一bank;

我使用了一个“myimage”文件,将Image与initrd安排在合适的位置;

myimage是使用下列myimage.sh脚本创建的:

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

#!

/bin/sh

#createaimagetoputat0x20000000

rm./myimage

#0x20000000~0x22000000empty

ddif=/dev/zeroof=./myimagebs=4096count=8192

#0x20008000zImage

cp/sunny/linux-2.6.25/arch/arm/boot/Image./Im

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 工程科技 > 能源化工

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2