还剩20页未读,继续阅读
本资源只提供10页预览,全部文档请下载后查看!喜欢就下载吧,查找使用更方便
文本内容:
构建嵌入式LINUX开发环境构建嵌入式Linux系统
1.取本实验有关的软件包到ftp下载下列软件包:文件名备注binutils-
2.
16.
1.tar.bz2gcc_
4.
0.
2.tar.bz2glibc-
2.
3.
6.tar.bz2glibc-1inuxthreads-
2.
3.
6.tar.bz2linux-
2.
6.
15.
4.tar.bz21inux-1ibc-headers-
2.
6.
12.
0.tar.bz2制作交叉编译工具链所需的源码包crosstool-
0.
43.tar.gzcrosstool.tar.bz2linux-
2.
6.
27.tar.bz2patch-
2.
6.27-akazImagerootfs-basic.tarrootfs-basic.cramfs制作交叉编译工具链的脚本与补丁己制作好的交叉编译工具链,需要解包到/opt目录使用内核
2.
6.27针对2440开发板制作的内核patch已编译好的内核,可直接下载到开发板基本根文件系统打包,由于有设备文件,因此解包需要root权限使用cramfs文件系统格式的基本根文件系统映像,可直接下AKAE2440#AKAE2440#tftp0x30008000myzlmageTFTPfromserver
192.
168.
2.21;ourIPaddressis
192.
168.
2.100Filename•myzlmage*.Loadaddress:0x30008000Loading:##################################################################################################################################################################################################################################################################################################doneBytestransferred=148382816a434hexAKAE2440#mybootOx36OO86O0|CTRL-AZforhelp|1152008N1|NOR|Minicom
2.3-rc|VT102|Offline将自己定制的根文件系统下载到开发板运行“根文件系统”是一种不严格的说法,事实上是指文件系统中的文件与目录,这些文件与目录构成了一个Linux系统运行所需的基本框架ftp上的rootfs-basic.tar是根文件系统的打包,由于包含设备文件,需要root权限才能解包~$sudotarxfrootfs-basic.tar解包后能够根据自己的需要修改其中的目录与文件,然后将根文件系统目录制作成cramfs映像再下到开发板运行,这样就达到了修改根文件系统中的目的首先确认你的主机上安装了软件包cramfsprogs然后制作cramfs文件系统映像~$mkcramfs〜/rootfsrootfs.cramfs然后按照前面的步骤把rootfs.cramfs下载到开发板的ext2分区,运行一下试试设置开发板的启动方式为NFSRoot基本思想是在主机上开NFS服务器,把主机上的〜/rootfs目录导出为NFS服务目录,使开发板一启动就自动加载主机的〜/rootfs目录为根文件系统,省去了下载与烧写映像的烦恼,在主机上修改根文件系统中的文件立刻在开发板的系统上生效,在开发过程中十分便利首先在主机上安装与配置NFS服务,确认你的主机安装了nfs-kernel-server软件包然后修改配置文件/etc/exports添加下面一行注意*号后面紧跟左括号,无空格,每个逗号后面也不能有空格/home/akaedu/rootfs^rwsyncno_root_squash这表示我们把上一节中通过解压rootfs-basic.tar得到的/home/akaedu/rootfs/目录设置为nfs服务目录更换配置后需要重启NFS服务~$sudo/etc/init.d/nfs-kernel-serverrestart用rpcinfo-p命令看一下portmapper与nfs服务是否正常启动了,用exportfs命令看下导出目录的设置是否正确进入开发板的bootloader修改内核启动参数:AKAE2440#setbootcmdnandread0x30008000kernel0x200000\;myboot0x30008000bootargsnoinitrdconsole=ttySACOl15200init/linuxrcnfsroot/home/akaedu/rootfsbootmodenfs真正完整的内核启动命令行参数是:noinitrdconsole=ttySACO115200init=/linuxrcroot=/dev/nfsnfsroot=
192.
168.
2.21:/home/akaedu/rootfsmtdparts=akae2440-nand:IMu-boot2Mkernel16Mext245Mtempip=
192.
168.
2.100:
192.
168.
2.21:
192.
168.
2.21:
255.
255.
255.0::ethO: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上来下列命令在开发板上执行flash_eraseall/dev/mtd2Erasing16Kibyte@6b8000—10%complete.Skippingbadblockat0x006bc000Erasing16Kibyte@3dfc000—99%complete.mount-tyaffs/dev/mtdblock2/mntyaffs:devis32505859nameisnmtdblock2nyaffs:AttemptingMTDmounton
31.3nmtdblock2Hblock432isbadIs/mntlost+found现在能够把根文件系统中的所有文件拷贝到Flash分区下列命令在开发板上执行cp-abinetcliblinuxrcoptsbinsrvtmpusr/mnt/mkdir-p/mnt/proc/mnt/sys/mnt/dev/mnt/mnt/mnt/var/runmknod/mnt/dev/console-m600c51mknod/mnt/dev/null-m666c13amountmntreboot注意像/proc、/sys这样正mount着特殊文件系统的目录与/dev目录下的设备文件一定不能够用cp命令拷贝/nmt目录显然也不能拷贝这些目录与设备文件需要手动创建重启目标系统之后进入U-boot修改内核启动参数使之从ext2分区启动即可(假如下次还用NFS启动,这里就不save了)AKAE2440#setbootmodenandAKAE2440#setroot/dev/mtdblock2AKAE2440#setbootargsnoinitrdrootfstype=yaffsrwconsole=ttySACO115200AKAE2440#saveAKAE2440#reset现在试试能不能修改Flash根文件系统中的文件
4.编译内核将内核释放到~/linux-
2.
6.27目录下~$tarxflinux-
2.
6.
27.tar.bz2进入内核目录~$cdlinux-
2.
6.27(本开发板不用修改makefile打补丁时就会自动修改)首先修改Makefile找到ARCH=$(SUBARCH)CROSS_COMPILE二改为ARCH=armCROSS_COMPILE=arm-linux-注意ARCH后面不能有空格,要确保空格已删除干净,同时不要漏了armTinux-末尾的下面对内核打patch(注意打patch不要重复打)〜/linux-2・6・27$patch-pl../patch-
2.
6.27-aka然后以内核源代码自带的smdk2440基本配置文件为基础,使用menuconfig定制内核(确认你的主机安装了libncurses-dev软件包)〜/linux-
2.6・27$cparch/arm/configs/akae2440_defconfig.config〜/linux-
2.
6.27$makemenuconfig查看配置菜单中的如下选项(有些已经默认选中)
1、在Floatingpointemulation中选择NWFPEmathemulation由于ARM920T没有浮点协处理器,浮点数指令需要用其它指令仿真实现有两种方法能够仿真浮点指令一种方法如先前所说的,使交叉编译器支持soft-float也就是一遇到C代码里的浮点运算就自动生成仿真指令,另一种方法是交叉编译器仍然生成浮点运算指令(关于ARM平台是指协处理器指令)然而ARM920T没有浮点协处理器,无法识别浮点指令,因而产生undefined特殊,这个Floatingpointemulation内核选项就是在undefined特殊的处理函数中仿真实现浮点运算也就是说,这里我们使用非soft-float的交叉编译器并在内核中实现浮点仿真这样的运行效率比使用soft-float编译要低,由于每次浮点运算都需要处理特殊与进入内核,但是兼容性好,便于我们利用别人已编译好的程序
2、选中Filesystems-Pseudofilesystems-/procfilesystemsupport;Sysctlsupport(/proc/sys);sysfsfilesystemsupport与Virtualmemoryfilesystemsupport(formershmfs);TmpfsPOS1XAccesscontrolListso/procfilesystem(或者者叫procfs)是内核提供给用户程序的接口,很多Linux程序都需要在procfs中读写数据,比如busybox因此这个选项通常是不能少的Virtualmemoryfilesystem(或者者叫tmpfs)用于内存虚拟磁盘,后面我们在做根文件系统时要mount一个tmpfs到/dev目录下
3、不需要改变Bootoptions-Defaultkernelcommandstring由于bootloader中的内核启动参数会取代这里的设置
4、选中DeviceDrivers-Networkdevicesupport-Ethernet10or100Mbit-CS8900Asupport添加对网卡芯片的支持在Filesystems-NetworkFileSystems菜单中选上NFSclientsupport;NFSclientsupportforNFSversions;NFSclientsupportfortheNFSv3ACLprotocolextension与RootfilesystemonNFS
5、选中DeviceDrivers-MemoryTechnologyDevicesMTD-MTDpartitioningsupport在DeviceDrivers-MemoryTechnologyDevicesMTD选中NANDDeviceSupport与它下面的NANDFlashsupportforS3C2410/S3C2440SoC;S3C2410NANDdriverdebug不要选择S3c2410NANDHardwareECC由于S3c2410硬件生成ECC码的算法与我们所需要的不一致
6、在Filesystems-Miscellaneousfilesystems中选中YAFFS2filesystemsupport;Autoselectyaffs2format;cacheshortnamesinRAM再选上CompressedROMfilesystemsupportcramfso
7、在DeviceDrivers-Graphicssupport中选中Supportforframebufferdevices再选中它下面的EnablefirmwareEDID;EnablevideoModeHandlingHelpers;S3C2410LCDframebuffersupport不选择VirtualFrameBuffersupport由于它是一个用于调试的虚拟设备驱动而不是实际硬件的驱动假如还选中了BootupLog,那么在内核启动过程中初始化framebuffer时会在屏幕上看到Linux的企鹅logo这是测试framebuffer驱动是否正常工作最直接的方法BootupLogo有三种规格,我们的开发板支持VGA输出,能够选择224色的漂亮logo
8、在DeviceDrivers-USBsupport中选中SupportforHost-sideUSB然后选择01ICIHCDsupport在DeviceDrivers-Inputdevicesupport中选中Mouseinterface设置屏幕分辨率HorizontalscreenresolutionVerticalscreenresolution为1024与768o
9、选中DeviceDrivers-Realtimeclock-SetsystemtimefromRTConstartupandresume;/sys/class/rtc/rtcNsysfs;/proc/driver/rtcproofsforrtcO;/dev/rtcNcharacterdevices;Testdriver/device.
10、假如不希望在/dev目录下生成大量伪终端设备文件,能够取消选择DeviceDrivers-Characterdevices-LegacyBSDPTYsupporto配置完成后用make命令编译内核,这个过程需要较长时间,编译好的内核位于Vlinux-
2.
6.27/arch/arm/boot/zImageo现在将自己编译的内核下载到开发板,看系统能不能正常启动
5.制作根文件系统
5.1根文件系统框架与busybox首先用mkdir手动创建如下的基本目录结构:etc|--init.d\--network一if-down.d一一if-post-down.d一if-pre-up.d、一if-up.d——lib-mnt——opt——proc——sbinsrv——sys——tmpusrbinlibsbinvarrun接下来安装busybox到根文件系统中busybox是专为嵌入式Linux设计的,它把大多数常用命令(如Is、cp、tar等等)的常用选项剪裁出来拼在一起在根文件系统中只有一个可执行文件就是/bin/busybox而其它的命令都创建为/bin/busybox的链接文件,busybox通过命令行第0个参数(也就是命令名)推断应该执行哪个命令这样使得嵌入式Linux系统有完整的命令集却占用很小的存储空间~$tarxfbusybox-
1.
9.
1.tar.bz2;cdbusybox-
1.
9.1/busybox的配置系统与内核源代码很相似,因此配置方法也与内核相似,首先修改Makefile找到ARCH=$SUBARCHCROSS_COMPILE=改为ARCH=armCROSS_COMPILE=arm-linux-然后我们以一个缺省配置为起点来做进一步的配置:〜/busybox-
1.
9.1$makedefconfig〜/busybox-1・9・1$makemenuconfig在菜单中做如下配置选择BusyBoxSettings-InstallationOptions-BusyBoxinstallationprefix设置为/home/akaedu/rootfs编译后将安装到这个目录下根据需要裁剪各命令但是Shells-Chooseyourdefaultshell选项一定要保留一个默认shell(比如ash)假如没有默认shell将不可能创建/bin/sh这个链接,而通常的shell脚本都是以用/bin/sh开头的,假如找不到/bin/sh就不能执行然后编译与安装busybox〜/busybox-1・
9.1$make〜/busybox-
1.
9.1$makeinstallbusybox文件与一系列的链接文件将安装到/home/akaedu/rootfs下busybox文件位于根文件系统的/bin目录,其它链接文件位于/bin、/sbin/usr/bin、/usr/sbin目录,有一个链接文件linuxrc位于根文件系统的根目录/,它是系统的启动程序,bootloader中内核的启动参数有init=/linuxrc也就是说内核启动后首先执行/linuxrc(也是busybox的一个符号链接)linuxrc负责完成系统的初始化工作
0.设置信号处理程序.初始化console.解析/etc/inittab文件.执行系统初始化脚本,缺省的是/etc/init.d/rcS.执行inittab中类型为wait的程序.执行inittab中类型为once的程序上述步骤完成后系统启动完成,此后init程序将循环执行下列步骤:
0.执行inittab中类型为respawn的程序,假如所执行的程序终止,则再次执行它
1.假如收到用户请求,则执行inittab中类型为askfirst的程序linuxrc需要读取设备文件/dev/console与/dev/null我们手动创建这些设备文件~$cdrootfs/dev;sudomknod-m600consolec51;sudomknod-m666nullc13注意,创建设备文件需要root权限,常见设备文件的设备号能够从内核代码的Documentation/devices.txt文件中查到然后创建一个启动配置文件〜/rootfs/etc/inittab::sysinit:/etc/init.d/rcS::respawn:/sbin/getty115200s3c2410_serial0::restart:/sbin/init::shutdown:/bin/umount-a-r启动的过程中首先执行rcS启动脚本,我们创建这个脚本〜/rootfs/etc/init.d/rcS#!/bin/shmount-a注意这个脚本需要加可执行权限chmod+xrcSo这个脚本做了一件情况,根据/etc/fstab配置文件提供的信息mount一些文件系统,我们创建这个配置文件〜/rootfs/etc/fstab#filenamemountpointtypeoptionsdumppassproc/procprocdefaults00sys/syssysfsdefaults00/proc与/sys都是pseudo文件系统,它们并不在磁盘或者flash上存储任何数据,尽管看起来/proc与/sys目录下有很多文件,但这些文件都是内核导出的接口,对这些文件进行读写会读写到内核中的一些运行时参数,而不可能读写到磁盘/proc文件系统是busybox中的许多程序所需要的接口,/sys文件系统则是后面要讲的mdev所需要的接口mount完文件系统后,rcS执行结束下面将执行inittab文件中类型为respawn的命令,也就是/sbin/getty115200s3c2410_serial0我们的PC在启动时执行getty打开几个虚终端,比如/dev/ttyl〜/dev/tty6嵌入式开发板也是用getty打开虚终端,这个虚终端对应的是串口,因此需要访问串口的设备文件/dev/s3c2410_serial0以上命令还指定了波特率为115200现在我们创建这个设备文件~$cdrootfs/dev;sudomknod-m600s3c2410_serial0c20464这个设备号在内核代码的Documentation/arm/Samsung-S3C24XX/Overview.txt中能够查到,在内核代码中,S3c2410的第一个串口表示为ttySACO但是后面介绍的mdev程序将使用s3c2410_seria10这个名字,因此这里把文件名指定为s3c2410_serial0o系统启动打开虚终端后会提示输入用户名与密码然后才启动shell我们需要创建帐号文件passwd与groupo^/rootfs/etc/passwd文件内容为root::0:0:root:/:/bin/sh/rootfs/etc/group文件内容为:root::0:这样就创建了一个root帐号,没有密码假如需要密码,能够把主机上的/etc/shadow文件中root帐号的那一行放到开发板的根文件系统中
5.2glibc由于busybox需要glibc共享库的支持,下面的步骤将在根文件系统中安装glibc在此之前首先解释一下应用程序如何找到所需的共享库通过Id命令的参数rpath能够在链接时将共享库的路径记在应用程序中,但是通常不推荐这样做,通常应用程序中只记录共享库的文件名(稍后提到的soname)启动程序时由动态链接器/lib/ld-linux.so根据下列规则查找共享库(摘自Id.so
(8))
0.首先在环境变量LD_LIBRARY_PATH所记录的路径中查找.然后从缓存文件/etc/ld.so.cache中查找将共享库的路径写进/etc/ld.so.conf然后执行Idconfig命令就能够生成缓存文件/etc/ld.so.cache.假如上述步骤都找不到,则到默认的系统路径中查找,先是/usr/lib然后是/lib每个共享库有三个文件名realnamesonamelinkernamerealname是库文件的名字,包含完整的共享库版本号;soname是库文件的一个符号链接的名字,只包含主版本号,主版本号一致即可保证库函数的接口一致,因此应用程序只需确认soname与所需的共享库一致;linkername仅由链接器使用,有的是库文件的一个符号链接的名字,有的是一段链接脚本的名字库文件的文件头记录了soname因此Idconfig命令能够读取文件头生成相应的符号链接文件综上,Idconfig命令读取Id.so.conf后做两件事,一是创建适当的soname链接,二是生成Id.so.cache包含共享库的软件包在安装过程中都会执行一下Idconfig命令下面以libc为例说明共享库的三个文件名thestaticlibrarysotrythatsecondarily.*/0UTPUT_F0RMATelf32-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/lib/然后到〜/rootfs/lib目录下删掉所有静态库与一些不常用的库,剩下这些库文件:Idconfig是很常用的一个命令,假如某些程序把共享库安装到非标准目录(/lib与/usr/lib)则需要执行Idconfig更新缓存文件/etc/ld.so.cache比如后面安装QtopiaCore时就会用到但是busybox不包含Idconfig命令,由于它与glibc密切有关,是随glibc一起公布的,先前我们制作交叉编译工具链时已经生成了Idconfig现在把它拷到根文件系统~$cpcrosstool-
0.43/build/arm-linux/gcc-
4.
0.2-glibc-
2.
3.6/build-glibc/elf/ldconfigrootfs/sbin/现在通过NFS启动开发板,应该能够成功启动到shell了
2.交叉编译工具链要做嵌入式Linux开发,首先需要有交叉编译工具链crosscompilingtoolchain也就是在主机x86PC上可编译生成目标板可执行文件ARM指令的编译工具与普通的编译工具链一样,交叉编译工具链也包含编译、链接、修改目标文件的各类程序,如gccglibcldgas、objdumpreadelf等等交叉编译工具链本身也是需要编译生成的,要得到一套完整的交叉编译工具链需要编译下列源码包binutilsgccglibclinux内核1inux-1ibc-headersglibc-1inuxthreads这些源码包具有非常强的版本依靠关系,假如源码包的版本不匹配,在编译过程中会出现各类各样的问题,有些问题需要对源码做些修改或者者打补丁,有些问题则是没有解决办法的,只能更换匹配较好的版本编译的步骤也是比较复杂的,要紧有下列几步
0.根据目标平台配置内核源代码,生成内核头文件.编译binutils.编译器的自举bootstrap也就是先编译出gcc的部分功能没有glibc支持,只有C编译器没有C++编译器.编译glibc.编译完整的gcc~$tarxfcrosstool-
0.
43.tar.gz;cdcrosstool-
0.43gcc-
4.
0.2cgcc-
4.
0.2glibc-
2.
3.6binutils-
2.
16.
1.3mdev先前我们在根文件系统的/dev目录下手动创建了三个设备文件consolenull与s3c2410_serial0内核里还有很多设备驱动需要通过设备文件提供接口给应用程序访问,假如一个一个手动创建太烦恼而且容易出错,busybox提供的mdev程序能够从sysfs中读出内核提供的设备驱动信息,在/dev目录下自动创建相应的设备文件并为这些设备文件命名在PC上完成这一功能的是udevmdev是busybox为嵌入式系统裁剪过的udevo把下列几行附加到启动脚本~/rootfs/etc/init.d/rcS的末尾mount-ttmpfsmdev/devmdev-smkdir/dev/inputIn-s/dev/mice/dev/input/micemdev还需要一个配置文件mdev.conf用于指定各设备文件的所有者与权限,其格式可参考busybox源代码中的docs/mdev.txt我们不做特别的设置,但这个文件是需要存在的,因此创建一个空文件~$touchrootfs/etc/mdev.conf现在重新启动开发板,从minicom能够看到开发板的/dev目录下创建了很多设备文件,而从主机上查看NFS目录~/rootfs/dev却仍然只有先前的三个设备文件,想一想这是为什么系统时钟首先将主机上的时区文件拷到开发板根文件系统~$cp/etc/localtime〜/rootfs/etc/然后在启动脚本~/「00土£5/01:3/打五.d/rcS中添加一条命令hwclock-hctosys选项--hctosys的意思是读取硬件RTC时钟he成为当前的系统时钟sys在系统运行期间,调用time2等函数读取的都是内核保护的系统时钟,而不可能直接去读硬件时钟,因此,假如用date命令修改了系统时钟#date031915232007MonMar1915:23:00CST2007这时关闭系统,时钟信息还是会丢失假如在上述命令后用hwclock命令写到硬件RTC时钟#hwclock-systohe在系统断电期间RTC时钟由电池来维持,下次启动通过hwclock—hctosys仍然能够将系统时钟设定正确网络配置在bootloader中设置的开发板IP地址仅在bootloader阶段与主机通信时起作用假如是NFSRoot方式启动,系统启动后的IP地址是由内核启动参数中的NFS设置决定的,这样系统启动后仍然能够读取主机的NFS导出目录假如是Flash根文件系统启动,则启动之后需要重新配置IP地址与激活网络接口,我们能够把配置写在启动脚本^/rootfs/etc/init.d/rcS中ifup-a同时添加一个配置文件~/rootfs/etc/network/interfaces autoloifaceloinetloopbackautoethOifaceethOinetstaticaddress
192.
168.
1.25netmask
255.
255.
255.0gateway
192.
168.
1.125ifup命令根据配置文件激活网络接口lo(loopback设备)与ethO(以太网接口)~$mkdir-prootfs/srv/www/cgi-bin现在启动开发板系统,试验下列功能
0.编辑一个indexhtml放在~/rootfs/srv/www下,从主机上打开浏览器,输入开发板的IP地址看能否浏览#!/bin/shecho“Content-Type:text/plain〃echoIs-a最终我们的启动脚本~/rootfs/etc/init.d/rcS是这样的#!/bin/shmount-amount-ttmpfsmdev/devmdev-smkdir/dev/inputIn-s/dev/mice/dev/input/micehwclock—hctosysifup-a.参考资料BuildingEmbeddedLinuxSystemsbyKarimYaghmourOReilly出版linux-
2.
6.
15.4hdrs-
2.
6.
12.0修改crosstool-
0.43目录下的脚本demo-arm.sh取消这一行开头的#号注释符#evalcatarm.datgcc-
4.
0.2-glibc-
2.
3.
6.dafshall.sh—notest同时将原本没有注释的这一行注释掉(前面加#号)evalcatarm.datgcc-
4.
1.0-glibc-
2.
3.2-tls.dafshall.sh—notest注意该脚本开头有TARBALLS_DIR=$HOME/downloadsRESULT_TOP=/opt/crosstoolbinutils-
2.
16.
1.tar.bz2gcc-
4.
0.
2.tar.bz2glibc-
2.
3.
6.tar.bz2glibc-1inuxthreads-
2.
3.
6.tar.bz2linux-
2.
6.
15.
4.tar.bz21inux-1ibc-headers-
2.
6.
12.
0.tar.bz2整个编译结束后,交叉编译工具链将放在/opt/crosstool目录下,因此脚本需要在/opt下建子目录,假如不希望使用root权限运行该脚本,则需要事先给/opt目录设置写权限sudochmoda+w/opt然后修改arm.dat其中有TARGET=arm-unknown-linux-gnu这是按标准的命名规则为工具链命名的,但是通常我们都使用更简单的命名,很多软件的Makefile中交叉编译器默认也都使用简单的命名,为此我们把它改为TARGET=armTinux由于编译过程需要用到patch、bison、flex确认你的系统中安装了这些软件包在编译过程中可能还会遇到脚本的兼容性问题,假如你的Linux发行版将sh指向dash(比如Ubuntu)应将其改指向bash$cd/bin$sudoIn-sfbashsh尽管用dash执行脚本时非常高效同时事实上现完全遵守P0SIX标准,然而现存的很多脚本(比如glibc中的脚本)有不符合P0SIX标准的用法,因此仍需改用bash执行准备就绪后,在crosstool-
0.43目录下运行demo-arm.sh脚本开始编译编译完成后,交叉编译工具链的可执行文件位于/opt/crosstool/gcc-
4.
0.2-glibc-
2.
3.6/arm-linux/bin目录,我们能够把这个路径添加到PATH环境变量中,比如将下列命令添加到〜/.bashrc启动脚本exportPATH=$PATH:/opt/crosstool/gcc-
4.
0.2-glibc-
2.
3.6/arm-linux/bin以上编译步骤需要很长时间,也能够直接从ftp下载已制作好的交叉编译工具链安装到主机~$sudochmoda+w/opt~$tarxfcrosstool.tar.bz2-C/opt然后在〜/.bashrc启动脚本中修改PATH环境变量
3.熟悉开发环境U-boot的基本使用方法连接好开发板的网线与串口线,启动minicom(配置成1152008N1无FlowControl)o按下开发板电源,立刻按除回车以外的任意键,进入bootloader提示符AKAE2440#假如没来及按键就已经启动了内核,能够按开发板上的RESET键重来注意u-boot的终端不能处理操纵字符,不要用移动光标键或者翻页键等,退格键能够用按了产生操纵字符的键再输入命令就会产生错乱,这时能够按下回车输入当前这条已经错乱的命令,然后在新的提示符下重新键入命令输入printenv命令显示bootloader的参数更换参数使用命令set或者者setenv如下图所示:64MiBS3C2410USBDevicedserialserialserialSavingEnvironmenttoNAND...ErasingNand♦・.WritingtoNand.・.doneAKAE2440#printenvbootargs=root=ramfsconsole=ttySAC0115200bootdelay=10baudrate=l15200ethaddr=00:0c:20:02:0a:5busbtty=cdc_acmtest=aaaaipaddr=
192.
168.
1.22netmask=
255.
255.
255.0serverip=
192.
168.
1.21Environmentsize:187/131067bytesAKAE2440#蠡上图中,setenvipaddr
192.
168.
1.22表示设置开发板的IP地址为
192.
168.
1.22Osetenvnetmask
255.
255.
255.0表示设置子网掩码为
255.
255.
255.0setenvserverip
192.
168.
1.21表示设置与开发板相连的PC机IP是
192.
168.
1.21能够根据你的情况重新设置为了统一起见,在后面的实验中,我们统一设置为AKAE2440#setipaddr
192.
168.
2.100AKAE2440#setserverip
192.168221(这一项应该与你的主机IP一致)AKAE2440#setnetmask
255.
255.
255.0AKAE2440#setgateway
192.
168.
2.21(网关ip设置成什么无所谓,通常都设为主机ip)AKAE2440#savesave将这些设定写入flash中,下次开发板上电时仍然有效假如不save则仅改变内存中的参数值,reset后会恢复flash中原先的参数值设置完成后在开发板上ping主机的ip地址,检查网络是否正常,如下所示AKAE2440#ping
192.
168.
2.21host192J
68.
2.21isalive这表示主机能ping通,网络正常假如显示如下AKAE2440#ping
192.
168.
2.21pingfailed;host
192.
168.
2.21isnotalive.这就表示主机不能ping通,网络特殊,需要检查你的网络还有一些常见的参数AKAE2440#setbootdelay3Bootdelay设为3表示开发板上电后等待3秒再启动,这3秒时间内按任意键会进入u-boot命令行状态,如下图所示AKAE2440#AKAE2440#AKAE2440#AKAE244®#AKAE2440#setbootdelay3AKAE244®#saveSavingEnvironmenttoNAND...ErasingredundantNand...V/ritingtoredundantNand...done而E2440#AKAE2440#另外,还有:AKAE2440#setbootmodenfs或者者AKAE2440#setbootmodenandBootmode能够设为nfs或者者nand两者之一,这个参数说明了u-boot启动时,根文件系统在哪里寻找,假如是nand表示根文件系统储存在开发板本身的flash某个分区中,要到flash上去找;假如是nfs则表示u-boot要去你的PC机的nfs服务的目录(PC机硬盘上)去找在开发板bootloader输入下列命令查看64Mflash是如何分区的AKAE2440#mtdpartsDevicenandOakae2440-nand.#parts=4u-boot分区储存bootloader程序,Linux内核储存在kernel分区,根文件系统会储存到ext2分区,temp分区本实验中没有用到假如mtdparts命令未显示上述图样,可能是flash未作分区操作,能够使用mtdpartsdefault命令来创建上述那样的默认分区如下图所示:AKAE2440#mtdpartsdefaultAKAE2440#mtdpartsactivepartition nandO0-u-boot0x00100000@0x00000000defaults mtdids:nand0=akae2440-nandmtdparts:mtdparts=akae2446-nand:0x00100000u-boot0x00200000kernel0x01000000ext2-tempAKAE2440#|CTRL-AZforhelp|1152008N1|NOR|Minicom
2.3-rc|VT102|Offline假如要储存新的分区表,使用命令save储存到flash中,否则reset后将恢复flash中原先的分区表下载文件到开发板内存中,需要通过tftp协议开发板是tftp客户端,主机是tftp服务器在配置好主机的tftp服务之后,主机上会有一个tftp服务的主目录/tftproot我们把要下载到开发板上的文件都先拷贝到这个目录中,之后才能下载tftp命令的格式为tftp〈内存地址〉文件名注意我们都是把内核zlmage文件下载到0x30008000地址上,把根文件系统img文件下载到0x30800000地址上当我们用命令tftp0x30008000zlmage把内核zlmage下载到内存地址0x30008000上之后,先使用nanderasekernel命令擦除掉flash的kernel分区上的数据(否则在读出flash数据时会报失败),然后能够用nandwrite0x30008000kernel0x200000命令把内存中的内核文件烧写到flash的对应kernel分区中去,如下图所示AKAE2440#AKAE2440#AKAE244®#AKAE244®#tftp0x30008000zlmageFFTPfromserver
192.
168.
2.21;ourIPaddressis
192.
168.
2.100Filenamezlmage.Loadaddress0x30008000Loading##############################################################################################################################################################################################################################################################################################doneBytestransferred=1463812165604hexAKAE244®#nanderasekernelMANDerase device0offset0x100000size0x200000Erasingat0x2fc000--100%complete.OKAKAE244®#nandwrite0x30008000kernel0x200000MANDwrite device0offset0x100000size0x2000002097152byteswritten:OKAKAE244#|CTRL-AZforhelp|1152008N1|NOR|Minicom
2.3-rc|VT102|Offline同理,当我们用命令tftp0x30800000rootfs.cramfs把根文件系统rootfs.cramfs映像文件下载到内存地址0x30800000上之后,用nandwrite0x30800000ext20x1000000命令把它烧写到flash的ext2分区中去,当然,在烧写之前也要先使用nanderaseext2擦除掉flash的ext2分区,否则烧写后读出数据会失败如下图所示AKAE2440#AKAE2440#AKAE2440#tftp0x30800000rootfs.cramfsTFTPfromserver
192.
168.
2.21;ourIPaddressis
192.
168.
2.100Filenamerootfs.cramfs
1.Loadaddress0x30800000Loading#####################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################doneBytestransferred=38707203bl000hexAKAE2440#nanderaseext2NANDerase device0offset0x300000size0x1000000Erasingat0xl2fc000--100%complete.OKAKAE2440#nandwrite0x30800000ext20x1000000NANDwrite:device0offset0x300000size0x100000016777216byteswritten:OKAKAE2440#■注意假如发现tftp服务配置是正确的,但是有些文件不能够下载,则很有可能是文件权限的问题能够使用sudochmod777zImagerootfs.cramfs这样的命令来更换文件访问权限现在,内核与cramfs根文件系统都烧写到flash上去了,只要设置好正确的内核启动参数就能够启动开发板了AKAE2440#setbootcmdnandread0x30008000kernel0x200000\;myboot0x30008000AKAE2440#setbootargsnoinitrdconsole=ttySACO115200AKAE2440#setbootmodenandAKAE2440#savebootcmd参数表示u-boot上电后会自动执行的命令,第一条nandread0x30008000kernel0x200000表示从flash上kernel分区去读取Linux内核到开发板内存地址0x30008000处,大小为0x200000字节;第二条命令是myboot0x30008000表示跳转到地址0x30008000去启动Linux内核这两条命令要用分号“;”隔开,但是设置bootcmd参数时设置给它的是一个字符串,因此分号要用转义字符“\;”代替bootargs就是我们常说的Linux内核的启动命令行参数(Linux_cmd」ine)U-boot通过这个参数告知内核一些关键的启动参数实际上,在Uboot中,最后的完整的启动命令行参数是由前面设置那些一个一个的小项组合而成的真正完整的命令行参数是noinitrdconsole=ttySACOl15200init=/linuxrccs89x0_media=ij45root=/dev/mtdblock2mtdparts=akae2440-nand:1Mu-boot2Mkernel16Mext245Mtempip=
192.
168.
2.100:
192.
168.
2.21:
192168.
2.21:
255.
255.
255.0::eth0:offnoinitrd表示内核启动时不需要初始化一个内存磁盘ramdisk;而root二/dev/mtdblock2表示根文件系统在flash的编号为2的分区上从0开始编号的,因此是第三个分区,回忆前面的u-boot的分区信息,flash上分区依次是u-bootkernelext2temp我们的根文件系统就在第三个分区ext2上;console=ttySAC0115200表示打开一个串行终端ttySAC0它是通过串口1工作的,波特率为115200;init=/linuxrc表示内核启动好后第一个执行的应用程序是/linuxrc根目录下的linuxrc;mtdparts=akae2440-nand:1Mu-boot2Mkernel16Mext245Mtemp表示u-boot传递给内核的分区信息我们在选择使用nfs根文件系统还是cramfs根文件系统的时候,bootargsbootcmd与init参数基本都一样,不用改变,需要改变的是bootmode参数,由bootmode参数的设置决定去选择root参数描述cramfs根文件系统所在位置还是nfsroot参数描述nfs根文件系统所在位置,即bootmode为nand时选择root参数,bootmode为nfs时选择nfsroot参数在启动进入到Linux系统后,能够通过在命令行终端键入如下命令来查看命令行参数$cat/proc/cmdline现在启动AKAE2440#reset这时屏幕上出现很多内核启动信息,之后提示登录,输入root即可登录nonelogin:root现在能够试试各类Linux基本命令注意cramfs是只读文件系统,在开发板上运行时不能改动里面的文件有些时候我们可能会尝试配置不一致的内核选项,会得到不一致的几个内核zImage文件,这样都烧写到flash上再reset启动太浪费时间,能够用tftp把内核zlmage加载到内存0x30008000地址上,不烧写,直接用myboot0x30008000去启动内存上的内核如下图示/bin/sbin/usr/bin/usr/sbin系统的基本命令,系统关键组件的可执行文件位于/bin与/sbin其它应用程序的可执行文件位于/usr/bin与/usr/sbinbin与sbin的区别在于,bin目录下的可执行文件用于日常操作,比如Is、cpsbin目录下的可执行文件用于管理操作,比如ifconfig执行管理操作通常需要root权限/lib/usr/lib共享库,也是分为系统关键组件的共享库与其它应用程序的共享库J/procproc文件系统的挂载点/syssys文件系统的挂载点/dev设备文件/etc配置文件、启动脚本/var运行时产生的记录文件、锁文件、日志文件/tmp运行时产生的临时文件/mnt通常用作挂载点/opt通常存放第二方软件/srv通常用作Web服务、ftp服务的服务目录-rwxr-xr-x1akaeduakaedu13873792008-03-1611:34libc-
2.
3.
6.soIrwxrwxrwx1akaeduakaedu132008-03-1611:06libc.so.6-libc-
2.
3.
6.so-rw-r—r—1akaeduakaedu1952008-03-1611:10libc.so$catlibc.so/*GNUIdscriptUsethesharedlibrarybutsomefunctionsareonlyinVrootfs/lib$Isld-
2.
3.
6.solibm.so.6libpcprofile.sold-linux.so.2libnsl-
2.
3.
6.solibpthread-
0.
10.solibanl-
2.
3.
6.solibnsl.solibpthread.solibanl.solibnsl.so.1libpthread.so.0libanl.so.1libnss_compat-
2.
3.
6.solibresolv-
2.
3.
6.solibBrokenLocale-
2.
3.
6.solibnss_compat.solibresolv.solibBrokenLocale.solibnss_compat.so.2libresolv.so.2libBrokenLocale.so.1libnss_dns-
2.
3.
6.solibrt-
2.
3.
6.solibc~
2.
3.
6.solibnssdns.solibrt.solibcrypt-
2.
3.
6.solibnssdns.so.2librt.so.1libcrypt.solibnss_files-
2.
3.
6.solibSegFault.solibcrypt.so.1libnss_files.solibstdc++.solibc.solibnss_files.so.2libstdc++.so.6libc.so.6libnsshesiod-
2.
3.
6.solibstdc++.so.
6.
0.6libdl-
2.
3.
6.solibnss_hesiod.solibthread_db-l.
0.solibdl.solibnss_hesiod.so.2libthread_db.solibdl.so.2libnss_nis-
2.
3.
6.solibthread_db.so.1libgccs.solibnssnisplus-
2.
3.
6.solibutil-
2.
3.
6.solibgccs.so.1libnssnisplus.solibutil.solibm-
2.
3.
6.solibnss_nisplus.so.2libutil.so.1libmemusage.solibnss_nis.solibm.solibnss_nis.so.2devicenand0akae2440-nand#parts=4#namesizeoffsetmaskflagse u-boot0X001000000X000000000i kernel0X002000000X0010000002:ext20X010000000X0030000003:temp0x02d000000X013000000。
个人认证
优秀文档
获得点赞 0