Linux与ARM仿真建立.docx
- 文档编号:12255326
- 上传时间:2023-04-17
- 格式:DOCX
- 页数:24
- 大小:31.92KB
Linux与ARM仿真建立.docx
《Linux与ARM仿真建立.docx》由会员分享,可在线阅读,更多相关《Linux与ARM仿真建立.docx(24页珍藏版)》请在冰豆网上搜索。
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
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Linux ARM 仿真 建立