还剩20页未读,继续阅读
本资源只提供10页预览,全部文档请下载后查看!喜欢就下载吧,查找使用更方便
文本内容:
构建嵌入式系统Linux取本实验相关的软件包
1.到ftp下载以下软件包:文件名备注binutils-
2.
16.
1.tar.bz2gcc-
4.
0.
2.tar.bz2glibc-
2.
3.
6.tar.bz2制作交叉编译工具链glibc-linuxthreads-
2.
3.
6.tar.bz2linux-
2.
6.
15.
4.tar.bz2所需的源码包linux-libc-headers一2・
6.
12.
0.tar.bz2制作交叉编译工具链的脚本和补丁行,这样就到达了修改根文件系统中的目的首先确认你的主机上安装了软件包cramfsprogs,然后制作cramfs文件系统映像:然后按照前面的步骤把rootfs.cramfs下载到开发板的ext2分区,运行一下试试
3.3设置开发板的启动方式为NFS Root根本思想是在主机上开NFS效劳器,把主机上的〜/rootfs目录导出为NFS效劳目录,使开发板一启动就自动加载主机的~/「1£$目录为根文件系统,省去了下载和烧写映像的麻烦,在主机上修改根文件系统中的文件立刻在开发板的系统上生效,在开发过程中十分便利首先在主机上安装和配置NFS效劳,确认你的主机安装了nfs-kernel-server软件包然后修改配置文件/etc/exports,添加下面一行注意*号后面紧跟左括号,无空格,每个逗号后面也不能有空格/home/akaedu/rootfs*rw,sync,no rootsquash这表示我们把上一节中通过解压rootfs-basic.tar得到的/home/akaedu/rootfs/目录设置为nfs效劳目录更改配置后需要重启NFS效劳用rpcinfo-p命令看一下portmapper和nfs效劳是否正常启动了,用exportfs命令看一下导出目录的设置是否正确进入开发板的bootloader,修改内核启动参数:AKAE2440#set bootcmdnand read0x30008000kernel0x200000\;myboot0x30008000AKAE2440#setAKAE2440#set bootmodenfsAKAE2440#setbootargs noinitrd console=ttySACO,115200init/linuxrc nfsroot/home/akaedu/rootfsAKAE2440#setAKAE2440#saveAKAE2440#reset真正完整的内核启动命令行参数是noinitrd console二ttySACO,115200init=/linuxrc root=/dev/nfsnfsroot=
192.
168.
2.21:/home/akaedu/rootfsmtdparts=akae2440-nand:IMu-boot,2Mkernel,16Mext2,45Mtempip=
192.
168.
2.100:192,
168.
2.21:192,
168.
2.21:
255.
255.
255.0::eth0:off注意,如果某一项参数很长,而minicom提供的终端却不能自动换行,一行写不下的局部只好盲打了,注意不要打错如果是图形界面的console,可以把字体调小使得一行可以容得下这么长的参数,或者在gedit写字板程序中写好后直接粘贴到console窗口我们推荐采用这种方法,把经常用到的启动参数都集中写好,以后可以选择对应的参数直接粘贴就好了,非常方便关于NFS根文件系统的内核启动参数参考内核源代码的Documentation/nfsroot.txt文档现在可以自己交叉编译一些小程序,然后拷贝到主机的~/rootfs目录,我们可以立刻在开发板上运行该程序,而不需要重新下载和烧写了
3.4配置YAFFS文件系统cramfs是只读文件系统,在Flash上压缩存储,解压并加载到RAM运行由于只读因而功能上很受限制,但可以保护系统文件不被意外的写操作损坏实际产品往往配置两个Flash分区,一个只读分区用于存放系统文件(程序文件和库文件),另一个可写分区,采用JFFS或YAFFS文件系统,用于存放应用程序数据,为了简便起见,我们只分一个区,使用可写的YAFFS文件系统注意,完成这个实验之前先要完成上一节内容,能启动到nfs根文件系统首先用NFS方式启动系统YAFFS文件系统和我们熟悉的ext2不同,不需要格式化,只需要全部擦除就可以用了用根文件系统中的flash_eraseall命令擦除root分区并mount上来以下命令在开发板上执行#flasheraseall/dev/mtd2Erasing16Kibyte@6b8000—10%complete.Skipping badblock at0x006bc000Erasing16Kibyte@3dfc000—99%complete.#mount-t yaffs/dev/mtdblock2/mntyaffs:dev is32505859name is〃mtdblock2〃yaffs:Attempting MTDmount on
31.3,〃mtdblock2〃block432is bad#Is/mntlost+foundflash eraseall命令是从mtd工程()的源代码中交叉编译得来的现在可以把根文件系统中的所有文件拷贝到Flash分区以下命令在开发板上执行#cp-a binetc liblinuxrc optsbin srvtmp usr/mnt/#mkdir-p/mnt/proc/mnt/sys/mnt/dev/mnt/mnt/mnt/var/run#mknod/mnt/dev/console-m600c51#mknod/mnt/dev/null-m666c13#umount mnt#reboot注意像/proc、/sys这样正mount着特殊文件系统的目录和/dev目录下的设备文件一定不可以用cp命令拷贝/mnt目录显然也不能拷贝这些目录和设备文件需要手动创立重启目标系统之后进入U-boot,修改内核启动参数使之从ext2分区启动即可(如果下次还用NFS启动,这里就不save了)AKAE2440#set bootmodenandAKAE2440#set root/dev/mtdblock2AKAE2440#set bootargsnoinitrd rootfstype=yaffs rwconsole=ttySACO,115200AKAE2440#saveAKAE2440#reset现在试试能不能修改Flash根文件系统中的文件将内核释放到〜/linux-
2.
6.27目录下进入内核目录:(本开发板不用修改makefile,打补丁时就会自动修改)首先修改Makefile,找到ARCH=$SUBARCHCROSS_COMPILE二改为ARCH=armCROSS_COMPILE=arm-1inux-注意ARCH=arm后面不能有空格,要确保空格已删除干净,并且不要漏了armTinux-末尾的“-〃下面对内核打patch(注意打patch不要重复打)然后以内核源代码自带的smdk2440根本配置文件为基础,使用menuconfig定制内核(确认你的主机安装了libncurses-dev软件包)~/linux-2・6・27$cp arch/arm/configs/akae2440_defconfig.config Vlinux-
2.
6.27$make menuconfig查看配置菜单中的如下选项(有些已经默认选中)
1、在Floating pointemulation中选择NWFPE mathemulation由于ARM920T没有浮点协处理器,浮点数指令需要用其它指令仿真实现有两种方法可以仿真浮点指令一种方法如先前所说的,使交叉编译器支持soft-float,也就是一遇到C代码里的浮点运算就自动生成仿真指令,另一种方法是交叉编译器仍然生成浮点运算指令(对于ARM平台是指协处理器指令),然而ARM920T没有浮点协处理器,无法识别浮点指令,因而产生undefined异常,这个Floating pointemulation内核选项就是在undefined异常的处理函数中仿真实现浮点运算也就是说,这里我们使用非soft-float的交叉编译器并在内核中实现浮点仿真这样的运行效率比使用soft-float编译要低,因为每次浮点运算都需要处理异常和进入内核,但是兼容性好,便于我们利用别人已编译好的程序
2、选中-Pseudo-/proc support;Sysctl support/proc/sys;sysfs support和Virtual memorysupport formershmfs;Tmpfs POSIXAccess controlLists/proc m或者叫proofs是内核提供应用户程序的接口,很多Linuxo程序都需要在procfs中读写数据,比方busybox,因此这个选项一般是不能少的Virtual memorym或者叫tmpfs用于内存虚拟磁盘,后面我们在做根文件系统时要mount一个tmpfs到/dev目录下
3、不需要改变Boot options-Default kernelcommand string,因为bootloader中的内核启动参数会取代这里的设置
4、选中Device Drivers-Network devicesupport-Ethernet10or100Mbit-CS8900A support,添加对网卡芯片的支持在-Network s菜单中选上NFS clientsupport;NFS clientsupport forNFS version3;NFS clientsupportfor theNFSv3ACL protocolextension和Root onNFS
5、选中Device Drivers-Memory TechnologyDevices MTD-MTD partitioningsupport,在Device Drivers-MemoryTechnology DevicesMTD,选中NAND DeviceSupport和它下面的NAND Flashsupport forS3C2410/S3C2440SoC;S3C2410NAND driverdebug,不要选择S3c2410NAND HardwareECC,因为S3c2410硬件生成ECC码的算法和我们所需要的不一致
6、在-Miscellaneous s中选中YAFFS2support;Auto selectyaffs2format;cache shortnames inRAM,再选上CompressedROM supportcramfs o
7、在Device Drivers-Graphics support中选中Support forframe bufferdevices,再选中它下面的Enable firmwareEDID;Enable videoMode HandlingHelpers;S3C2410LCD framebuffersupport,不选择Virtual FrameBuffer support因为它是一个用于调试的虚拟设备驱动而不是实际硬件的驱动如果还选中了Bootup Logo,那么在内核启动过程中初始化framebuffer时会在屏幕上看到Linux的企鹅logo,这是测试framebuffer驱动是否正常工作最直接的方法Bootup Logo有三种规格,我们的开发板支持VGA输出,可以选择224色的漂亮logOo
8、在Device Drivers-USB support中选中Support forHost-side USB,然后选择OHCI HCDsupport,在Device Drivers-Input devicesupport中选中Mouse interface,设置屏幕分辨率Horizontal screenresolution和Vertical screenresolution为1024和
7689、选中Device Drivers-Real timeclock-Set systemtime fromRTC onstartup andresume;/sys/class/rtc/rtcN sysfs;/proc/driver/rtc procfsfor rtcO;/dev/rtcN characterdevices;Test driver/device.
10、如果不希望在/dev目录下生成大量伪终端设备文件,可以取消选择Device Drivers-Character devices-LegacyBSD PTYsupporto配置完成后用make命令编译内核,这个过程需要较长时间,编译好的内核位于~/linux-
2.
6.27/arch/arm/boot/zlmage现在将自己编译的内核下载到开发板,看系统能不能正常启动o
5.1根文件系统框架和busybox首先用mkdir手动创立如下的根本目录结构:飞tree rootfs/rootfs/|--bin|一dev|一etc——network一lib——mnt一opt——proc一sbin——srv——sys一tmp——usr|--bin|一lib,——sbin——var、——run系统的根本命令,系统关键组件的可执行文件位于/bin和/sbin,其它应用程序/bin/sbin的可执行文件位于/usr/bin和/usr/sbin,bin和sbin的区别在于,bin目录下的/usr/bin可执行文件用于日常操作,例如Is、cp,sbin目录下的可执行文件用于管理操/usr/sbin作,例如ifconfig,执行管理操作通常需要root权限/lib/usr/lib共享库,也是分为系统关键组件的共享库和其它应用程序的共享库J/proc proc文件系统的挂载点/sys sys文件系统的挂载点/dev设备文件/etc配置文件、启动脚本运行时产生的记录文件、锁文件、日志文件」/var/tmp运行时产生的临时文件/mnt一般用作挂载点/opt f存放第一方软件/srv一般用作Web效力、ftp效力的效力目录接下来安装busybox到根文件系统中busybox是专为嵌入式Linux设计的,它把大多数常用命令(如Is、cp tar等等)的常用选项剪裁出来拼在一起在根文件系统中只有一个可执行文件就是/bin/busybox,而其它的命令都创立为/bin/busybox的链接文件,busybox通过命令行第0个参数(也就是命令名)判断应该执行哪个命令这样使得嵌入式Linux系统有完整的命令集却占用很小的存储空间首先从官方网站下载源码包busybox-
1.
9.
1.tar.bz2并解包到主目录下busybox的配置系统和内核源代码很相似,因此配置方法也和内核相似,首先修改Makefile,找到ARCH=$SUBARCHCR0SS_C0MPILE二改为ARCH二armCR0SS_C0MPILE二arm-1inux-然后我们以一个缺省配置为起点来做进一步的配置:Vbusybox-
1.
9.1$make defconfigVbusybox-
1.
9.1$make menuconfig在菜单中做如下配置■选择BusyBox Settings-Installation Options-BusyBox installationprefix,设置为/home/akaedu/rootfs,编译后将安装到这个目录下■根据需要裁剪各命令但是Shells-Choose yourdefault shell选项一定要保存一个默认shell(例如ash),如果没有默认shell,将不会创立/bin/sh这个链接,而一般的shell脚本都是以#!/bin/sh开头的,如果找不到/bin/sh就不能执行然后编译和安装busybox Vbusybox-
1.
9.1$makeVbusybox-
1.
9.1$make installbusybox文件和一系列的链接文件将安装到/home/akaedu/rootfs下busybox文件位于根文件系统的/bin目录,其它链接文件位于/bin、/sbin、/usr/bin、/usr/sbin目录,有一个链接文件linuxrc位于根文件系统的根目录/,它是系统的启动程序,bootloader中内核的启动参数有init=/linuxrc,也就是说内核启动后首先执行/linuxrc(也是busybox的一个符号链接)linuxrc负责完成系统的初始化工作
0.设置信号处理程序
1.初始化console
2.解析/etc/inittab文件
3.执行inittab中类型为wait的程序
4.执行inittab中类型为once的程序上述步骤完成后系统启动完成,此后init程序将循环执行以下步骤
0.执行inittab中类型为respawn的程序,如果所执行的程序终止,则再次执行它
1.如果收到用户请求,则执行inittab中类型为askfirst的程序linuxrc需要读取设备文件/dev/console和/dev/null,我们手动创立这些设备文件飞cd rootfs/dev;sudo mknod-m600console c51;sudo mknod-m666null c13注意,创立设备文件需要root权限,常见设备文件的设备号可以从内核代码的Documentation/devices,txt文件中查到然后创立一个启动配置文件~/rootfs/etc/inittab::respawn:/sbin/getty115200s3c2410_serial0::restart:/sbin/init::shutdown:/bin/umount-a-r启动的过程中首先执行rcS启动脚本,我们创立这个脚本~/rootfs/etc/init.d/rcS#!/bin/shmount-a注意这个脚本需要加可执行权限chmod+x rcSo这个脚本做了一件事情,根据/etc/fstab配置文件提供的信息mount一些文件系统,我们创立这个配置文件~/「001£5/3仇/£51219#mount pointtype optionsdump passproc/proc procdefaults00sys/sys sysfsdefaults00/proc和/sys都是pseudo文件系统,它们并不在磁盘或flash上存储任何数据,虽然看起来/proc和/sys目录下有很多文件,但这些文件都是内核导出的接口,对这些文件进行读写会读写到内核中的一些运行时参数,而不会读写到磁盘/pr℃文件系统是busybox中的许多程序所需要的接口,/sys文件系统则是后面要讲的mdev所需要的接口mount完文件系统后,rcS执行结束下面将执行inittab文件中类型为respawn的命令,也就是/sbin/getty115200s3c2410_serial0我们的PC在启动时执行getty翻开几个虚终端,例如/dev/ttyl~/dev/tty6,嵌入式开发板也是用getty翻开虚终端,这个虚终端对应的是串口,因此需要访问串口的设备文件/dev/s3c2410_serial0,以上命令还指定了波特率为115200现在我们创立这个设备文件~$cd rootfs/dev;sudo mknod-m600s3c2410_serial0c20464这个设备号在内核代码的Documentation/arm/Samsung-S3C24XX/0verview.txt中可以查到,在内核代码中,S3c2410的第一个串口表示为ttySACO,但是后面介绍的mdev程序将使用s3c2410_serial0这个名字,因此这里把文件名指定为s3c2410_serial0o系统启动翻开虚终端后会提示输入用户名和密码然后才启动shell,我们需要创立帐号文件passwd和group~/!0o1£5/61(3々@55\2文件内容为root::0:0:root:/:/bin/shVrootfs/etc/group文件内容为:root::0:这样就创立了一个root帐号,没有密码如果需要密码,可以把主机上的/etc/shadow文件中root帐号的那一行放到开发板的根文件系统中
5.2glibc由于busybox需要glibc共享库的支持,下面的步骤将在根文件系统中安装glibc在此之前首先解释一下应用程序如何找到所需的共享库通过Id命令的参数rpath可以在链接时将共享库的路径记在应用程序中,但是通常不推荐这样做,通常应用程序中只记录共享库的文件名(稍后提到的soname),启动程序时由动态链接器/lib/ld-linux.s根据以下规则查找共享库(摘自ld・so
(8))
0.首先在环境变量LD_LIBRARY_PATII所记录的路径中查找
1.如果上述步骤都找不到,则到默认的系统路径中查找,先是/usr/lib然后是/lib注意,LD_LIBRARY_PATH是不推荐使用的,尽量不要把它设定为环境变量,详细解释参见Why LD_LIBRARY_PATHis bado每个共享库有三个文件名real namesoname linker namereal name是库文件的名字,包含完整的共享库版本号;soname是库文件的一个符号链接的名字,只包含主版本号,主版本号一致即可保证库函数的接口一致,因此应用程序只需确认soname与所需的共享库一致;linkername仅由链接器使用,有的是库文件的一个符号链接的名字,有的是一段链接脚本的名字库文件的文件头记录了soname,因此Idconf ig命令可以读取文件头生成相应的符号链接文件综上,Idconfig命令读取Id.so.conf后做两件事,一是创立适当的soname链接,二是生成Id.so.cache,包含共享库的软件包在安装过程中都会执行一下Idconfig命令下面以libc为例说明共享库的三个文件名/*GNU IdscriptUse theshared library,but somefunctions areonly inthe staticlibrary,so trythat secondarily.*/OUTPUT_FORMATelf32-littlearmGROUPlibc.so.6libc nonshared.a在我们先前制作交叉编译工具链时已经交叉编译了glibc,位于/opt/crosstool/gcc-
4.
0.2-glibc-
2.
3.6/arm-1inux/arm-1inux/lib目录下,我们把这些共享库拷到根文件系统〜/rootfs/lib目录下\$cd/opt/crosstool/gcc-
4.
0.2-glibc-
2.
3.6/arm-linux/arm-linux/lib;cp-dp*/home/akaedu/rootfs/1ib/然后到〜/rootfs/lib目录下删掉所有静态库和一些不常用的库,剩下这些库文件/rootfs/lib$Is ld-
2.
3.libm.so.6libpcpro
6.solibcrypt.so.1libnss_libstdc++.soIdconfig是很常用的一个命令,如果某些程序把共享库安装到非标准目录(/lib和/usr/lib),则需要执行Idconfig更新缓存文件/etc/ld.so.cache,比方后面安装Qtopia Core时就会用到但是busybox不包含Idconfig命令,因为它和glibc密切相关,是随glibc一起发布的,先前我们制作交叉编译工具链时已经生成了Idconfig,现在把它拷到根文件系统现在通过NFS启动开发板,应该可以成功启动到shell了
5.3mdev先前我们在根文件系统的/dev目录下手动创立「三个设备文件console null和s3c2410_serial0,内核里还有很多设备驱动需要通过设备文件提供接口给应用程序访问,如果一个一个手动创立太麻烦而且容易出错,busybox提供的ndev程序可以从sysfs中读出内核提供的设备驱动信息,在/dev目录下自动创立相应的设备文件并为这些设备文1件命名在PC上完成这一功能的是udev,mdev是busybox为嵌入式系统裁剪过的udevo把以下几行附加到启动脚本〜/rootfs/etc/init.d/rcS的末尾:mount-t tmpfsmdev/devmdev-smkdir/dev/inputIn-s/dev/mice/dev/input/micemdev还需要一个配置文件mdev.conf,用于指定各设备文件的所有者和权限,其格式可参考busybox源代码中的docs/mdev.txto我们不做特别的设置,但这个文件是需要存在的,因此创立一个空文件现在重新启动开发板,从minicom可以看到开发板的/dev目录下创立了很多设备文件,而从主机上查看NFS目录〜/rootfs/dev却仍然只有先前的三个设备文件,想一想这是为什么
5.4系统时钟首先将主机上的时区文件拷到开发板根文件系统飞cp/etc/localtime Vrootfs/etc/然后在启动脚本中添加一条命令hwclock--hctosys选项一hctosys的意思是读取硬件RTC时钟he成为当前的系统时钟sys在系统运行期间,调用time2等函数读取的都是内核维护的系统时钟,而不会直接去读硬件时钟,所以,如果用date命令修改了系统时钟#date031915232007Mon Mar1915:23:00CST2007这时关闭系统,时钟信息还是会丧失如果在上述命令后用hwclock命令写到硬件RTC时钟#hwclock--systohe在系统断电期间RTC时钟由电池来维持,下次启动通过hwclock-hctosys仍然可以将系统时钟设定正确
5.5网络配置在bootloader中设置的开发板IP地址仅在bootloader阶段与主机通信时起作用如果是NFS Root方式启动,系统启动后的IP地址是由内核启动参数中的NFS设置决定的,这样系统启动后仍然可以读取主机的NFS导出目录如果是Flash根文件系统启动,则启动之后需要重新配置IP地址和激活网络接口,我们可以把配置写在启动脚本~/rootfs/etc/init,d/rcS中ifup-a并且添加一个配置文件~/「001£5/0伉/血1\¥011/interfaces autoloiface loinet loopback已制作好的交叉编译工具链,需要解包到/opt目录使用内核
2.
6.27针对2440开发板制作的内核patch已编译好的内核,可直接下载到开发板根本根文件系统打包,由于有设备文件,所以解包需要root权限zImage采用cramfs文件系统格式的根本根文件系统映像,可直接下载到开发板busybox源码包,嵌入式根文件系统根本命令集sqlite源码包,嵌入式数据库libcgi源码包,用于编写CGI程序的C函数库Qtopia Core源码包,Qt的嵌入式版本交叉编译工具链
2.要做嵌入式Linux开发,首先需要有交叉编译工具链cross compilingtoolchain,也就是在主机x86PC上可编译生成目标板可执行文件ARM指令的编译工具和普通的编译工具链一样,交叉编译工具链也包括编译、链接、修改目标文件的各种程序,如gcc、glibc、Id、gas、objdump.readelf等等交叉编译工具链本身也是需要编译生成的,要得到一套完整的交叉编译工具链需要编译以下源码包■binutils■gcc■glibc■linux内核■1inux-1ibc-headers■glibc-linuxthreads这些源码包具有非常强的版本依赖关系,如果源码包的版本不匹配,在编译过程中会出现各种各样的问题,有些问题需要对源码做些修改或者打补丁,有些问题则是没有解决方法的,只能更换匹配较好的版本编译的步骤也是比较复杂的,主要有以下几步
0.根据目标平台配置内核源代码,生成内核头文件
1.编译binutilsauto ethOiface ethOinet staticifup命令根据配置文件激活网络接口lo(loopback设备)和ethO(以太网接口)
5.6httpdbusybox自带了一个Web效劳器程序httpd,我们在启动脚本~/1001£5/8/111五.d/rcS中添加如下一行httpd-h/srv/www这样httpd在启动时以daemon方式运行,使用默认的80端口(使用-p选项可以自己指定端口)效劳目录是/srv/www,如果浏览器请求/srv/n目录下的可执行文件,则被httpd当作CGI程序执行我们在根文件系统中创立效劳目录飞mkdir-p rootfs/srv/现在启动开发板系统,试验以下功能
0.编辑一个index,html放在~/rootfs/srv/www下,从主机上翻开浏览器,输入开发板的IP地址看能否浏览
1.编辑一个shell脚本,加可执行权限,放在~/rootfs/srv/n下,从主机翻开浏览器,输入该脚本的地址(例如)看能否得到执行结果脚本如下所示#!/bin/sh echoContent-Type:text/plain〃echo Is-a最终我们的启动脚本~/rootfs/etc/init.d/rcS是这样的#!/bin/sh mount-a mount-t tmpfsmdev/dev mdev-s mkdir/dev/input In-s/dev/mice/dev/input/mice hwclock一一hctosys ifup-a httpd-h/srv/wwwBuilding EmbeddedLinux Systemsby KarimYaghmour,OReilly出版
2.编译器的自举(bootstrap),也就是先编译出gcc的局部功能(没有glibc支持,只有C编译器没有C++编译器)
3.编译glibc
4.编译完整的gcc首先从stool下载crosstool-
0.
43.tar.gz,在主目录下解包现在选择一种源码包的版本组合,各种版本组合的兼容性可以参考,在此我们选择在arm平台上glibc版本较高,兼容性较好的一个组合■gcc-
4.
0.2■cgcc-
4.
0.2■glibc-
2.
3.6■binutils-
2.
16.1■linux-
2.
6.
15.4■hdrs-
2.
6.
12.0修改crosstool-
0.43目录下的脚本demo-arm.sh,取消这一行开头的#号注释符tteval catarm.dat gcc-
4.
0.2-glibc-
2.
3.
6.dat shall.sh一一notest同时将原本没有注释的这一行注释掉(前面加#号)eval catarm.dat gcc-
4.
1.0-glibc-
2.
3.2-tls.dat shall.sh一一notest注意该脚本开头有TARBALLS_DIR=$H0ME/down1oadsRESULT_TOP=/opt/crosstool这说明,该脚本运行时,自动从和下载相关的源码包到主目录的downloads目录下,如果你已经下载过这些源码包,将它们拷到downloads目录下就可以不必再次下载了对应于我们选择的版本组合,downloads目录下的源码包有■binutils-
2.
16.
1.tar.bz2■gcc-
4.
0.
2.tar.bz2■glibc-
2.
3.
6.tar.bz2■glibc-linuxthreads-
2.
3.
6.tar.bz2■linux-
2.
6.
15.
4.tar.bz2■1inux-1ibc-headers-
2.
6.
12.
0.tar.bz2整个编译结束后,交叉编译工具链将放在/
⑥1/廿55W1目录下,因此脚本需要在/Opt下建子目录,如果不希望使用root权限运行该脚本,则需要事先给/opt目录设置写权限sudo chmoda+w/opt然后修改arm.dat,其中有TARGET=arm-unknown-linux-gnu这是按标准的命名规则为工具链命名的,但是通常我们都采用更简单的命名,很多软件的Makefile中交叉编译器默认也都采用简单的命名,为此我们把它改为TARGET-arm-linuxo由于编译过程需要用到patch、bison、flex,确认你的系统中安装了这些软件包在编译过程中可能还会遇到脚本的兼容性问题,如果你的Linux发行版将sh指向dash(例如Ubuntu),应将其改指向bash$cd/bin$sudo In-sf bashsh虽然用dash执行脚本时非常高效并且其实现完全遵守POSIX标准,然而现存的很多脚本(比方glibc中的脚本)有不符合POSIX标准的用法,所以仍需改用bash执行准备就绪后,在crosstool-
0.43目录下运行demo-arm.sh脚本开始编译编译完成后,交叉编译工具链的可执行文件位于/opt/crosstool/gcc-
4.
0.2-glibc-
2.
3.6/arm-linux/bin目录,我们可以把这个路径添加到PATH环境变量中,例如将以下命令添加到〜/.bashrc启动脚本此外,网上也可下载到已编译好的交叉编译工具链,比方,但是使用别人编译好的交叉编译工具链有很多限制,不能按自己的特殊需要对其定制,比方有些工程需要特定版本的gcc和glibc,再比方需要soft-float的编译器(生成指令模拟浮点数运算)以上编译步骤需要很长时间,也可以直接从ftp下载已制作好的交叉编译工具链安装到主机:~$sudo chmoda+w/opt,$tar xfcrosstool.tar.bz2-C/opt然后在〜/.bashrc启动脚本中修改PATH环境变量
3.1U-boot的根本使用方法连接好开发板的网线和串口线,启动minicom(配置成1152008N1,无Flow Control)按下开发板电源,立刻按除回车以外的任意键,进入bootloader提示符AKAE2440#如果没来及按键就已经启动了内核,可以按开发板上的RESET键重来注意u-boot的终端不能处理控制字符,不要用移动光标键或翻页键等,退格键可以用按了产生控制字符的键再输入命令就会产生错乱,这时可以按下回车输入当前这条已经错乱的命令,然后在新的提示符下重新键入命令输入printenv命令显示bootloader的参数更改参数使用命令set或者setenv,如下列图所示:BEID/dev/ttySO-PuITY NAND64MiBUSB:S3C2410USB DevicedIn:serialOut:serialErr:serialAKAE2440#setenv ipaddr
192.
168.
1.22AKAE2440#setenv netmask
255.
255.
255.0AKAE2440#setenv serverip
192.
168.
1.21AKAE2440#saveenvSaving Environmentto NAND...Erasing Nand...Writing toNand...doneAKAE2440#printenv bootargs=root=ramfs console=ttySAC0,115200bootdelay=10baudrate=l15200ethaddr=00:0c:20:02:0a:5b usbtty=cdc_acmtest=aaaa・・ipaddr=
192168.122netmask=
255.
255.
255.0serverip=192♦
168.
1.21Environment size:187/131067bytesAKAE2440#|上图中,setenv ipaddr
192.
168.
1.22表示设置开发板的IP地址为
192.
168.
1.22setenv netmask
255.
255.
255.0表示设置子网掩码为
255.
255.
255.0setenv serverip
192.
168.
1.21表示设置与开发板相连的PC机IP是
192.
168.
1.21可以根据你的情况重新设置为了统一起见,在后面的实验中,我们统一设置为AKAE2440#set serverip
192.
168.
2.21(这一项应该和你的主机IP一致)AKAE2440#set gateway
192.
168.
2.21(网关ip设置成什么无所谓,一般都设为主机ip)AKAE2440#savesave将这些设定写入flash中,下次开发板上电时仍然有效如果不save则仅改变内存中的参数值,reset后会恢复flash中原来的参数值设置完成后在开发板上ping主机的ip地址,检查网络是否正常,如下所示host
192.
168.
2.21is alive这表示主机能ping通,网络正常如果显示如下ping failed;host
192.
168.
2.21is notalive.这就表示主机不能ping通,网络异常,需要检查你的网络还有一些常见的参数AKAE2440#set bootdelay3Bootdelay设为3,表示开发板上电后等待3秒再启动,这3秒时间内按任意键会进入u-boot命令行状态,如下列图所小AKAE2440#set bootdelay3AKAE2440#saveXKAE244Saving Environmentto NAND...窿耻0Erasing redundant Nand...V/riting toredundantNand...done244®#AKAE2440AKAE2440#AKAE244®Moaaq a____________________________________________________________AKAE2440另外,还有:AKAE2440#set bootmodenfs或者AKAE2440#set bootmodenandBootmode可以设为nfs或者nand两者之一,这个参数说明了u-boot启动时,根文件系统在哪里寻找,如果是nand表示根文件系统保存在开发板本身的flash某个分区中,要到flash上去找;如果是nfs则表示u-boot要去你的PC机的nfs效劳的目录(PC机硬盘上)去找在开发板bootloader输入以下命令查看64M flash是如何分区的AKAE2440#mtdparts#:name sizeoffset mask_flags0:u-boot0x001000000x0002000001:kernel0x002000000x0010000002:ext20x010000000x0030000003:temp0x02d000000x013000000Device nandOakae2440-nand.#parts=4u-boot分区保存bootloader程序,Linux内核保存在kernel分区,根文件系统会保存到ext2分区,temp分区本实验中没有用到如果mtdparts命令未显示上述图样,可能是flash未作分区操作,可以使用mtdparts default命令来创立上述那样的默认分区如下列图所示AKAE2440#mtdparts defaultAKAE2440#mtdpartsdevice nandOakae2440-nand,#parts=4#:name sizeoffset maskflags0:u-boot0X001000000X0000000001:kernel0x002000000X0010000002:ext20X010000000x0030000003:temp0x02dO00000x013000000active partition:nandO,0-u-boot0X00100000@0X00000000defaultsmtdids:nand0=akae2440-nand mtdpartsmtdparts=akae2440-nand:0x00100000u-boot0x00200000kernel0x01000000ext2-tempr rrAKAE2440#|CTRL-A Zfor help|1152008N1|NOR|Minicom
2.3-rc|VT102|Offline如果要保存新的分区表,使用命令save保存到flash中,否则reset后将恢复flash中原来的分区表下载文件到开发板内存中,需要通过tftp协议开发板是tftp客户端,主机是tftp效劳器在配置好主机的tftp效劳之后,主机上会有一个tftp效劳的主目录/tt,我们把要下载到开发板上的文件都先拷贝到这个目录中,之后才能下载tftp命令的格式为tftp〈内存地址〉文件名注意我们都是把内核zlmage文件下载到0x30008000地址上,把根文件系统img文件下载到0x30800000地址上当我们用命令t zlmage把内核zlmage下载到内存地址0x30008000上之后,先使用nand erasekernel命令擦除掉flash的kernel分区上的数据(否则在读出flash数据时会报失败),然后可以用nand write0x30008000kernel0x200000命令把内存中的内核文件烧写到flash的对应kernel分区中去,如下列图所示AKAE2440#AKAE244®#AKAE2440#AKAE244®#tftp0x30008000zlmageFFTP fromserver
192.
168.
2.21;our IPaddress is
192.
168.
2.100Filename•zlmage
1.Load address0x30008000Loading:#################################################################doneBytes transferred=1463812165604hexAKAE244®#nand erasekernelHAND erase:device0offset0x100000,size0x200000Erasing at0x2fc000--100%complete.OK4KAE244®#nand write0x30008000kernel0x200000MAND writedevice0offset0x100000,size0x2000002097152bytes writtenOK#|AKAE244CTRL-A Zfor help|1152008N1|NOR|Minicom
2.3-rc|VT102|Offline同理,当我们用命令tftp0x30800000rootfs.cramfs把根文件系统rootfs.cramfs映像文件下载到内存地址0x30800000上之后,用nand write0x30800000ext20x1000000命令把它烧写到flash的ext2分区中去,当然,在烧写之前也要先使用nand eraseext2擦除掉f lash的ext2分区,否则烧写后读出数据会失败°如下列图所示AKAE2440#AKAE2440#AKAE2440#tftp0x30800000rootfs.cramfsTFTP fromserver
192.
168.
2.21;our IPaddress is
192.
168.
2.100Filename rootfs.cramfs
1.Load address:0x30800000Loading:#################################################################doneBytes transferred=38707203bl000hexAKAE2440#nand eraseext2NAND erasedevice0offset0x300000,size0x1000000Erasing at0xl2fc000--100%complete.OKAKAE2440#nand write0x30800000ext20x1000000NAND writedevice0offset0x300000,size0x100000016777216bytes writtenOK注意如果发现tftp效劳配置是正确的,但是有些文件不能够下载,则很有可能是文件权限的问题可以使用sudo chmod777zlmage rootfs.cramfs这样的命令来更改文件访问权限现在,内核和cramfs根文件系统都烧写到flash上去了,只要设置好正确的内核启动参数就可以启动开发板了AKAE2440#set bootcmdnand read0x30008000kernel0x200000\;myboot0x30008000AKAE2440#setAKAE2440#set bootmodenandbootargs noinitrdconsole=ttySAC0,115200AKAE2440#set init/linuxrcAKAE2440#set root/dev/mtdblock2AKAE2440savebootcmd参数表不u-boot上电后会自动执行的命令,第一条nand read0x30008000kernel0x200000表不从flash上kernel分区去读取Linux内核到开发板内存地址0x30008000处,大小为0x200000字节;第二条命令是myboot0x30008000表示跳转到地址0x30008000去启动Linux内核这两条命令要用分号“;〃隔开,但是设置bootcmd参数时设置给它的是一个字符串,所以分号要用转义字符“\;〃代替bootargs就是我们常说的Linux内核的启动命令行参数Linux_cmd_line oU-boot通过这个参数告知内核一些关键的启动参数实际上,在Uboot中,最后的完整的启动命令行参数是由前面设置那些一个一个的小项组合而成的真正完整的命令行参数是noinitrdconsole=ttySAC0,115200init=/linuxrc cs89x0media=rJ45root=/dev/mtdblock2mtdparts=akae2440-nand:IMu-boot,2Mkernel,16Mext2,45Mtempip=
192.
168.
2.100:
192.
168.
2.21:192,
168.
2.21:
255.
255.
255.0::eth0:off noinitrd表示内核启动时不需要初始化一个内存磁盘ramdisk;而root=/dev/mtdblock2表示根文件系统在flash的编号为2的分区上从0开始编号的,所以是第三个分区,回忆前面的u-boot的分区信息,flash上分区依次是u-boot,kernel,ext2,temp,我们的根文件系统就在第三个分区ext2上;console=ttySACO,115200表示翻开一个串行终端ttySACO,它是通过串口1工作的,波特率为115200;init=/linuxrc表示内核启动好后第一个执行的应用程序是/linuxrc,根目录下的linuxrc;mtdparts=akae2440-nand:IMu-boot,2Mkernel,16Mext2,45Mtenip表示u-boot传递给内核的分区信息我们在选择使用nfs根文件系统还是cramfs根文件系统的时候,bootargs bootcmd和init参数根本都一样,不用改变,需要改变的是bootmode参数,由bootmode参数的设置决定去选择root参数描述cramfs根文件系统所在位置还是nfsroot参数描述nfs根文件系统所在位置,即bootmode为nand时选择root参数,bootmode为nfs时选择nfsroot参数在启动进入到Linux系统后,可以通过在命令行终端键入如下命令来查看命令行参数Scat/proc/cmdline现在启动AKAE2440#reset这时屏幕上出现很多内核启动信息,之后提示登录,输入root即可登录none login:root现在可以试试各种Linux根本命令注意cramfs是只读文件系统,在开发板上运行时不能改动里面的文件有些时候我们可能会尝试配置不同的内核选项,会得到不同的几个内核zlmage文件,这样都烧写到flash上再reset启动太浪费时间,可以用tftp把内核zlmage加载到内存0x30008000地址上,不烧写,直接用myboot0x30008000去启动内存上的内核如下列图示AKAE2440#AKAE2440#tftp0x30008000myzlmageTFTP fromserver
192.
168.
2.21;our IPaddress is
192.
168.
2.100Filename1myzlmage
1.商ad address:0x30008000Loading#################################################################doneBytes transferred=148382816a434hexAKAE2440#myboot Ox3GOO8O00|CTRL-A Zfor help|1152008N1|NOR|Minicom
2.3-rc|VT102|Offline
3.2将自己定制的根文件系统下载到开发板运行“根文件系统〃是一种不严格的说法,其实是指文件系统中的文件和目录,这些文件和目录构成了一个Linux系统运行所需的根本框架ftp上的rootfs-basic,tar是根文件系统的打包,由于包含设备文件,需要root权限才能解包解包后可以根据自己的需要修改其中的目录和文件,然后将根文件系统目录制作成cramfs映像再下到开发板运。
个人认证
优秀文档
获得点赞 0