版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
在线教务辅导网:教材其余课件及动画素材请查阅在线教务辅导网QQ:349134187或者直接输入下面地址:1在线教务辅导网:http://www.shangfuwang第五章嵌入式Linux启动引导程序、内核、文件系统丰海2第五章嵌入式Linux启动引导程序、内核、文件系统丰海2BootLoader的基本概念BootLoader就是在操作系统内核运行之前运行的一段引导系统启动的程序。通过这段小程序的作用是初始化硬件设备、建立内存空间的映射图,并将系统的软硬件环境带到一个合适的状态,以便为调用操作系统内核准备好正确的环境。在嵌入式世界,BootLoader是严重地依赖于硬件而实现的,没有Bootloader,嵌入式系统就不能启动。由于作者在这方面的功力还不够,所以无法向读者介绍针对TQ2440开发板的u-boot移植,只介绍一下u-boot的使用基础和概念。Bootloader完成的主要功能就是将操作系统调进内存中执行,然后将控制权交给操作系统,嵌入式系统中常见的Bootloader有Vivi、Blob、Redboot、U-Boot等。3BootLoader的基本概念3内核移植的平台
1.
首先验证所下载内核的完整性2.安装编译内核时所需要的工具:3.编译前的准备4.内核源代码的修改修改平台输入时钟\Makefile文件、机器代码加入NANDFLASH的分区信息、添加内核对yaffs2的支持、修改看门狗驱动
5.输入make进行编译4内核移植的平台1.首先验证所下载内核的完整性2.安装编fh@fh:~$gpg--verifylinux-.tar.bz2.signgpg:于2009年07月31日星期五07时13分44秒CST创建的签名,使用DSA,钥匙号517D0F0Egpg:完好的签名,来自于“LinuxKernelArchivesVerificationKey<ftpadmin@>”gpg:警告:这把密钥已经被它的持有者吊销了!gpg:这表明这个签名有可能是伪造的。gpg:吊销原因:密钥已泄漏gpg:吊销注释:Keywasusedtoautosigning;autosigningserverwascompromised.gpg:警告:这把密钥未经受信任的签名认证!gpg:没有证据表明这个签名属于它所声称的持有者。主钥指纹:C75DC40A11D7AF889981ED5BC86BA06A517D0F0E如果主钥指纹和ftpadmin@邮箱与/signature.html网站的信息一样如图5-1所示,则表示这个包是完整的。5fh@fh:~$gpg--verifylinux-2.66安装编译内核时所需要的工具:fh@fh:~$sudoapt-getinstalllibncurses5-devfh@fh:~$sudoapt-getinstallncurses-docfh@fh:~$sudoapt-getinstallkernel-packagefh@fh:~$mkdir/home/fh/kernel(建立放置内核的目录)fh@fh:~$cplinux-.tar.bz2/home/fh/kernel(复制内核)fh@fh:~$cd/home/fh/kernel、fh@fh:~/kernel$tarjxvflinux-.tar.bz2(解压内核)fh@fh:~/kernel$cd/home/fh/kernel/linux-(进入内核目录,实际上源代码是需要根据具体的硬件修改的,只是TQ2440的配套光盘中给的内核源代码已经修改好了。)fh@fh:~/kernel/linux-$makeclean(清除以前的旧数据)fh@fh:~/kernel/linux-$makemrproper(清理以前编译时留下的临时文件)7安装编译内核时所需要的工具:fh@fh:~$mkdir/内核源代码的修改1.修改根目录下的Makefile文件Linux内核源码目录下的Makefile文件控制内核的编译,虽然我们在x86平台上进行编译,但是我们的目标平台是ARM,故必须进行交叉编译,将编译器改为arm-linux-,处理器的架构改为arm。tq2440的配套光盘中给的内核源代码中的命令:viMakefile修改:(193行)ARCH=arm(194行)CROSS_COMPILE=arm-linux-原因:指明体系结构为arm,采用的交叉编译器为arm-linux-,一定要改完Makefile文件再执行makemenuconfig,否则,默认的配置平台就是针对x86架构的PC普通电脑。8内核源代码的修改1.修改根目录下的Makefile文件82.修改平台输入时钟命令:fh@fh:~/kernel/linux-$viarch/arm/mach-s3c2440/mach-smdk2440.c修改:(163行)smdk2440_map_io()中的s3c24xx_init_clocks(16934400)修为s3c24xx_init_clocks(12000000)原因:TQ2440开发板使用的是12MHz的外部时钟。3.修改机器代码命令:fh@fh:~/kernel/linux-$viarch/arm/tools/mach-types修改:(379行)s3c2440这一行最后的数字改为168原因:在内核文件arch/arm/mach-s3c2440/mach-smdk2440.c中的MACHINE_START(S3C2440,”SMDK2440”)中要使用该机器码,同时它还应该与uboot中的机器码一致,因为uboot源码中为168,所以要改成与uboot一致;92.修改平台输入时钟3.修改机器代码94.修改common-smdk.c文件,加入NANDFLASH的分区信息命令:fh@fh:~/kernel/linux-$viarch/arm/plat-s3c24xx/common-smdk.c1)修改内容如下:(109行开始)staticstructmtd_partitionsmdk_default_nand_part[]={
[0]={
.name
="uboot",
.offset=0x00000000,
.size
=0x00040000,
},
[1]={
.name
="kernel",
.offset=0x00200000,
.size=0x00300000,
},
[2]={
.name
="yaffs2",
.offset=0x00500000,
.size
=MTDPART_SIZ_FULL
}};即将NANDflash分为3个分区,名称分别为uboot,kernel和yaffs2,偏移量分别为0,2M和5M,大小分别为256kb,3M和251M(MTDPART_SIZ_FULL就是剩余的全部空间),注意:大小必须为128KB的整数倍,这是和uboot相关的。104.修改common-smdk.c文件,加入NANDFL
2)
然后,修改同文件的下面代码(140行)staticstructs3c2410_platform_nandsmdk_nand_info={
.tacls
=10,
.twrph0
=25,
.twrph1
=10,
.nr_sets=ARRAY_SIZE(smdk_nand_sets),
.sets
=smdk_nand_sets,};其中修改的值由NANDflash芯片手册查询得到的,简单的说,这些设置就是要按照NANDFLASH芯片的读写时序而已。11
2)
然后,修改同文件的下面代码113)修改s3c2410.c文件fh@fh:~/kernel/linux-$vidrivers/mtd/nand/s3c2410.c最后,修改drivers/mtd/nand/s3c2410.c中752行s3c2410_nand_init_chip函数的语句改为(752行)chip->ecc.mode
=NAND_ECC_NONE;(原来为NAND_ECC_SOFT)这里不采用NANDflash的软件ECC校验码,因为在初始化的时候,uboot中有校验码,然后在后面yaffs2文件系统内核移植的时候,要选上采用S3C2440硬件校验码。123)修改s3c2410.c文件12添加内核对yaffs2的支持
YAFFS(YetAnotherFlashFileSystem)是专门为NANDFlash存储器设计的嵌入式文件系统,遵循GPL(GeneralPublicLicense)协议。在移植前,首先要为内核添加yaffs2文件系统的支持,首先下载yaffs2文件系统的补丁,可到官方下载页下载,但是现在都用git工具下载了。1)需要使用git工具,如果没有安装,请先输入sudoapt-getinstallgit2)下载yaffs2补丁fh@fh:~/kernel$gitclonegit://www.aleph1.co.uk/yaffs2Cloningintoyaffs2...remote:Countingobjects:6875,done.remote:Compressingobjects:100%(4105/4105),done.remote:Total6875(delta5452),reused3478(delta2700)Receivingobjects:100%(6875/6875),3.40MiB|541KiB/s,done.Resolvingdeltas:100%(5452/5452),done.fh@fh:~/kernel$lslinux-linux-.tar.bz2.signyaffs213添加内核对yaffs2的支持
YAFFS(YetAnoth3)给内核打上yaffs2的补丁,先进入yaffs2目录,fh@fh:~/kernel$cdyaffs2输入下面命令:fh@fh:~/kernel/yaffs2$./patch-ker.shcm/home/fh/kernel/linux-/Updating/home/fh/kernel/linux-//fs/KconfigUpdating/home/fh/kernel/linux-//fs/Makefile再进入内核根目录的fs目录,就可以看到一个yaffs2目录,说明已经为内核打上了支持yaffs2的补丁。注意:以后的操作都是在内核源代码的根目录下执行的。143)给内核打上yaffs2的补丁,146)修改看门狗驱动drivers/watchdog/s3c2410_wdt.c程序修改如下加粗部分(49行)#defineCONFIG_S3C2410_WATCHDOG_ATBOOT(1)//启动看门狗,原来是(0)(50行)#defineCONFIG_S3C2410_WATCHDOG_DEFAULT_TIME(15)//设置时间默认15秒没喂狗,CPU就重启(55行)staticintsoft_noboot=0;(56行)staticintdebug=0;
156)修改看门狗驱动drivers/watchdog/s3c27.打补丁__gnu_mcount_nc_patch,解决EABI编译器与arms3c2440处理器编译错误有兴趣的读者请参看以下网址,/ml/libc-ports/2008-04/msg00009.html__gnu_mcount_nc_patch.patch.gz脚本见配书光盘首先将__gnu_mcount_nc_patch.patch.gz脚本拷贝到内核的根目录下fh@fh:~/my_experiment/5$cp__gnu_mcount_nc_patch.patch.gzlinux-/fh@fh:~/my_experiment/5/linux-$gunzip-dc__gnu_mcount_nc_patch.patch.gz|patch-p1(注意:__gnu脚本最前面是两个下划线;-p1中的最后一个是数字1)patchingfilearch/arm/include/asm/ftrace.hpatchingfilearch/arm/kernel/armksyms.cpatchingfilearch/arm/kernel/entry-common.S167.打补丁__gnu_mcount_nc_patch,解决8.修改与网卡相关的两个文件1)修改drivers/net/dm9000.c网卡驱动文件①在原文件39行#include<asm/io.h>之后,但在#include"dm9000.h"之前,加入以下加粗部分:#ifdefined(CONFIG_ARCH_S3C2410)#include<mach/regs-mem.h>#endif②加入①的内容后,在文件的1192行u32id_val之后,但在/*Initnetworkdevice*/之前,加入以下加粗部分:#ifdefined(CONFIG_ARCH_S3C2410) unsignedintoldval_bwscon=*(volatileunsignedint*)S3C2410_BWSCON; unsignedintoldval_bankcon4=*(volatileunsignedint*)S3C2410_BANKCON4;#endif178.修改与网卡相关的两个文件17③在1208行dev_dbg(&pdev->dev,"dm9000_probe()\n");之后但在/*setupboardinfostructure*/之前,加入以下加粗部分:#ifdefined(CONFIG_ARCH_S3C2410) *((volatileunsignedint*)S3C2410_BWSCON)=(oldval_bwscon&~(3<<16))|S3C2410_BWSCON_DW4_16|S3C2410_BWSCON_WS4|S3C2410_BWSCON_ST4; *((volatileunsignedint*)S3C2410_BANKCON4)=0x1f7c;#endif18③在1208行dev_dbg(&pdev->dev,"④在1376行(注意TQ2440配套的移植手册写成1278行了) db->mii.mdio_write=dm9000_phy_write;之后,但在mac_src="eeprom";之前,加入以下加粗部分:#ifdefined(CONFIG_ARCH_S3C2410) printk("NowusethedefaultMACaddress:10:23:45:67:89:ab\n"); mac_src="EmbedSky"; ndev->dev_addr[0]=0x10; ndev->dev_addr[1]=0x23; ndev->dev_addr[2]=0x45; ndev->dev_addr[3]=0x67; ndev->dev_addr[4]=0x89; ndev->dev_addr[5]=0xab;#else19④在1376行(注意TQ2440配套的移植手册写成1278⑤在1410行 "setusingifconfig\n",ndev->name);这一行之后,但在platform_set_drvdata(pdev,ndev);这一行之前,加入以下加粗部分:#endif⑥在1424行out:之后,但在dev_err(db->dev,"notfound(%d).\n",ret);之前加入以下加粗部分:#ifdefined(CONFIG_ARCH_S3C2410) *(volatileunsignedint*)S3C2410_BWSCON=oldval_bwscon; *(volatileunsignedint*)S3C2410_BANKCON4=oldval_bankcon4;#endif20⑤在1410行 "setusingifconfig\2)编辑arch/arm/mach-s3c2440/mach-smdk2440.c文件加入dm9000的网卡信息①在第48行#include<plat/common-smdk.h>之后,但在staticstructmap_descsmdk2440_iodesc[]__initdata={之前,加入以下加粗部分:#include<linux/dm9000.h>②在// .lpcsel =((0xCE6)&~7)|1<<4,和};之后,就是在149,150这两行之后但在staticstructplatform_device*smdk2440_devices[]__initdata={这一行之前,加入以下加粗部分:212)编辑arch/arm/mach-s3c2440/machstaticstructresources3c_dm9k_resource[]={[0]={.start =S3C2410_CS4,.end =S3C2410_CS4+3,.flags =IORESOURCE_MEM,},[1]={.start =S3C2410_CS4+4,.end =S3C2410_CS4+4+3,.flags =IORESOURCE_MEM,},[2]={.start =IRQ_EINT7,.end =IRQ_EINT7,.flags =IORESOURCE_IRQ|IRQF_TRIGGER_RISING,}};staticstructdm9000_plat_datas3c_dm9k_platdata={.flags =DM9000_PLATF_16BITONLY,};structplatform_devices3c_device_dm9000={.name ="dm9000",.id =0,.num_resources =ARRAY_SIZE(s3c_dm9k_resource),.resource =s3c_dm9k_resource,.dev ={.platform_data=&s3c_dm9k_platdata,}};22staticstructresources3c_dm9③在第191行&s3c_device_iis这一行之后,并在};这一行之前,加入以下加粗部分:&s3c_device_rtc,&s3c_device_dm9000,9.串口驱动说明的内核已经支持UART0和UART1这两个串口,不用修改;但是如果要支持UART2的话,请参考TQ2440的移植手册进行UART2串口的移植。23③在第191行&s3c_device_iis这一行之后,内核的配置输入makemenuconfig进行内核的配置,出现如图所示的配置界面24内核的配置输入makemenuconfig进行内核的配置,首先加载内核提供的默认的针对s3c2410处理器的配置25首先加载内核提供的默认的针对s3c2410处理器的配置25BusyBox最初是由BrucePerens在1996年为DebianGNU/Linux安装盘编写的,其目标是在一张软盘上创建一个可引导的GNU/Linux系统,Busybox是一个遵循GPLV2协议的开源项目。Busybox将众多的Linux命令集合进一个很小的可执行程序中,BusyBox是为构建内存有限的嵌入式系统的优秀工具。Busybox在编写过程中对文件大小进行了优化,并考虑了系统资源有限的情况。与一般的GNU工具集动辄几MB的体积相比,动态连接的Busybox只有几百KB,即使静态连接也只有1MB左右,一次有人将Busybox比喻成Linux工具中的瑞士军刀,包括了一个大的工具集,但是有些根文件系统下的文件还是需要用户自己来建立。BusyBox26BusyBox最初是由BrucePerens在19961下载busybox的源代码busybox-1.19.4.tar.bz2及其对应的验证文件2验证文件的完整性3解压源代码fh@fh:~/busybox$tarjxvfbusybox-1.19.4.tar.bz24进入busybox源代码目录fh@fh:~/busybox$cdbusybox-1.19.4/5修改Makefile文件fh@fh:~/busybox/busybox-1.19.4$viMakefile修改164行为CROSS_COMPILE=arm-linux-//指定交叉编译器arm-linux-修改190行为ARCH=arm//指定CPU类型为arm修改完后保存6配置busyboxfh@fh:~/busybox/busybox-1.19.4$makemenuconfig271下载busybox的源代码busybox-1.19.4.t1下载busybox的源代码busybox-1.19.4.tar.bz2及其对应的验证文件/downloads/busybox-1.19.4.tar.bz2/downloads/busybox-1.00.tar.bz2.sign2验证文件的完整性busybox-1.19.4.tar.bz2.sign文件中含有MD5值和SHA1值MD5:9c0cae5a0379228e7b55e5b29528df8ebusybox-1.19.4.tar.bz2SHA1:5d7db83d8efbadc19c86ec236e673504bbf43517busybox-1.19.4.tar.bz2fh@fh:~/busybox$md5sumbusybox-1.19.4.tar.bz29c0cae5a0379228e7b55e5b29528df8ebusybox-1.19.4.tar.bz2fh@fh:~/busybox$sha1sumbusybox-1.19.4.tar.bz25d7db83d8efbadc19c86ec236e673504bbf43517busybox-1.19.4.tar.bz2281下载busybox的源代码busybox-1.19.4.t3解压源代码fh@fh:~/busybox$tarjxvfbusybox-1.19.4.tar.bz24进入busybox源代码目录fh@fh:~/busybox$cdbusybox-1.19.4/5修改Makefile文件fh@fh:~/busybox/busybox-1.19.4$viMakefile修改164行为CROSS_COMPILE=arm-linux-//指定交叉编译器arm-linux-修改190行为ARCH=arm//指定CPU类型为arm修改完后保存293解压源代码296配置busyboxfh@fh:~/busybox/busybox-1.19.4$makemenuconfig出现如下图所示Busybox的配置界面306配置busybox30创建需要的目录fh@fh:~/busybox/busybox-1.19.4$cd_installfh@fh:~/busybox/busybox-1.19.4/_install$mkdir-pdevetchome/skylibmntoptprocrootsddisksystmpudiskvarwebusr/libusr/sharefh@fh:~/busybox/busybox-1.19.4/_install$chmod777home/skyopt:附加的软件,空着。proc:用于提供内核与进程信息的虚拟文件系统,空着。root:root用户主目录,空着。tmp:暂时性文件,空着。var:用于存放监控程序和工具程序的可变数据,空着。sys:系统信息与控制的虚拟文件系统,mdev可能会在下面建立某些文件,空着。31创建需要的目录fh@fh:~/busybox/busybo2.拷贝库文件
(交叉编译工具链放在目录
/opt/EmbedSky/目录)到_install/lib目录下fh@fh:~/busybox/busybox-1.19.4/_install$cp-rf/opt/EmbedSky/4.3.3/arm-none-linux-gnueabi/libc/armv4t/lib/*so*lib-a3.将创建
etc/passwd文件fh@fh:~/busybox/busybox-1.19.4/_install$vietc/passwd加入以下一行root::0:0:root:/:/bin/sh以root登陆,不需要密码即可登录成功,4.将创建
etc/group文件fh@fh:~/busybox/busybox-1.19.4/_install$vietc/group加入以下一行root:*:0:322.拷贝库文件
(交叉编译工具链放在目录
/opt/Emb5.将目录busybox-1.19.4/examples/bootfloppy/etc下的所有文件和目录拷贝到_install/etc目录下。fh@fh:~/busybox/busybox-1.19.4/_install$cp-rf../examples/bootfloppy/etc/*etc/6.创建etc/inittab文件这个inittab文件是init的初始化配置文件,是系统启动后第一个访问的脚本文件,后续的启动文件是由它指定。inittab文件中每一行的格式如下所示(Busybox源程序目录下的example目录下有详尽的inittab文件范例):335.将目录busybox-1.19.4/examples/下面给出一个开发板上的实际/etc/inittab例子:fh@fh:~/busybox/busybox-1.19.4/_install$vietc/inittab#/etc/inittab::sysinit:/etc/init.d/rcS#(指定系统的启动脚本为/etc/init.d/rcS,字段sysinit表明该脚本在系统启动后最先执行,#并且只执行一次)console::askfirst:-/bin/sh(指定打开一个shell/bin/sh)#(在console上启动shell,askfirst表明先输出"Please
press
Enter
to
actvie
this
console",#等用户输入回车键之后才启动-/bin/sh。)::once:/usr/sbin/telnetd-l/bin/login(-l中的l是字母)::ctrlaltdel:/sbin/reboot#(表明当按下Ctrl+Alt+Delete组合键时,执行/sbin/reboot。)::shutdown:/bin/umount-a-r#(指定关机时运行umount命令卸载所有的文件系统,如果卸载失败,试图以只读方式重新挂载)然后修改该文件权限:chmod777inittab34下面给出一个开发板上的实际/etc/inittab例子:34创建etc/init.d/rcS脚本#!/bin/shPATH=/sbin:/bin:/usr/sbin:/usr/bin//shell命令的搜索路径runlevel=S//运行在单用户模式prevlevel=N//前一个级别为n表示没有前一个级别umask022//权限位掩码exportPATHrunlevelprevlevel//将设置的变量导出到环境中mount-a//将文件etc/fstab中指明的文件系统挂载到对应挂载点上//挂载所有在/etc/fstab里面列出的文件系统mkdir-p/dev/ptsmount-tdevptsdevpts/dev/ptsecho/sbin/mdev>/proc/sys/kernel/hotplug//用mdev来处理内核的热插拔事件。mdev-s
//mdev
利用mdev.conf配置文件为插入的设备在/dev下创建设备节点文件。TQ2440_wdg&//执行看门狗应用程序,不让CPU重启ifconfiglo//配置回路为ifconfigeth0netmaskup//配置网卡IProuteadddefaultgw//配置网卡的路由/bin/hostname-F/etc/sysconfig/HOSTNAME//设置主机名
修改权限:chmod777etc/init.d/rcS35创建etc/init.d/rcS脚本#!/bin/sh358.创建etc/sysconfig/HOSTNAME文件fh@fh:~/busybox/busybox-1.19.4/_install$mkdiretc/sysconfigfh@fh:~/busybox/busybox-1.19.4/_install$vietc/sysconfig/HOSTNAME该文件中的内容只有如下一行:TQ2440368.创建etc/sysconfig/HOSTNAME文件3创建etc/fstab文件fh@fh:~/busybox/busybox-1.19.4/_install$vietc/fstab#devicemount-pointtypeoptionsdumpfsckorderproc/procprocdefaults00tmpfs/tmptmpfsdefaults00sysfs/syssysfsdefaults00tmpfs/devtmpfsdefaults00var/devtmpfsdefaults00ramfs/devramfsdefaults0037创建etc/fstab文件fh@fh:~/busybox/b10.创建etc/mdev.conf文件vietc/mdev.confsd[a-z]*[0-9]0:00660@(mount-tvfat-oiocharset=utf8/dev/$MDEV/mnt/udisk)sd[a-z]*[0-9]0:00660*(umount/mnt/udisk)创建U盘的挂接点mkdirmnt/udisk11.创建etc/profile文件Shell启动过程中会根据文件etc/profile配置登陆环境,profile文件是终端登录之后首先运行的脚本,etc/profile配置的实例如下:fh@fh:~/busybox/busybox-1.19.4/_install$vietc/profileexportsetHOME=/rootUSER="`id-un`"LOGNAME=$USERPS1='[\u@\h\W]#'PATH=$PATHHOSTNAME=`/bin/hostname`exportUSERLOGNAMEPS1PATH3810.创建etc/mdev.conf文件11.创建etc12.创建etc/resolv.conf文件fh@fh:~/busybox/busybox-1.19.4/_install$vietc/resolv.confnameserver66nameserver//我的路由器地址3912.创建etc/resolv.conf文件3913.创建/dev目录下所需要的节点文件目录下建立节点文件/dev/console(终端),/dev/null(内核“黑洞”)
在linux内核源码文件init/main.c中有打开设备文件dev/console的操作如下:static
noinline
int
init_post(void)__releases(kernel_lock){………………if
(sys_open((const
char
__user
*)
"/dev/console",
O_RDWR,
0)
<
0)printk(KERN_WARNING
"Warning:
unable
to
open
an
initial
console.\n");………………}内核启动执行到这里时,mdev还没有构建dev目录,如果没有创建设备文件dev/console就将会打印警告Warning:
unable
to
open
an
initial
console。在内核启动的过程中要将产生的一些垃圾信息丢弃就需要空设备dev/null。sudomknod-m660dev/consolec51sudomknod-m660dev/nullc134013.创建/dev目录下所需要的节点文件401.编写看门狗应用程序TQ2440_wdg.cfh@fh:~/busybox/busybox-1.19.4/_install$viTQ2440_wdg.cTQ2440_wdg.c的完整源代码如下:#include<unistd.h>#include<sys/types.h>#include<sys/stat.h>#include<fcntl.h>#include<stdio.h>#include<stdlib.h>#include<errno.h>#include<linux/watchdog.h>intmain(intargc,char**argv){intfd=0;fd=open("/dev/watchdog",O_RDONLY);if(fd<0){perror("cannotopenwatchdogdevicefile/dev/watchdog");return-1;} for(;;){ioctl(fd,WDIOC_KEEPALIVE);sleep(3);//每隔3秒钟喂狗一次,不让看门狗重启CPU } close(fd);return0;}411.编写看门狗应用程序TQ2440_wdg.c412.交叉编译看门狗应用程序fh@fh:~/busybox/busybox-1.19.4/_install$arm-linux-gccTQ2440_wdg.c-oTQ2440_wdg3.拷贝可执行的看门狗程序到/bin目录下fh@fh:~/busybox/busybox-1.19.4/_install$cpTQ2440_wdgbin/4.使用TQ2440配套的yaffs文件系统制作工具将_install目录制作成根文件系统fh@fh:~/busybox/busybox-1.19.4/_install$cd..fh@fh:~/busybox/busybox-1.19.4$mkyaffs2image_installroot.binfh@fh:~/busybox/busybox-1.19.4$chmod755root.binfh@fh:~/busybox/busybox-1.19.4$cproot.bin/home/fh/tftpboot/5.通过tftp将root.bin根文件系统烧写进TQ2440开发板的NANDflash中,烧写过程参考第一章,记得先将启动开关打到NOR.422.交叉编译看门狗应用程序4.使用TQ2440配套的ya将启动开关拨回到NAND,启动TQ2440开发板就能从串口的minicom中看到如图所示的开发板登录界面,回车就直接进入系统。
43将启动开关拨回到NAND,启动TQ2440开发板就能从串口的在线教务辅导网:教材其余课件及动画素材请查阅在线教务辅导网QQ:349134187或者直接输入下面地址:44在线教务辅导网:http://www.shangfuwang第五章嵌入式Linux启动引导程序、内核、文件系统丰海45第五章嵌入式Linux启动引导程序、内核、文件系统丰海2BootLoader的基本概念BootLoader就是在操作系统内核运行之前运行的一段引导系统启动的程序。通过这段小程序的作用是初始化硬件设备、建立内存空间的映射图,并将系统的软硬件环境带到一个合适的状态,以便为调用操作系统内核准备好正确的环境。在嵌入式世界,BootLoader是严重地依赖于硬件而实现的,没有Bootloader,嵌入式系统就不能启动。由于作者在这方面的功力还不够,所以无法向读者介绍针对TQ2440开发板的u-boot移植,只介绍一下u-boot的使用基础和概念。Bootloader完成的主要功能就是将操作系统调进内存中执行,然后将控制权交给操作系统,嵌入式系统中常见的Bootloader有Vivi、Blob、Redboot、U-Boot等。46BootLoader的基本概念3内核移植的平台
1.
首先验证所下载内核的完整性2.安装编译内核时所需要的工具:3.编译前的准备4.内核源代码的修改修改平台输入时钟\Makefile文件、机器代码加入NANDFLASH的分区信息、添加内核对yaffs2的支持、修改看门狗驱动
5.输入make进行编译47内核移植的平台1.首先验证所下载内核的完整性2.安装编fh@fh:~$gpg--verifylinux-.tar.bz2.signgpg:于2009年07月31日星期五07时13分44秒CST创建的签名,使用DSA,钥匙号517D0F0Egpg:完好的签名,来自于“LinuxKernelArchivesVerificationKey<ftpadmin@>”gpg:警告:这把密钥已经被它的持有者吊销了!gpg:这表明这个签名有可能是伪造的。gpg:吊销原因:密钥已泄漏gpg:吊销注释:Keywasusedtoautosigning;autosigningserverwascompromised.gpg:警告:这把密钥未经受信任的签名认证!gpg:没有证据表明这个签名属于它所声称的持有者。主钥指纹:C75DC40A11D7AF889981ED5BC86BA06A517D0F0E如果主钥指纹和ftpadmin@邮箱与/signature.html网站的信息一样如图5-1所示,则表示这个包是完整的。48fh@fh:~$gpg--verifylinux-2.496安装编译内核时所需要的工具:fh@fh:~$sudoapt-getinstalllibncurses5-devfh@fh:~$sudoapt-getinstallncurses-docfh@fh:~$sudoapt-getinstallkernel-packagefh@fh:~$mkdir/home/fh/kernel(建立放置内核的目录)fh@fh:~$cplinux-.tar.bz2/home/fh/kernel(复制内核)fh@fh:~$cd/home/fh/kernel、fh@fh:~/kernel$tarjxvflinux-.tar.bz2(解压内核)fh@fh:~/kernel$cd/home/fh/kernel/linux-(进入内核目录,实际上源代码是需要根据具体的硬件修改的,只是TQ2440的配套光盘中给的内核源代码已经修改好了。)fh@fh:~/kernel/linux-$makeclean(清除以前的旧数据)fh@fh:~/kernel/linux-$makemrproper(清理以前编译时留下的临时文件)50安装编译内核时所需要的工具:fh@fh:~$mkdir/内核源代码的修改1.修改根目录下的Makefile文件Linux内核源码目录下的Makefile文件控制内核的编译,虽然我们在x86平台上进行编译,但是我们的目标平台是ARM,故必须进行交叉编译,将编译器改为arm-linux-,处理器的架构改为arm。tq2440的配套光盘中给的内核源代码中的命令:viMakefile修改:(193行)ARCH=arm(194行)CROSS_COMPILE=arm-linux-原因:指明体系结构为arm,采用的交叉编译器为arm-linux-,一定要改完Makefile文件再执行makemenuconfig,否则,默认的配置平台就是针对x86架构的PC普通电脑。51内核源代码的修改1.修改根目录下的Makefile文件82.修改平台输入时钟命令:fh@fh:~/kernel/linux-$viarch/arm/mach-s3c2440/mach-smdk2440.c修改:(163行)smdk2440_map_io()中的s3c24xx_init_clocks(16934400)修为s3c24xx_init_clocks(12000000)原因:TQ2440开发板使用的是12MHz的外部时钟。3.修改机器代码命令:fh@fh:~/kernel/linux-$viarch/arm/tools/mach-types修改:(379行)s3c2440这一行最后的数字改为168原因:在内核文件arch/arm/mach-s3c2440/mach-smdk2440.c中的MACHINE_START(S3C2440,”SMDK2440”)中要使用该机器码,同时它还应该与uboot中的机器码一致,因为uboot源码中为168,所以要改成与uboot一致;522.修改平台输入时钟3.修改机器代码94.修改common-smdk.c文件,加入NANDFLASH的分区信息命令:fh@fh:~/kernel/linux-$viarch/arm/plat-s3c24xx/common-smdk.c1)修改内容如下:(109行开始)staticstructmtd_partitionsmdk_default_nand_part[]={
[0]={
.name
="uboot",
.offset=0x00000000,
.size
=0x00040000,
},
[1]={
.name
="kernel",
.offset=0x00200000,
.size=0x00300000,
},
[2]={
.name
="yaffs2",
.offset=0x00500000,
.size
=MTDPART_SIZ_FULL
}};即将NANDflash分为3个分区,名称分别为uboot,kernel和yaffs2,偏移量分别为0,2M和5M,大小分别为256kb,3M和251M(MTDPART_SIZ_FULL就是剩余的全部空间),注意:大小必须为128KB的整数倍,这是和uboot相关的。534.修改common-smdk.c文件,加入NANDFL
2)
然后,修改同文件的下面代码(140行)staticstructs3c2410_platform_nandsmdk_nand_info={
.tacls
=10,
.twrph0
=25,
.twrph1
=10,
.nr_sets=ARRAY_SIZE(smdk_nand_sets),
.sets
=smdk_nand_sets,};其中修改的值由NANDflash芯片手册查询得到的,简单的说,这些设置就是要按照NANDFLASH芯片的读写时序而已。54
2)
然后,修改同文件的下面代码113)修改s3c2410.c文件fh@fh:~/kernel/linux-$vidrivers/mtd/nand/s3c2410.c最后,修改drivers/mtd/nand/s3c2410.c中752行s3c2410_nand_init_chip函数的语句改为(752行)chip->ecc.mode
=NAND_ECC_NONE;(原来为NAND_ECC_SOFT)这里不采用NANDflash的软件ECC校验码,因为在初始化的时候,uboot中有校验码,然后在后面yaffs2文件系统内核移植的时候,要选上采用S3C2440硬件校验码。553)修改s3c2410.c文件12添加内核对yaffs2的支持
YAFFS(YetAnotherFlashFileSystem)是专门为NANDFlash存储器设计的嵌入式文件系统,遵循GPL(GeneralPublicLicense)协议。在移植前,首先要为内核添加yaffs2文件系统的支持,首先下载yaffs2文件系统的补丁,可到官方下载页下载,但是现在都用git工具下载了。1)需要使用git工具,如果没有安装,请先输入sudoapt-getinstallgit2)下载yaffs2补丁fh@fh:~/kernel$gitclonegit://www.aleph1.co.uk/yaffs2Cloningintoyaffs2...remote:Countingobjects:6875,done.remote:Compressingobjects:100%(4105/4105),done.remote:Total6875(delta5452),reused3478(delta2700)Receivingobjects:100%(6875/6875),3.40MiB|541KiB/s,done.Resolvingdeltas:100%(5452/5452),done.fh@fh:~/kernel$lslinux-linux-.tar.bz2.signyaffs256添加内核对yaffs2的支持
YAFFS(YetAnoth3)给内核打上yaffs2的补丁,先进入yaffs2目录,fh@fh:~/kernel$cdyaffs2输入下面命令:fh@fh:~/kernel/yaffs2$./patch-ker.shcm/home/fh/kernel/linux-/Updating/home/fh/kernel/linux-//fs/KconfigUpdating/home/fh/kernel/linux-//fs/Makefile再进入内核根目录的fs目录,就可以看到一个yaffs2目录,说明已经为内核打上了支持yaffs2的补丁。注意:以后的操作都是在内核源代码的根目录下执行的。573)给内核打上yaffs2的补丁,146)修改看门狗驱动drivers/watchdog/s3c2410_wdt.c程序修改如下加粗部分(49行)#defineCONFIG_S3C2410_WATCHDOG_ATBOOT(1)//启动看门狗,原来是(0)(50行)#defineCONFIG_S3C2410_WATCHDOG_DEFAULT_TIME(15)//设置时间默认15秒没喂狗,CPU就重启(55行)staticintsoft_noboot=0;(56行)staticintdebug=0;
586)修改看门狗驱动drivers/watchdog/s3c27.打补丁__gnu_mcount_nc_patch,解决EABI编译器与arms3c2440处理器编译错误有兴趣的读者请参看以下网址,/ml/libc-ports/2008-04/msg00009.html__gnu_mcount_nc_patch.patch.gz脚本见配书光盘首先将__gnu_mcount_nc_patch.patch.gz脚本拷贝到内核的根目录下fh@fh:~/my_experiment/5$cp__gnu_mcount_nc_patch.patch.gzlinux-/fh@fh:~/my_experiment/5/linux-$gunzip-dc__gnu_mcount_nc_patch.patch.gz|patch-p1(注意:__gnu脚本最前面是两个下划线;-p1中的最后一个是数字1)patchingfilearch/arm/include/asm/ftrace.hpatchingfilearch/arm/kernel/armksyms.cpatchingfilearch/arm/kernel/entry-common.S597.打补丁__gnu_mcount_nc_patch,解决8.修改与网卡相关的两个文件1)修改drivers/net/dm9000.c网卡驱动文件①在原文件39行#include<asm/io.h>之后,但在#include"dm9000.h"之前,加入以下加粗部分:#ifdefined(CONFIG_ARCH_S3C2410)#include<mach/regs-mem.h>#endif②加入①的内容后,在文件的1192行u32id_val之后,但在/*Initnetworkdevice*/之前,加入以下加粗部分:#ifdefined(CONFIG_ARCH_S3C2410) unsignedintoldval_bwscon=*(volatileunsignedint*)S3C2410_BWSCON; unsignedintoldval_bankcon4=*(volatileunsignedint*)S3C2410_BANKCON4;#endif608.修改与网卡相关的两个文件17③在1208行dev_dbg(&pdev->dev,"dm9000_probe()\n");之后但在/*setupboardinfostructure*/之前,加入以下加粗部分:#ifdefined(CONFIG_ARCH_S3C2410) *((volatileunsignedint*)S3C2410_BWSCON)=(oldval_bwscon&~(3<<16))|S3C2410_BWSCON_DW4_16|S3C2410_BWSCON_WS4|S3C2410_BWSCON_ST4; *((volatileunsignedint*)S3C2410_BANKCON4)=0x1f7c;#endif61③在1208行dev_dbg(&pdev->dev,"④在1376行(注意TQ2440配套的移植手册写成1278行了) db->mii.mdio_write=dm9000_phy_write;之后,但在mac_src="eeprom";之前,加入以下加粗部分:#ifdefined(CONFIG_ARCH_S3C2410) printk("NowusethedefaultMACaddress:10:23:45:67:89:ab\n"); mac_src="EmbedSky"; ndev->dev_addr[0]=0x10; ndev->dev_addr[1]=0x23; ndev->dev_addr[2]=0x45; ndev->dev_addr[3]=0x67; ndev->dev_addr[4]=0x89; ndev->dev_addr[5]=0xab;#else62④在1376行(注意TQ2440配套的移植手册写成1278⑤在1410行 "setusingifconfig\n",ndev->name);这一行之后,但在platform_set_drvdata(pdev,ndev);这一行之前,加入以下加粗部分:#endif⑥在1424行out:之后,但在dev_err(db->dev,"notfound(%d).\n",ret);之前加入以下加粗部分:#ifdefined(CONFIG_ARCH_S3C2410) *(volatileunsignedint*)S3C2410_BWSCON=oldval_bwscon; *(volatileunsignedint*)S3C2410_BANKCON4=oldval_bankcon4;#endif63⑤在1410行 "setusingifconfig\2)编辑arch/arm/mach-s3c2440/mach-smdk2440.c文件加入dm9000的网卡信息①在第48行#include<plat/common-smdk.h>之后,但在staticstructmap_descsmdk2440_iodesc[]__initdata={之前,加入以下加粗部分:#include<linux/dm9000.h>②在// .lpcsel =((0xCE6)&~7)|1<<4,和};之后,就是在149,150这两行之后但在staticstructplatform_device*smdk2440_devices[]__initdata={这一行之前,加入以下加粗部分:642)编辑arch/arm/mach-s3c2440/machstaticstructresources3c_dm9k_resource[]={[0]={.start =S3C2410_CS4,.end =S3C2410_CS4+3,.flags =IORESOURCE_MEM,},[1]={.start =S3C2410_CS4+4,.end =S3C2410_CS4+4+3,.flags =IORESOURCE_MEM,},[2]={.start =IRQ_EINT7,.end =IRQ_EINT7,.flags =IORESOURCE_IRQ|IRQF_TRIGGER_RISING,}};staticstructdm9000_plat_datas3c_dm9k_platdata={.flags =DM9000_PLATF_16BITONLY,};structplatform_devices3c_device_dm9000={.name ="dm9000",.id =0,.num_resources =ARRAY_SIZE(s3c_dm9k_resource),.resource =s3c_dm9k_resource,.dev ={.platform_data=&s3c_dm9k_platdata,}};65staticstructresources3c_dm9③在第191行&s3c_device_iis这一行之后,并在};这一行之前,加入以下加粗部分:&s3c_device_rtc,&s3c_device_dm9000,9.串口驱动说明的内核已经支持UART0和UART1这两个串口,不用修改;但是如果要支持UART2的话,请参考TQ2440的移植手册进行UART2串口的移植。66③在第191行&s3c_device_iis这一行之后,内核的配置输入makemenuconfig进行内核的配置,出现如图所示的配置界面67内核的配置输入makemenuconfig进行内核的配置,首先加载内核提供的默认的针对s3c2410处理器的配置68首先加载内核提供的默认的针对s3c2410处理器的配置25BusyBox最初是由BrucePerens在1996年为DebianGNU/Linux安装盘编写的,其目标是在一张软盘上创建一个可引导的GNU/Linux系统,Busybox是一个遵循GPLV2协议的开源项目。Busybox将众多的Linux命令集合进一个很小的可执行程序中,BusyBox是为构建内存有限的嵌入式系统的优秀工具。Busybox在编写过程中对文件大小进行了优化,并考虑了系统资源有限的情况。与一般的GNU工具集动辄几MB的体积相比,动态连接的Busybox只有几百KB,即使静态连接也只有1MB左右,一次有人将Busybox比喻成Linux工具中的瑞士军刀,包括了一个大的工具集,但是有些根文件系统下的文件还是需要用户自己来建立。BusyBox69BusyBox最初是由BrucePerens在19961下载busybox的源代码busybox-1.19.4.tar.bz2及其对应的验证文件2验证文件的完整性3解压源代码fh@fh:~/busybox$tarjxvfbusybox-1.19.4.tar.bz24进入busybox源代码目录fh@fh:~/busybox$cdbusybox-1.19.4/5修改Makefile文件fh@fh:~/busybox/busybox-1.19.4$viMakefile修改164行为CROSS_COMPILE=arm-linux-//指定交叉编译器arm-linux-修改190行为ARCH=arm//指定CPU类型为arm修改完后保存6配置busyboxfh@fh:~/busybox/busybox-1.19.4$makemenuconfig701下载busybox的源代码busybox-1.19.4.t1下载busybox的源代码busybox-1.19.4.tar.bz2及其对应的验证文件/downloads/busybox-1.19.4.tar.bz2/downloads/busybox-1.00.tar.bz2.sign2验证文件的完整性busybox-1.19.4.tar.bz2.sign文件中含有MD5值和SHA1值MD5:9c0cae5a0379228e7b55e5b29528df8ebusybox-1.19.4.tar.bz2SHA1:5d7db83d8efbadc19c86ec236e673504bbf43517busybox-1.19.4.tar.bz2fh@fh:~/busybox$md5sumbusybox-1.19.4.tar.bz29c0cae5a0379228e7b55e5b29528df8ebusybox-1.19.4.tar.bz2fh@fh:~/busybox$sha1sumbusybox-1.19.4.tar.bz25d7db83d8efbadc19c86ec236e673504bbf43517busybox-1.19.4.tar.bz2711下
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 财务的实习报告范文集锦5篇
- 城镇老旧小区改造项目申请报告
- 2024年安康杯知识竞赛学习复习测试有答案
- 制动钳工高级复习测试题
- 小学数学一年级上册《统计》说课稿
- 演讲稿题目健康饮食【5篇】
- 老旧厂区改造效益预测与回报分析
- 2024年度XX单位与XX物业公司设施设备维修保养合同3篇
- 2024年深圳场地租赁合同文本
- 2024年线上线下融合电商运营服务合同
- 大型能源集团公司信息化规划(一)应用系统架构规划课件
- 《三气周瑜》儿童故事绘本ppt课件(图文演讲)
- 2023海南省图书馆公开招聘财政定额补贴人员15人(一)模拟预测(共500题)笔试参考题库附答案详解
- 2022年北京外国语大学博士生英语入学考试试题
- 新《煤矿安全规程》第08讲 《煤矿安全规程》关于爆破事故防治的规定
- 防爆电气设备安全管理规定
- 提高做好群众工作的能力主讲陶通艾
- 岗位价值评估表-附件一
- 门店所属关系证明
- 《“歪脑袋”木头桩》阅读测试
- 有关原始股权买卖协议书通用(7篇)
评论
0/150
提交评论