资源描述
1第四章部署基于ARM的嵌入式Linux系统v4.1嵌入式系统的软件组成及部署、启动过程v4.2移植的层次及内容v4.3Bootloader在ARM平台的移植v4.4Bootloader的启动过程v4.5Linux内核在ARM平台的移植v4.6Linux操作系统的启动过程v4.7Linux文件系统v4.8各个部分烧写方法v4.9总结24.1嵌入式系统的软件组成v嵌入式Linux系统从软件的角度通常可以分为5个层次,即:bootloader,Kernel,驱动程序,文件系统,应用程序34.1嵌入式系统的软件组成44.1嵌入式系统的部署过程v1烧写bootloader第1次烧写(新的没有任何内容的flash):JTAG接口线连到PC并口上.第2,3,.烧写:网线或串口等方法v2烧写内核v3烧写根文件系统(可以把驱动程序和应用程序放在文件系统中)v4下载应用程序(也有可能把应用程序放在根文件系统的某个目录下,与根文件系统一齐烧写到flash)v详细烧写方法在后面介绍54.1嵌入式系统的启动过程Bootloader内核镜像文件image根文件系统镜像ramdisk其它文件系统Flash全局数据结构解压后内核代码内核镜像文件image根文件系统镜像ramdiskSDRAMentryaddrentry64.2移植的层次及内容v移植是指将软件从一个平台迁移到另一个平台,包括:从一个硬件平台移植到另一个硬件平台从一个操作系统移植到另一个操作系统从一种软件库环境移植到另一个软件库环境74.2移植的层次及内容v软件进行移植的容易程度即可移植性,我们这里谈到的移植主要是从一个硬件平台到另一个硬件平台。v硬件平台的移植又分为以下几种:跨系统结构的移植跨处理器移植跨平台移植84.2移植的层次及内容v什么是跨系统结构移植?跨系统结构(跨构架architecture)就是从一种结构的处理器移植到另一种结构的处理器上。例如:X86ARM特点:移植工作量大,需要对底层做大量修改,例如内存管理,中断管理等94.2移植的层次及内容v什么是跨处理器移植?跨处理器移植(Processor)就是在同一种系统结构的两种处理器间进行移植。例如:PXA255PXA270这种移植相对简单,只需要修改arch下和Include/arch下相应的代码。主要增加对外设的支持。104.2移植的层次及内容v什么是跨平台移植?跨平台移植(Platform)就是在使用相同处理器不同的外设的系统间进行移植。是最常用的移植方式,需要的改动很少,主要集中在外设的驱动程序上。114.2移植的层次及内容v本课程移植内容Bootloader的移植操作系统内核的移植124.3Bootloader在ARM平台的移植vBootloader介绍vBootloader的种类134.3.1Bootloader介绍vBootLoader指系统启动后,在操作系统内核运行之前运行的一段小程序。通过BootLoader,我们可以初始化硬件设备、建立内存空间的映射图,从而将系统的软硬件环境带到一个合适的状态,以便为最终调用操作系统内核准备好正确的环境。144.3.1Bootloader介绍vBIOS的功能a.自检及初始化b.程序服务和设定中断vBIOS的类型vBIOS芯片的种类154.3.2Bootloader的种类vBootloader的种类viviPPC-BootU-boot164.3.2Bootloader的种类vVivi代码结构介绍Arch:此目录包括了所有vivi支持的目标板的子目录(这里只有s3c2410目录)drivers:其中包括了引导内核需要的设备的驱动程序(MTD和串口)。MTD目录下分map、nand和nor三个目录。init:只有main.c(第2阶段执行代码)Lib:一些平台的公共的接口代码Include:头文件的公共目录,其中s3c2410.h定义了处理器的一些寄存器,以及Nandflash的一些寄存器.platform/smdk2410.h定义了与这块开发板相关的资源配置参数。174.3.3Bootloader的制作v以vivi为例对不同嵌入式处理器进行代码修改选项设置(根据不同的外部设备,如串口个数、存储器类型等)编译生成镜像文件184.4Bootloader的启动过程vvivi的运行分为两个阶段194.4Bootloader的启动过程vstage1通常包括以下步骤(完成含依赖于CPU的体系结构硬件初始化的代码,包括禁止中断、初始化串口、复制自身到RAM等。相关代码集中在head.S(viviarchs3c2410目录下):硬件设备初始化;为加载BootLoader的stage2准备RAM空间;拷贝BootLoader的stage2到RAM空间中;设置好堆栈;跳转到stage2的C入口点(/init/main.c)。详细见文档204.4Bootloader的启动过程vstage2通常包括以下步骤:初始化本阶段要使用到的硬件设备;检测系统内存映射(memorymap);将kernel映像和根文件系统映像从flash上读到RAM空间中;为内核设置启动参数;调用内核。详细见文档214.5Linux内核在ARM平台的移植v4.5.1内核结构v4.5.2系统移植v4.5.3内核编译v4.5.4Linux内核调试224.5.1内核结构v(1)arch:包括硬件特定的内核代码,如arm、mips、i386等;v(2)drivers:包含硬件驱动代码,如char、cdrom、scsi、mtd等;v(3)include:通用头文件及针对不同平台特定的头文件,如asm-i386、asm-arm等;v(4)init:内核初始化代码;v(5)ipc:进程间通信代码;v(6)kernel:内核核心代码;v(7)mm:内存管理代码;v(8)net:与网络协议栈相关的代码,如ipv4、ipv6、ethernet等;v(9)fs:文件系统相关代码,如nfs、vfat等;v(10)lib:库文件v(11)Documentation:文档234.5.2系统移植v(1)修改根目录下的Makefile文件a.指定目标平台为ARM:#ARCH:=$(shelluname-m|sed-es/i.86/i386/-es/sun4u/sparc64/-es/arm.*/arm/-es/sa110/arm/)ARCH:=armb.指定交叉编译器:CROSS_COMPILE=arm-linux-244.5.2系统移植v(2)修改arch目录中的文件根据本章第一节可知,Linux的arch目录存放硬件相关的内核代码,因此,在Linux内核中增加对S3C2410的支持,最主要就是要修改arch目录中的文件。254.5.2系统移植va.在arch/arm/Makefile文件中加入:ifeq($(CONFIG_ARCH_S3C2410),y)TEXTADDR=0 xC0008000MACHINE=s3c2410Endif264.5.2系统移植vb.在archarmconfig.in文件中加入:if$CONFIG_ARCH_S3C2410=y;thencommentS3C2410Implementationdep_boolSMDK(MERITECHBOARD)CONFIG_S3C2410_SMDK$CONFIG_ARCH_S3C2410dep_boolchangeAIJICONFIG_SMDK_AIJIdep_tristateS3C2410USBfunctionsupportCONFIG_S3C2410_USB$CONFIG_ARCH_S3C2100dep_tristateSupportforS3C2410USBcharacterdeviceemulationCONFIG_S3C2410_USB_CHAR$CONFIG_S3C2410_USBfi#/*CONFIG_ARCH_S3C2410*/274.5.2系统移植v等等。284.5.2系统移植v只需要关心如下几点:(1)内核初始化:Linux内核的入口点是start_kernel()函数(initmain.c)。它初始化内核的其他部分,包括捕获,IRQ通道,调度,设备驱动,标定延迟循环,最重要的是能够forkinit进程,以启动整个多任务环境。我们可以在init中加上一些特定的内容。294.5.3内核编译v修改代码(不同平台)v选项(针对不同外围设备)v编译v生成镜像文件304.5.4Linux内核调试vKgdb314.6Linux操作系统的启动过程vLinux操作系统的启动过程(P50)324.7Linux文件系统v一个Linux系统一般有以下目录:/dev:设备文件,IO操作时需要/lib:一般是系统启动运行共享C库,内核模块/proc:内核情况的映射虚目录/mnt:其它磁盘系统挂接点,手工挂接点/etc:系统配置文件的存放/boot:引导加载程序所使用的静态文件/sbin:Linux系统命令/home:用户主目录,包括共服务器帐号所使用的主目录/bin:Linux必须命令/var:系统工具所存的数据/tmp:临时文件/usr:其它工具以及用户程序的存放处334.7Linux文件系统v4.7.1文件系统类型v4.7.2LinuxMTD子系统v4.7.3根文件系统v4.7.4普通文件系统v4.7.5Flash分区v4.7.6文件系统下载v4.7.7文件系统挂载344.7.1文件系统类型v文件系统作用在计算机业,一个文件系统是有组织存储文件或数据的方法,目的是易于查询和存取。文件系统是基于一个存储设备,比如硬盘或光盘,并且包含文件文件物理位置的维护;也可以说文件系统也是虚拟数据或网络数据存储的方法,比如NFS.354.7.1文件系统类型v理解文件系统的关健词存储介质磁盘的分割挂载(mount)文件系统可视的几何结构block1block2block3block4364.7.1文件系统类型v基于IDE的文件系统ext2文件系统ext3文件系统reiserfs文件系统vfat文件系统nfs文件系统374.7.1文件系统类型v基于Flash的文件系统RomfsCramfsRamfs/TmpfsJFFS2YAFFS384.7.2LinuxMTD子系统根文件系统文件系统 字符设备节点MTD字符设备MTD块设备MTD原始设备FLASH硬件驱动 块设备节点394.7.2LinuxMTD子系统v1、Flash硬件驱动层v2、MTD原始设备v3、MTD设备层v4、设备节点v5、文件系统404.7.3根文件系统v根文件系统(ramdisk)就是用内存空间来模拟出硬盘分区。Ramdisk通常使用磁盘文件系统的压缩镜像存放在flash上,在系统初始化时,解压到RAM并挂载为根文件系统(/)。显然ramdisk特点之一就是速度快,因为它是在RAM中运行的,但数据无法保存,重启后数据丢失。因此我们必须在Flash上划分出一个RAMDISK和另一个普通文件系统,数据都保存在普通文件系统中。414.7.3根文件系统vLinux的根文件系统可能包括如下目录:/bin(binary)/dev(device)/etc(etcetera)/home/lib(library)/mnt/proc/root/sbin/tmp(temporary)/usr(user)424.7.3根文件系统v将根文件系统的作成镜像文件系统启动后映射到内存中只读主要采用ex2/cramfs文件系统类型434.7.4普通文件系统v普通文件系统做成镜像保存用户数据可读/写常用jffs2,jaffs文件系统类型444.7.5Flash分区vFlash分区:在内核的driver/mtd/nand文件夹中的smc_s3c2410.c如下代码,决定了flash的分驱情况45static struct mtd_partition smc_partitions=name:vivi,size:0 x00030000,offset:0 x0,mask_flags:MTD_WRITEABLE,name:param,offset:0 x00030000,size:0 x00010000,flag:0,name:kernel,size:0 x00200000,offset:0 x00040000,mask_flags:MTD_WRITEABLE,/force read-only,name:root,size:0 x00A00000,offset:0 x00240000,mask_flags:MTD_WRITEABLE,/force read-only,name:user_file,size:0 x00A00000,offset:0 x00C40000,;464.7.5Flash分区vFlash分区:在vivi的源代码目录arch/s3c2410中的smdk.c文件中,也有一个分驱表47mtd_partition_t default_mtd_partitions=name:vivi,offset:0,size:0 x00030000,flag:0,name:param,offset:0 x00030000,size:0 x00010000,flag:0,name:kernel,offset:0 x00200000,size:0 x00040000,flag:0,name:root,offset:0 x00240000,size:0 x00A00000,flag:MF_BONFS,name:user_file,offset:0 x00C40000,size:0 x00A00000,flag:MF_BONFS;484.7.6根文件系统制作v在根文件系统中,为保护系统的基本设置不被更改,可以采用cramfs格式,它是一种只读的闪存文件系统。制作cramfs文件系统的方法为:建立一个目录,将需要放到文件系统的文件copy到这个目录,运行“mkcramfs目录名image名”就可以生成一个cramfs文件系统的image文件。例如如果目录名为rootfs,则正确的命令为:mkcramfsrootfsrootfs.img494.7.7普通文件系统制作v与mkcramfs类似,同样有一个mkfs.jffs2工具可以将一个目录制作为jffs2文件系统。假设把/bin目录制作为jffs2文件系统,需要运行的命令为:vmkfs.jffs2-d/bin-ojffs2.img504.8各个部分的烧写方法v进入桌面Linux(PC)v把vivi镜像文件(vivi),拷贝到系统的tftpboot目录下。v把JFLASH_2410EP_Nand文件拷贝到系统的tftpboot目录下514.8各个部分的烧写方法v连接好JTAG线(实验箱接JTAG口,PC端接并口,flash第1次烧写时需要这样的步骤)v./JFLASH_2410EP_Nand vivi /t=5v烧写完毕后复位系统,可以在超级终端中,看到如下打印信息:524.8各个部分的烧写方法534.8各个部分的烧写方法v迅速的按空格键,进入提示符状态。(如果不够快,可以一直按住系统的空格键,同时按实验箱的复位键)544.8各个部分的烧写方法554.8各个部分的烧写方法564.8各个部分的烧写方法v把vivi镜像文件(vivi),内核文件镜像文件(z_gx_2410ep_nand),根文件系统镜文件像(root_init.cramfs),普通文件系统镜像文件文件拷贝到windows系统的某目录下。v重新烧写重新烧写vivi(由于上一部已经重新将flash重新分驱,所以要重新烧写vivi。)v在超级终端中用如下命令来烧写vivi:load flash vivi x在终端中使用发送文件命令574.8各个部分的烧写方法584.8各个部分的烧写方法v烧写内核在超级终端中用如下命令来烧写内核:load flash kernel x在终端终端中使用发送文件命令594.8各个部分的烧写方法604.8各个部分的烧写方法v烧写根文件系统。在超级终端中用如下命令来烧写内核:load flash root x在终端终端中使用发送文件命令614.8各个部分的烧写方法624.8各个部分的烧写方法v烧写普通文件系统v进入宿主机Linux的tftpboot目录,用如下命令进行烧写./imagewrite /dev/mtd/4 root_OURS_Nand.cramfs:12.25mv重启实验箱634.8各个部分的烧写方法v挂载普通文件系统。v进入超级终端,执行命令:mkdir/mnt/ext1mount /dev/mtdblock/4 /mnt/ext1v所有这些命令可写在系统启动后自动执行的文件中/etc/init.d/rcS(每个系统可能不同,根据厂家)
展开阅读全文