资源描述
嵌入式系统讲义嵌入式系统讲义第第6章章 嵌入式系统软件移植嵌入式系统软件移植与与Linux下程序开发下程序开发周国运周国运2007.9嵌入式系统讲义第6章 嵌入式系统软件移植与Linux下1本章主要内容本章主要内容1、Bootloader及及vivi移植移植2、嵌入式、嵌入式Linux内核及移植内核及移植3、基于、基于Linux的应用程序开发的应用程序开发4、基于、基于Linux的驱动程序开发的驱动程序开发5、驱动程序开发实例、驱动程序开发实例本章主要内容1、Bootloader及vivi移植26.1 Bootloader 及及vivi移植移植本节内容本节内容1、Bootloader简介简介2、Bootloader工作模式工作模式 3、Bootloader启动过程启动过程4、vivi Bootloader源代码分析源代码分析5、vivi Bootloader接口命令接口命令6、vivi 源代码修改移植源代码修改移植6.1 Bootloader 及vivi移植本节内容3建立交叉编译环境建立交叉编译环境Bootloader的的/移植移植/配置配置/编译编译kernel的移植的移植/配置配置/编译编译根文件系统根文件系统Cramfs的实现的实现嵌入式系统软件开发流程嵌入式系统软件开发流程用户应用程序开发用户应用程序开发建立交叉编译环境Bootloader的/移植/配置/编译ke46.1.1 Bootloader简介简介Bootloader,为引导加载程序,为引导加载程序,是嵌入式,是嵌入式系统加电后运行的第一段代码,相当于系统加电后运行的第一段代码,相当于PC机机的的BIOS。Bootloader的位置:的位置:通常固化在硬件上的通常固化在硬件上的某个固态存储设备上,加电后自启动。某个固态存储设备上,加电后自启动。Bootloader功能:功能:初始化硬件设备、建立初始化硬件设备、建立内存空间的映射图,将系统的软、硬件环境内存空间的映射图,将系统的软、硬件环境带到一个合适的状态,以便为最终调用操作带到一个合适的状态,以便为最终调用操作系统内核准备好正确的环境。系统内核准备好正确的环境。6.1.1 Bootloader简介Bootloade5Bootloader在软件的层次位置在软件的层次位置Bootloader在软件的层次位置6Bootloader的地址:的地址:在嵌入式系统中,在嵌入式系统中,系统在上电或复位时从地址系统在上电或复位时从地址0 x0000,0000处开始执行,在这个地址处安排的就是处开始执行,在这个地址处安排的就是Bootloader。Bootloader是严重地依赖于硬件是严重地依赖于硬件而实而实现的。每种不同体系结构的处理器都有现的。每种不同体系结构的处理器都有不同的不同的Bootloader。不过。不过Bootloader的发的发展也趋于支持多种体系结构,如现在比展也趋于支持多种体系结构,如现在比较成熟的较成熟的vivi、RedBoot和和U-Boot等。等。Bootloader的地址:在嵌入式系统中,系统在上电或7几种发布的几种发布的Bootloader1、vivivivi是韩国是韩国Mizi公司开发的公司开发的Bootloader,适用于,适用于ARM9处理器。处理器。2、RedBoot RedBoot即红帽即红帽(Red Hat)嵌入式嵌入式调试引导程序,是一种用于嵌入式系统的独立调试引导程序,是一种用于嵌入式系统的独立开放源代码引导开放源代码引导/装载器。装载器。3、U-Boot U-Boot(Universal Bootloader)由)由德国德国DENX小组开发,是一款目前功能较为强小组开发,是一款目前功能较为强大的开源大的开源Bootloader程序,它支持多种处理器程序,它支持多种处理器平台,包括平台,包括ARM、PowerPC、MIPS等。等。几种发布的Bootloader1、vivivivi是韩国M86.1.2 Bootloader操作模式操作模式 大多数大多数Bootloader都有两种不同的操都有两种不同的操作模式:作模式:“启动加载启动加载”模式和模式和“下载下载”模式。其区别对于开发人员才有意义。模式。其区别对于开发人员才有意义。从最终用户的角度看,从最终用户的角度看,Bootloader的的作用就是用来加载操作系统,而并不存作用就是用来加载操作系统,而并不存在所谓的启动加载模式与下载模式的区在所谓的启动加载模式与下载模式的区别。别。6.1.2 Bootloader操作模式 大多数Boot91、启动加载(、启动加载(Bootloading)模式)模式启动加载模式称为启动加载模式称为“自举自举”(Autonomous)模式。即)模式。即Bootloader从目标机上的某个固态存储从目标机上的某个固态存储设备上将操作系统加载到设备上将操作系统加载到 RAM 中运行,中运行,整个过程并没有用户的介入。整个过程并没有用户的介入。启动加载模式是启动加载模式是 Bootloader的正常工的正常工作模式,在嵌入式产品发布的时侯,作模式,在嵌入式产品发布的时侯,Bootloader必须工作在这种模式下。必须工作在这种模式下。1、启动加载(Bootloading)模式102、下载(、下载(Downloading)模式)模式下载方式:下载方式:在这种模式下,目标机上在这种模式下,目标机上的的Bootloader将通过串口连接或网络连接将通过串口连接或网络连接等通信手段从主机下载文件。等通信手段从主机下载文件。下载内容及存储:下载内容及存储:主要是下载内核映主要是下载内核映像和根文件系统映像等。从主机下载的像和根文件系统映像等。从主机下载的文件通常首先被文件通常首先被Bootloader保存到目标机保存到目标机的的RAM中,然后再被中,然后再被 Bootloader写到目写到目标机上的标机上的FLASH 类固态存储设备中。类固态存储设备中。2、下载(Downloading)模式11下载模式应用场合:下载模式应用场合:Bootloader的这的这种模式通常在第一次安装内核与根文件种模式通常在第一次安装内核与根文件系统时被使用;此外,以后的系统更新系统时被使用;此外,以后的系统更新也会使用到这种工作模式。也会使用到这种工作模式。用户应用接口:用户应用接口:工作于这种模式下的工作于这种模式下的Bootloader通常都会向它的终端用户提供通常都会向它的终端用户提供一个简单的命令行接口。一个简单的命令行接口。如在如在RedBoot下,将出现下,将出现“RedBoot”提示符;在提示符;在vivi Bootloader 下出现下出现“vivi”提示符。提示符。下载模式应用场合:Bootloader的这种模式通常在第122、下载(、下载(Downloading)模式)模式2、下载(Downloading)模式13RedBoot的的Bootloader像像RedBoot或或U-Boot等功能强大的等功能强大的Bootloader通常都可同时支持这两种工作模通常都可同时支持这两种工作模式,而且允许用户在这两种工作模式之间进式,而且允许用户在这两种工作模式之间进行切换。行切换。比如,比如,RedBoot在启动时处于正常的启动在启动时处于正常的启动加载模式,但是它会延时加载模式,但是它会延时3秒等待终端用户秒等待终端用户按下任意键而将按下任意键而将RedBoot切换到下载模式。切换到下载模式。如在等待时间内没有接收到用户按键,则继如在等待时间内没有接收到用户按键,则继续启动续启动 Linux 内核。内核。RedBoot的Bootloader146.1.3 Bootloader启动过程启动过程Bootloader的启动可以分为两个阶段的启动可以分为两个阶段1、第一阶段、第一阶段阶段阶段1主要包含依赖于主要包含依赖于CPU体系结构及硬体系结构及硬件设备的初始化等。通常都用汇编语言来实件设备的初始化等。通常都用汇编语言来实现。这个阶段的任务有现。这个阶段的任务有5:(1)、基本的硬件设备初始化、基本的硬件设备初始化这是这是 Bootloader 一开始就执行的操作,一开始就执行的操作,其目的是为阶段其目的是为阶段2 的执行、以及随后的执行、以及随后kernel 的执行准备好一些基本的硬件环境。的执行准备好一些基本的硬件环境。6.1.3 Bootloader启动过程Bootloa15它通常包括以下工作:它通常包括以下工作:屏蔽所有的屏蔽所有的中断、设置中断、设置 CPU 的速度和时钟频率、的速度和时钟频率、关闭处理器内部指令关闭处理器内部指令/数据数据cache等。等。它通常包括以下工作:屏蔽所有的中断、设置 CPU 的速度16(2)、为阶段、为阶段2代码准备代码准备RAM空间空间为了获得更快的执行速度,通常把为了获得更快的执行速度,通常把 阶段阶段2 的代码加载到的代码加载到 RAM 空间中来执空间中来执行。行。准备准备RAM空间考虑的因素:阶段空间考虑的因素:阶段2代码大小、堆栈、页大小(代码大小、堆栈、页大小(4KB的倍的倍数)、安排位置等。数)、安排位置等。总的空间有总的空间有1MB足够,安排在足够,安排在RAM的顶端较恰当。的顶端较恰当。(2)、为阶段2代码准备RAM空间17(3)、拷贝阶段、拷贝阶段2代码到代码到RAM空间空间(4)、设置好堆栈、设置好堆栈堆栈指针堆栈指针sp设置在设置在1MB 的的 RAM 空空间的最顶端间的最顶端(堆栈向下生长堆栈向下生长)。(5)、跳转到阶段、跳转到阶段2的的C程序入口点程序入口点在上述一切都就绪后,就可以跳转在上述一切都就绪后,就可以跳转到到 Bootloader 的的 stage2 去执行了。去执行了。(3)、拷贝阶段2代码到RAM空间18 Bootloader的阶段的阶段2可执行映像刚被拷贝到可执行映像刚被拷贝到RAM空间时的系统内存布局空间时的系统内存布局 Bootloader的阶段2可执行映像刚被拷贝到RAM空间192、第二阶段、第二阶段阶段阶段2通常用通常用C语言来实现,以便语言来实现,以便实现更复杂的功能,也使程序有更好实现更复杂的功能,也使程序有更好的可读性和可移植性。这个阶段的主的可读性和可移植性。这个阶段的主要任务有要任务有5:(1)、初始化本阶段要使用到的硬、初始化本阶段要使用到的硬件件至少初始化一个串口,以便和终端至少初始化一个串口,以便和终端用户进行用户进行 I/O 输出信息等。输出信息等。2、第二阶段20(2)、检测系统内存映射、检测系统内存映射(memory map)所谓内存映射,就是指在整个物理所谓内存映射,就是指在整个物理地址空间中有哪些地址范围被分配用来地址空间中有哪些地址范围被分配用来作为系统的作为系统的 RAM 单元。为后面使用单元。为后面使用RAM、运行程序做好准备。、运行程序做好准备。(3)、将、将kernel和根文件系统映像从和根文件系统映像从flash读到读到RAM空间空间(2)、检测系统内存映射(memory map)21(4)、为、为kernel设置启动参数设置启动参数这是在调用内核之前应该做的准备工作。这是在调用内核之前应该做的准备工作。Linux 2.4.x 以后的内核都期望以标记列表以后的内核都期望以标记列表(tagged list)的形式来传递启动参数。的形式来传递启动参数。启动参数标记列表方法:以启动参数标记列表方法:以ATAG_CORE标记开始,以标记开始,以ATAG_NONE标记结束。标记结束。在嵌入式在嵌入式 Linux 系统中,通常需要由系统中,通常需要由 Boot Loader 设置的启动参数有:设置的启动参数有:ATAG_CORE、ATAG_MEM(内存映射)(内存映射)、ATAG_NONE等。等。(4)、为kernel设置启动参数22(5)、调用内核、调用内核Bootloader调用调用Linux kernel的方法是直的方法是直接跳转到内核的第一条指令处。在跳转时必接跳转到内核的第一条指令处。在跳转时必须满足下列条件:须满足下列条件:1)、CPU寄存器的设置:寄存器的设置:R0为为0;R1为机为机器类型器类型ID;R2为启动参数,标记列表在为启动参数,标记列表在RAM中的起始基地址。中的起始基地址。(机器类型参见机器类型参见 linux/arch/arm/tools/mach-types目录目录)2)、CPU模式:模式:CPU必须设置为必须设置为SVC模模式,必须禁止中断式,必须禁止中断(IRQs和和FIQs)。3)、MMU 和和 Cache的设置:的设置:MMU 必须必须关闭;指令关闭;指令 Cache 可以打开也可以关闭;可以打开也可以关闭;数据数据 Cache 必须关闭。必须关闭。(5)、调用内核236.1.4 vivi Bootloader源码分析源码分析vivi是韩国是韩国Mizi公司开发的公司开发的Bootloader,适,适用于用于ARM9处理器。处理器。vivi有两种工作模式,在启动时可以选择。有两种工作模式,在启动时可以选择。在在vivi启动时,通过串行口发出如下信息:启动时,通过串行口发出如下信息:Press Return to start the Linux now,any other key for vivi按回车键启动按回车键启动Linux OS,按其它键进入,按其它键进入vivi命令接口模式,可以使用命令接口模式,可以使用vivi提供的命令提供的命令进行一些操作。进行一些操作。6.1.4 vivi Bootloader源码分析vi24一、一、vivi源代码目录结构源代码目录结构vivi源代码包含的目录有:源代码包含的目录有:arch、Documentation、drivers、init、include、lib、scripts、test、util等等10目录,共目录,共300多个文件。多个文件。各个目录内容如下:各个目录内容如下:1、arch(architecture)目录)目录它下面的文件为与它下面的文件为与CPU硬件相关的初始化硬件相关的初始化代码,此目录包含了所用代码,此目录包含了所用vivi支持的支持的CPU。一。一般只包含般只包含S3C2410 x的文件。的文件。一、vivi源代码目录结构252、Documentation目录目录其下文件为其下文件为vivi使用指南。使用指南。3、drivers目录目录存放的为存放的为MTD(数据存储媒质)设备读(数据存储媒质)设备读写控制文件和串行口操作文件,对串行口支写控制文件和串行口操作文件,对串行口支持持xmodem和和ymodem协议。协议。4、include目录目录存放所有的头文件,包括存放所有的头文件,包括S3C2410微处理微处理器的和器的和S3C2410开发板的头文件。开发板的头文件。2、Documentation目录265、init目录目录该目录下是系统初始化文件该目录下是系统初始化文件main.c、version.c,后者是,后者是vivi版本信息,版本信息,main.c为为vivi整个初始化的结构。整个初始化的结构。6、lib目录目录该目录下是公共应用及接口代码,如时该目录下是公共应用及接口代码,如时钟功能文件钟功能文件time.c,堆栈初始化文件,堆栈初始化文件heap.c等等文件。文件。7、scripts目录目录该目录存放的是系统配置需要的脚本文该目录存放的是系统配置需要的脚本文件,如件,如menuconfig和和configue文件。文件。5、init目录278、CVS目录目录所有的目录下面都有一个所有的目录下面都有一个CVS目录,存目录,存放的是该目录的路径和它的子目录。放的是该目录的路径和它的子目录。8、CVS目录28二、二、vivi源代码文件与功能结构源代码文件与功能结构vivi源代码文件:源代码文件:1、vivi/arch/s3c2410/head.s2、一段过度,实现循环调用,、一段过度,实现循环调用,main返回后返回后重新复位重新复位LDRSP,DW_STACK_STARTMOVFP,#0MOVA2,#0BLMAINMOVPC,#FLASH_BASE3、vivi/init/main.c二、vivi源代码文件与功能结构296.1.5 vivi Bootloader接口命令接口命令vivi有两种工作模式,一种是有两种工作模式,一种是“启动加载启动加载”模式,另一种是命令行模式。利用串行口模式,另一种是命令行模式。利用串行口与主机的连接,可以进行命令行操作。与主机的连接,可以进行命令行操作。vivi启动后,通过串行口发出如下信息:启动后,通过串行口发出如下信息:Press Return to start the Linux now,any other key for vivi按下除了按下除了“Enter”之外的键,便可进入命之外的键,便可进入命令行模式。令行模式。vivi的接口命令有的接口命令有5条。条。6.1.5 vivi Bootloader接口命令vi301、load-下载文件命令下载文件命令功能:功能:将二进制文件下载到将二进制文件下载到Flash或或RAM格式:格式:load|media_type:存储器类型,:存储器类型,Flash或或RAMpartname:分区名称:分区名称addr size:下载的地址及占用空间大小:下载的地址及占用空间大小x|y|z:文件的传输协议。:文件的传输协议。x表示采用表示采用xmodem协议,协议,y表示采用表示采用ymodem协议,协议,z表表示采用示采用zmodem协议。目前协议。目前vivi仅支持仅支持xmodem协议。协议。1、load-下载文件命令31例例1:viviload flash kernel x表示下载压缩的内核映像文件表示下载压缩的内核映像文件zImage到到flash存储器的内核分区中,采用存储器的内核分区中,采用xmodem传传输协议。输协议。例例2:viviload flash 0 x80000 0 xc0000 x嵌入式系统讲义嵌入式系统软件移植与Linux下程课件322、part-MTD分区操作命令分区操作命令操作命令:操作命令:显示、增加、删除、复位、显示、增加、删除、复位、保存保存MTD分区等。分区等。各个命令格式:各个命令格式:part show:显示分区信息:显示分区信息part del:删除指定的分区:删除指定的分区part reset:恢复分区的默认值:恢复分区的默认值part save:在:在flash中保存分区和参数值中保存分区和参数值2、part-MTD分区操作命令33增加新的分区增加新的分区part add :partname:新分区名称:新分区名称offset:新分区的偏移地址:新分区的偏移地址size:新分区的大小:新分区的大小flag:新分区的类型,可以是:新分区的类型,可以是JFFS2、LOCKED、BONFS增加新的分区343、param-设置或查看分区参数命令设置或查看分区参数命令查看分区参数:查看分区参数:param show设置启动等待按键延迟:设置启动等待按键延迟:param set boot_delay n(s)设置通信初始化超时:设置通信初始化超时:param set xmodem_initial_timeout m(s)3、param354、boot-引导内核命令引导内核命令格式:格式:boot media_type|media_type:存储器类型,:存储器类型,flash或或RAMpartname:内核所在分区名称:内核所在分区名称addr:内核所在器件的偏移地址:内核所在器件的偏移地址size:内核的大小:内核的大小若若boot(无参数),则从(无参数),则从kernel内核对应的内核对应的分区中(分区中(kernel)读取内核映像启动。)读取内核映像启动。4、boot-引导内核命令36例如:例如:1、viviboot nand 0 x80000内核在内核在nand flash中,偏移地址为中,偏移地址为0 x80000,大小为缺省值,大小为缺省值0 xc00002、viviboot nor 0 x80000例如:375、flash-flash存储器管理命令存储器管理命令擦除擦除flash数据格式:数据格式:flash erase|说明:说明:对对flash只有擦除命令。只有擦除命令。例如:例如:flash erase 0 x80000 0 xc00005、flash-flash存储器管理命令38vivi接口命令接口命令命命 令令功功 能能Load下载下载flash或或RAM命令命令PartMTD分区操作命令分区操作命令param设置、查看参数命令设置、查看参数命令Boot启动系统命令启动系统命令flashFlash管理命令管理命令第三讲到此第三讲到此vivi接口命令命 令功 能Load下载f396.1.6 vivi源码的修改移植源码的修改移植vivi的移植方法步骤:的移植方法步骤:对对vivi进行修改移植进行修改移植对对vivi进行配置进行配置对对vivi进行编译进行编译下载、运行下载、运行vivi一、对一、对vivi进行修改移植进行修改移植设设Linux系统的目录结构为系统的目录结构为6.1.6 vivi源码的修改移植vivi的移植方法步40设设Linux系统的目录结构为系统的目录结构为:cygwinfriendly-arm crosstool kernel vivi设Linux系统的目录结构为:411、修改、修改vivi/Makefile(1)修改交叉编译库和头文件)修改交叉编译库和头文件1)修改编译器路径:)修改编译器路径:将:将:CROSS_COMPILE=/opt/host/armv4l/bin/armv4l-unknown-linux-修改为:修改为:CROSS_COMPILE=arm-linux-gcc的路径的路径如:如:CROSS_COMPILE =/friendly-arm/crosstool/arm-linux/gcc-2.95.3-glibc-2.2.3/bin/arm-linux-1、修改vivi/Makefile422)修改编译器库文件路径:)修改编译器库文件路径:将:将:ARM_GCC_LIBS=/opt/host/armv4l/bin/gcc-lib/armv4l-unknown-linux/2.95.2修改为:修改为:ARM_GCC_LIBS=符合本机的路径符合本机的路径如:如:ARM_GCC_LIBS=/friendly-arm/crosstool/arm-linux/gcc-2.95.3-glibc-2.2.3/lib/gcc-lib/arm-linux/2.95.3 2)修改编译器库文件路径:433)增加交叉编译时头文件的搜索路径:)增加交叉编译时头文件的搜索路径:LIBC_INCLUDE_DIR=本机的本机的include的路径的路径如:如:LIBC_INCLUDE_DIR=/friendly-arm/crosstool/arm-linux/gcc-2.95.3-glibc-2.2.3/include3)增加交叉编译时头文件的搜索路径:44(2)Linux内核包含文件内核包含文件 修改修改Linux头文件所在路径头文件所在路径将:将:LINUX_INCLUDE_DIR=/opt/host/armv4l/include改为:改为:LINUX_INCLUDE_DIR=符合本机的符合本机的如:如:LINUX_INCLUDE_DIR=/friendly-arm/kernel/include(2)Linux内核包含文件 452、修改、修改vivi中与硬件相关的部分中与硬件相关的部分只需要修改:只需要修改:/friendly-arm/vivi/include/platform/下面的文件下面的文件smdk2410.h即可即可。文件文件smdk2410.h的内容是针对开发板的的内容是针对开发板的硬件配置的,主要有:时钟设置、存储器初硬件配置的,主要有:时钟设置、存储器初始化、通用始化、通用I/O口初始化、口初始化、UART初始化、初始化、vivi初始配置等。初始配置等。根据自己的目标板的实际情况进行设置根据自己的目标板的实际情况进行设置即可。即可。2、修改vivi中与硬件相关的部分463、支持、支持Nor Flash启动的修改启动的修改(vivi/arch/s3c2410/smdk.c)(1)Nor flash分区分区对于一个嵌入式系统,可能会采用对于一个嵌入式系统,可能会采用Nor flash、Nand flash、SDRAM等多种介质构等多种介质构成存储器系统,成存储器系统,Nor flash(如(如1、2MB)用)用于存放、运行于存放、运行bootloader,Nand flash用于存用于存放操作系统、其它系统软件、应用程序和各放操作系统、其它系统软件、应用程序和各种文件,种文件,SDRAM用于运行程序和存放数据。用于运行程序和存放数据。如果系统有如果系统有Nor flash存储器(一般没有)存储器(一般没有),则需要做相应修改。,则需要做相应修改。3、支持Nor Flash启动的修改47修改方法:修改方法:在在vivi/arch/s3c2410/smdk.c中中的分区代码,添加上的分区代码,添加上Nor flash分区:分区:#ifdef CONFIG_S3C2410_AMD_BOOTmtd_partition_t default_mtd_partitions=name:vivi,offset:0,size:0 x00020000,flag:0,修改方法:在vivi/arch/s3c2410/smdk48name:param,offset:0 x00020000,size:0 x00010000,flag:0,name:kernel,offset:0 x00030000,size:0 x000C0000,flag:0,49name:root,offset:0 x00100000,size:0 x00140000,flag:MF_BONFS;#endif50(2)内核启动参数设置)内核启动参数设置经过上面修改,系统板可以从经过上面修改,系统板可以从Nand flash中启动中启动Linux,也可以从,也可以从Nor flash中启动中启动Linux,另外还需要修改启动命令:,另外还需要修改启动命令:(2)内核启动参数设置51还需要修改启动命令:还需要修改启动命令:#ifdef CONFIG_S3C2410_NAND_BOOTChar Linux_cmd =noinitrd root=/dev/bon/2 init=/linuxrc console=tty1console=ttyS0;#elseChar Linux_cmd =noinitrd root=/dev/mtdblock/3init=/linuxrc console=tty1 console=ttyS0;还需要修改启动命令:52式中启动命令:式中启动命令:noinitrd:不使用:不使用ramdisk;root:根文件系统所在的:根文件系统所在的MTD分区分区init:内核运行入口命令文件:内核运行入口命令文件console:内核信息输出控制台:内核信息输出控制台ttyS0表示串行口;表示串行口;tty0表示虚拟终端表示虚拟终端LCD。说明:说明:关于关于Linux启动命令的参数,可以参考启动命令的参数,可以参考Kernel/Documentatio/下面的文件下面的文件kernel-parameters.txt。式中启动命令:534、增加一种下载操作、增加一种下载操作load flash j操作操作在在Nand启动时,可以从启动时,可以从JTAG下载程序到下载程序到SDRAM(0 x30000000),然后用),然后用“load flashj”来烧写相应的分区,并且来烧写相应的分区,并且可以做可以做vivi、kernel、root这这3个分区的操作。个分区的操作。其中大部分操作与使用其中大部分操作与使用X-Modem和和 Y-Modem等功能类似等功能类似,所以命名为所以命名为J-Modem,并特别修改以下并特别修改以下3个部分。个部分。4、增加一种下载操作54(1)在)在 vivi/include/priv_data.h中增加宏定义中增加宏定义原来为:原来为:#define X_MODEM1#define Y_MODEM2#define Z_MODEM3增加:增加:#define JTAG_D4(1)在 vivi/include/priv_data.55(2)在)在 vivi/lib/load_file.c中中增加对增加对J-Modem的识别的识别原来为:原来为:modem_is(const char*mt)else if(strncmp(z,mt,1)=0)return Z_MODEM;else return UNKNOWN_MODEM;(2)在 vivi/lib/load_file.c中56修改为:修改为:modem_is(const char*mt)else if(strncmp(z,mt,1)=0)return Z_MODEM;else if(strncmp(“J,mt,1)=0)return JTAG_D;else return UNKNOWN_MODEM;说明说明:该修改仅提高了下载到该修改仅提高了下载到SDRAM的速度的速度修改为:57二、对二、对vivi进行配置进行配置运行运行vivi配置程序配置程序menuconfig:makemenuconfig启动对启动对vivi配置的主菜单,根据自己的目配置的主菜单,根据自己的目标系统逐项进行设置,设置完后退出保存即标系统逐项进行设置,设置完后退出保存即可。可。二、对vivi进行配置58嵌入式系统讲义嵌入式系统软件移植与Linux下程课件59三、对三、对vivi进行编译进行编译在在vivi目录下执行以下命令:目录下执行以下命令:makecleanmake make clean是清除以前编译时生成的所有是清除以前编译时生成的所有目标文件和临时文件。目标文件和临时文件。如果没有错误,编译后会生成如果没有错误,编译后会生成vivi的目标的目标文件文件vivi.bin。三、对vivi进行编译60四、对四、对vivi进行下载进行下载利用利用JTAG口将口将vivi下载到目标板的下载到目标板的Nor flash空间(空间(0 x00000-0 x20000)。)。然后对目标板加电,使然后对目标板加电,使vivi启动运行,观启动运行,观察运行情况。察运行情况。嵌入式系统讲义嵌入式系统软件移植与Linux下程课件616.2 Linux内核及移植内核及移植本节内容本节内容1、Linux内核结构内核结构2、Linux移植移植3、Linux编译编译4、Linux下载下载6.2 Linux内核及移植本节内容626.2.1 Linux内核结构内核结构一、一、Linux操作系统的移植性操作系统的移植性Linux操作系统具有很好的移植性操作系统具有很好的移植性,能够,能够很方便地从一个硬件平台移植到另一个硬件很方便地从一个硬件平台移植到另一个硬件平台上,其根本原因是平台上,其根本原因是Linux操作系统的代操作系统的代码,将与硬件相关的代码与硬件无关的代码码,将与硬件相关的代码与硬件无关的代码是分开编写的。是分开编写的。Linux移植所涉及的文件:移植所涉及的文件:对对Linux移植移植时,只需要修改与硬件相关的代码即可,涉时,只需要修改与硬件相关的代码即可,涉及的文件主要是各个目录下的及的文件主要是各个目录下的makefile文件,文件,以及少数的汇编语言文件。以及少数的汇编语言文件。6.2.1 Linux内核结构一、Linux操作系统的63一、一、Linux内核结构内核结构Linux内核有内核有12个主目录,个主目录,700多个子目多个子目录,文件总数录,文件总数11000多个,总长度多个,总长度120多多MB。Linux内核的主目录为:内核的主目录为:arch、drivers、fs、include、init、ipc、kernel、lib、mm、net、1、arch目录目录arch目录包含了与硬件体系结构相关的内目录包含了与硬件体系结构相关的内核代码,其下面的每一个目录都是一种硬件核代码,其下面的每一个目录都是一种硬件平台,如平台,如ARM和和PC机的机的i386。对于每一平。对于每一平一、Linux内核结构64台都包含以下几个目录。台都包含以下几个目录。boot:与平台相关的启动内核代码:与平台相关的启动内核代码kernel:与平台相关的内核代码:与平台相关的内核代码lib:与平台相关的通用函数:与平台相关的通用函数mm:与平台相关的内存管理代码:与平台相关的内存管理代码math-emu:与平台相关的模拟:与平台相关的模拟FPU代码代码显然,内核移植的重点就是该目录下面显然,内核移植的重点就是该目录下面的文件。的文件。2、drivers目录目录该目录下面保存的是所用设备的驱动程该目录下面保存的是所用设备的驱动程序,其下的每个目录是一种设备。序,其下的每个目录是一种设备。台都包含以下几个目录。653、fs目录目录该目录下面列出了该目录下面列出了Linux所支持的文件系所支持的文件系统,其下每个目录代表一种文件系统,文件统,其下每个目录代表一种文件系统,文件系统代码与平台无关。系统代码与平台无关。4、include目录目录该目录下面是编译内核所需要的头文件,该目录下面是编译内核所需要的头文件,与平台无关的部分在与平台无关的部分在linux子目录下面,其余子目录下面,其余的子目录都是与各种平台相关的头文件。的子目录都是与各种平台相关的头文件。5、init目录目录其下只有两个文件:其下只有两个文件:main.c和和version.c,前者是核心的初始化代码,后者是版本信息前者是核心的初始化代码,后者是版本信息3、fs目录666、ipc目录目录其文件是核心进程的通信代码。其文件是核心进程的通信代码。7、kernel目录目录为与平台无关的内核管理代码,与平台为与平台无关的内核管理代码,与平台相关部分在相关部分在arch/*/kernel下面。下面。8、lib目录目录该目录下面的文件是与平台无关的通用该目录下面的文件是与平台无关的通用函数。函数。9、mm目录目录该目录下面的文件是与平台无关的内存该目录下面的文件是与平台无关的内存管理代码,与平台相关部分在管理代码,与平台相关部分在arch/*/mm下面。下面。6、ipc目录6710、net目录目录是网络功能代码,其每个子目录对应网是网络功能代码,其每个子目录对应网络的一个方面。络的一个方面。11、其它目录、其它目录Documentation目录下存放的是说明和应目录下存放的是说明和应用文档,用文档,scripts目录下存放的是配置内核脚目录下存放的是配置内核脚本。本。另外在每个目录下几乎都有一个另外在每个目录下几乎都有一个depend文件和文件和Makefile文件,文件,depend是被包含在是被包含在Makefile中的,编译目标所依赖的头文件。中的,编译目标所依赖的头文件。10、net目录686.2.2 Linux移植移植对于后面的移植,假设内核的目录为对于后面的移植,假设内核的目录为/my-arm/kernel,并且设环境变量为,并且设环境变量为$KERNELCODE=/my-arm/kernel。一、一、/my-arm/kernel-根目录根目录根目录下只需要修改根目录下只需要修改Makefile文件。该文文件。该文件的任务有两个:产生件的任务有两个:产生Linux内核镜像压缩内核镜像压缩文件文件vmlinux和内核模块,和内核模块,Makefile递归进入递归进入到各个子目录中,调用子目录中的到各个子目录中,调用子目录中的Makefile最终产生出目标文件。最终产生出目标文件。6.2.2 Linux移植对于后面的移植,假设内核的目69需要修改的内容:需要修改的内容:(1)指定目标平台:)指定目标平台:将:将:ARCH:=$(shell uname m|sed e s/i.86/i.386修改为:修改为:ARCH:=arm(2)指定交叉编译器)指定交叉编译器将:将:CROSS_COMPILE=修改为:修改为:CROSS_COMPILE=/friendly-arm/crosstool/arm-linux/gcc-2.95.3-glibc-2.2.3/bin/arm-linux-需要修改的内容:70(3)修改)修改TOPDIR将:将:TOPDIR:=$(shell bin/pwd)修改为:修改为:TOPDIR:=$(/my-arm/kernel)(4)修改)修改exportINSTALL_MOD_PATH将:将:INSTALL_MOD_PATH=/root修改为:修改为:INSTALL_MOD_PATH=/my-arm/kernel/arch/arm/root(3)修改TOPDIR71二、二、arch/arm目录目录1、对、对Makefile文件的修改文件的修改ifeq($(CONFIG_ARCH_S3C2410),y)TEXTADDR=0 xC0008000MACHINE=s3c2410endifTEXTADDR决定内核起始运行地址决定内核起始运行地址,即,即image.ram应下载的位置,其值与具体目标应下载的位置,其值与具体目标板有关。板有关。0 xC0008000的含义:从地址的含义:从地址0 xC0000000开始,共有开始,共有32MB空间。空间。二、arch/arm目录722、对、对config.in文件的修改文件的修改config.in是配置文件,运行是配置文件,运行menuconfig时出现的菜时出现的菜单就是单就是config.in的内容。因为的内容。因为2.4.18内核没有中没有内核没有中没有S3C2410 x处理器的信息,所以需要加入相关信息。处理器的信息,所以需要加入相关信息。(1)添加)添加CONFIG_ARCH_S3C2410子选项子选项修改后为:修改后为:if“$CONFIG_ARCH_S3C2410”=“y”;thencomment S3C2410 Implementationdep_bool SMDK(MERI TECH BOARD)CONFIG_S3C2410_SMCK$CONFIG_ARCH_S3C2410fi2、对config.in文件的修改73(2)其它选项)其它选项在在:if“$CONFIG_FOOTBRIDGE_HOST”=“y”o“$CONFIG_ARCH_SA1100”=“y”;then中间添加:中间添加:“$CONFIG_ARCH_S3C410”=“y”o(2)其它选项74三、三、arch/arm/boot目录目录1、Makefile文件需要考虑修改的内容文件需要考虑修改的内容ifeq($(CONFIG_ARCH_S3C2410),y)ZTEXTADDR=0 x30008000ZRELADDR=0 x30208000endifZRELADDR为内核解压后输出的地址。为内核解压后输出的地址。ZTEXTADDR为为Boorloader执行的起始地址,执行的起始地址,若直接启动执行,则设为若直接启动执行,则设为0,否则为装入,否则为装入RAM中的开始地址。中的开始地址。这两个地址由具体的目标板决定。这两个地址由具体的目标板决定。随目标变化随目标变化随目标板变化随目标板变化三、arch/arm/boot目录随目标变化随目标板变化752、compressed/Makefile修改后:修改后:ifeq($(CONFIG_ARCH_S3C2410),y)OBJS+=head-s3c2410.oendif加入加入head-s3c2410.o3、compressed/head-s3c2410.S这是新加入的文件这是新加入的文件2、compressed/Makefile76#include#include#include.section.start,#alloc,#execinstr_S3C2410_start:bic r2,pc,#0 x1fadd r3,r2,#0 x4000 16 kb is quite enough.1:ldr r0,r2,#32teq r2,r3bne1bmcrp15,0,r0,c7,c10,4drain WBmcrp15,0,r0,c7,c7,0flush I&D caches#include 77#if 0 disabling MMU and cachesmrcp15,0,r0,c1,c0,0 read control registerbicr0,r0,#0 x05 disable D cache and MMUbic r0,r0,#1000 disable I cachemcr p15,0,r0,c1,c0,0#endif#if 078movr0,#0 x002000001:subsr0,r0,#1bne1bmovr0,#0 x00200000796.2.3 Linux编译编译Linux内核的编译需要以下三步操作。内核的编译需要以下三步操作。一、配置内核一、配置内核可以执行以下几个命令:可以执行以下几个命令:makeconfigmakemenuconfigmakexconfig makeoldconfig make config命令在文本方式界面下进行配置命令在文本方式界面下进行配置 make menuconfig命令在菜单界面下进行配置命令在菜单界面下进行配置 make xconfig命令在图形界面下进行配置命令在图形界面下进行配置6.2.3 Linux编译Linux内核的编译需要以下80配置过程共配置过程共130多个选项。多个选项。配置完成后会生成配置完成后会生成.config文件,并且在文件,并且在include/linux/目录下生成一个自动配置文件目录下生成一个自动配置文件autoconf.h,保存配置信息,下次配置产生,保存配置信息,下次配置产生新的新的.config和和autoconf.h文件,原来的文件,原来的.config被更名为被更名为.config.old。二、创建内核的依赖关系二、创建内核的依赖关系命令命令:makedep该命令搜索该命令搜索Linux编译输出与源代码头文编译输出与源代码头文件之间的依赖关系,并生成依赖文件。件之间的依赖关系,并生成依赖文件。配置过程共130多个选项。81三、编译内核三、编译内核makecleanmakezImagemakemodulesmakemodules_installmake clean是清除以前构造内核时生成的是清除以前构造内核时生成的所有目标文件、模块文件和临时文件。所有目标文件、模块文件和临时文件。make zImage是编译内核,生成压缩的内是编译内核,生成压缩的内核映像文件核映像文件,存放在存放在/arch/arm/boot目录下。目录下。Make modules是创建内核模块。是创建内核模块。Make modules_install是创建内核模块安是创建内核模块安装信息文件。装信息文件。三、编译内核826.3 嵌入式应用程序开发过程嵌入式应用程序开发过程需要以下几个步骤。需要以下几个步骤。一、编写源程序一、编写源程序如编写一个如编写一个“hello.c”程序,在程序,在Linux下、下、用编辑软件用编辑软件vim进行编辑,源程序为:进行编辑,源程序为:#includeintmain()printf(“Hello world!n”);6.3 嵌入式应用程序开发过程需要以下几个步骤。83二、编译程序二、编译程序在在Linux下,用交叉编译软件对下,用交叉编译软件对“hello.c”进行编译,命令为:进行编译,命令为:arm-linux-gcc o hello hello.c生成在生成在ARM下运行的可执行文件下运行的可执行文件hello.exe 三、下载程序三、下载程序通过通过vivi或网络下载程序。或网络下载程序。二、编译程序84作作 业业P25210、12、14作 业85嵌入式系统讲义嵌入式系统软件移植与Linux下程课件86嵌入式系统讲义嵌入式系统软件移植与Linux下程课件87嵌入式系统讲义嵌入式系统软件移植与Linux下程课件88嵌入式系统讲义嵌入式系统软件移植与Linux下程课件89嵌入式系统讲义嵌入式系统软件移植与Linux下程课件90嵌入式系统讲义嵌入式系统软件移植与Linux下程课件91嵌入式系统讲义嵌入式系统软件移植与Linux下程课件92嵌入式系统讲义嵌入式系统软件移植与Linux下程课件93嵌入式系统讲义嵌入式系统软件移植与Linux下程课件94嵌入式系统讲义嵌入式系统软件移植与Linux下程课件95嵌入式系统讲义嵌入式系统软件移植与Linux下程课件96嵌入式系统讲义嵌入式系统软件移植与Linux下程课件97嵌入式系统讲义嵌入式系统软件移植与Linux下程课件98嵌入式系统讲义嵌入式系统软件移植与Linux下程课件99嵌入式系统讲义嵌入式系统软件移植与Linux下程课件100嵌入式系统讲义嵌入式系统软件移植与Linux下程课件101嵌入式系统讲义嵌入式系统软件移植与Linux下程课件102嵌入式系统讲义嵌入式系统软件移植与Linux下程课件103嵌入式系统讲义嵌入式系统软件移植与Linux下程课件104嵌入式系统讲义嵌入式系统软件移植与Linux下程课件105嵌入式系统讲义嵌入式系统软件移植与Linux下程课件106嵌入式系统讲义嵌入式系统软件移植与Linux下程课件107
展开阅读全文