嵌入式系统讲义嵌入式系统软件移植与Linux下程课件_第1页
嵌入式系统讲义嵌入式系统软件移植与Linux下程课件_第2页
嵌入式系统讲义嵌入式系统软件移植与Linux下程课件_第3页
嵌入式系统讲义嵌入式系统软件移植与Linux下程课件_第4页
嵌入式系统讲义嵌入式系统软件移植与Linux下程课件_第5页
已阅读5页,还剩209页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

嵌入式系统讲义

第6章嵌入式系统软件移植与Linux下程序开发周国运2007.9嵌入式系统讲义

第6章嵌入式系统软件移植与Linux下1本章主要内容1、Bootloader及vivi移植2、嵌入式Linux内核及移植3、基于Linux的应用程序开发4、基于Linux的驱动程序开发5、驱动程序开发实例本章主要内容1、Bootloader及vivi移植26.1Bootloader及vivi移植本节内容1、Bootloader简介2、Bootloader工作模式3、Bootloader启动过程4、viviBootloader源代码分析5、viviBootloader接口命令6、vivi源代码修改移植6.1Bootloader及vivi移植本节内容3建立交叉编译环境Bootloader的/移植/配置/编译kernel的移植/配置/编译根文件系统Cramfs的实现嵌入式系统软件开发流程用户应用程序开发建立交叉编译环境Bootloader的/移植/配置/编译ke46.1.1Bootloader简介

Bootloader,为引导加载程序,是嵌入式系统加电后运行的第一段代码,相当于PC机的BIOS。

Bootloader的位置:通常固化在硬件上的某个固态存储设备上,加电后自启动。

Bootloader功能:初始化硬件设备、建立内存空间的映射图,将系统的软、硬件环境带到一个合适的状态,以便为最终调用操作系统内核准备好正确的环境。6.1.1Bootloader简介 Bootloade5 Bootloader在软件的层次位置 Bootloader在软件的层次位置6

Bootloader的地址:在嵌入式系统中,系统在上电或复位时从地址0x0000,0000处开始执行,在这个地址处安排的就是Bootloader。

Bootloader是严重地依赖于硬件而实现的。每种不同体系结构的处理器都有不同的Bootloader。不过Bootloader的发展也趋于支持多种体系结构,如现在比较成熟的vivi、RedBoot和U-Boot等。 Bootloader的地址:在嵌入式系统中,系统在上电或7几种发布的Bootloader1、vivi vivi是韩国Mizi公司开发的Bootloader,适用于ARM9处理器。2、RedBootRedBoot即红帽(RedHat)嵌入式调试引导程序,是一种用于嵌入式系统的独立开放源代码引导/装载器。3、U-BootU-Boot(UniversalBootloader)由德国DENX小组开发,是一款目前功能较为强大的开源Bootloader程序,它支持多种处理器平台,包括ARM、PowerPC、MIPS等。几种发布的Bootloader1、vivi vivi是韩国M86.1.2Bootloader操作模式 大多数Bootloader都有两种不同的操作模式:“启动加载”模式和“下载”模式。其区别对于开发人员才有意义。 从最终用户的角度看,Bootloader的作用就是用来加载操作系统,而并不存在所谓的启动加载模式与下载模式的区别。6.1.2Bootloader操作模式 大多数Boot91、启动加载(Bootloading)模式 启动加载模式称为“自举”(Autonomous)模式。即Bootloader从目标机上的某个固态存储设备上将操作系统加载到RAM中运行,整个过程并没有用户的介入。 启动加载模式是Bootloader的正常工作模式,在嵌入式产品发布的时侯,Bootloader必须工作在这种模式下。1、启动加载(Bootloading)模式102、下载(Downloading)模式

下载方式:在这种模式下,目标机上的Bootloader将通过串口连接或网络连接等通信手段从主机下载文件。

下载内容及存储:主要是下载内核映像和根文件系统映像等。从主机下载的文件通常首先被Bootloader保存到目标机的RAM中,然后再被Bootloader写到目标机上的FLASH类固态存储设备中。2、下载(Downloading)模式11

下载模式应用场合:Bootloader的这种模式通常在第一次安装内核与根文件系统时被使用;此外,以后的系统更新也会使用到这种工作模式。

用户应用接口:工作于这种模式下的Bootloader通常都会向它的终端用户提供一个简单的命令行接口。如在RedBoot下,将出现“RedBoot>”提示符;在viviBootloader下出现“vivi>”提示符。 下载模式应用场合:Bootloader的这种模式通常在第122、下载(Downloading)模式2、下载(Downloading)模式13RedBoot的Bootloader 像RedBoot或U-Boot等功能强大的Bootloader通常都可同时支持这两种工作模式,而且允许用户在这两种工作模式之间进行切换。 比如,RedBoot在启动时处于正常的启动加载模式,但是它会延时3秒等待终端用户按下任意键而将RedBoot切换到下载模式。如在等待时间内没有接收到用户按键,则继续启动Linux内核。RedBoot的Bootloader146.1.3Bootloader启动过程

Bootloader的启动可以分为两个阶段

1、第一阶段 阶段1主要包含依赖于CPU体系结构及硬件设备的初始化等。通常都用汇编语言来实现。这个阶段的任务有5: (1)、基本的硬件设备初始化 这是Bootloader一开始就执行的操作,其目的是为阶段2的执行、以及随后kernel的执行准备好一些基本的硬件环境。6.1.3Bootloader启动过程 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)、检测系统内存映射(memorymap) 所谓内存映射,就是指在整个物理地址空间中有哪些地址范围被分配用来作为系统的RAM单元。为后面使用RAM、运行程序做好准备。 (3)、将kernel和根文件系统映像从flash读到RAM空间 (2)、检测系统内存映射(memorymap)21

(4)、为kernel设置启动参数 这是在调用内核之前应该做的准备工作。Linux2.4.x以后的内核都期望以标记列表(taggedlist)的形式来传递启动参数。 启动参数标记列表方法:以ATAG_CORE标记开始,以ATAG_NONE标记结束。 在嵌入式Linux系统中,通常需要由BootLoader设置的启动参数有:ATAG_CORE、ATAG_MEM(内存映射)、ATAG_NONE等。 (4)、为kernel设置启动参数22

(5)、调用内核 Bootloader调用Linuxkernel的方法是直接跳转到内核的第一条指令处。在跳转时必须满足下列条件: 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.4viviBootloader源码分析

vivi是韩国Mizi公司开发的Bootloader,适用于ARM9处理器。 vivi有两种工作模式,在启动时可以选择。在vivi启动时,通过串行口发出如下信息:PressReturntostarttheLinuxnow,anyotherkeyforvivi 按回车键启动LinuxOS,按其它键进入vivi命令接口模式,可以使用vivi提供的命令进行一些操作。6.1.4viviBootloader源码分析 vi24一、vivi源代码目录结构 vivi源代码包含的目录有:arch、Documentation、drivers、init、include、lib、scripts、test、util等10目录,共300多个文件。各个目录内容如下:

1、arch(architecture)目录 它下面的文件为与CPU硬件相关的初始化代码,此目录包含了所用vivi支持的CPU。一般只包含S3C2410x的文件。一、vivi源代码目录结构25

2、Documentation目录 其下文件为vivi使用指南。

3、drivers目录 存放的为MTD(数据存储媒质)设备读写控制文件和串行口操作文件,对串行口支持xmodem和ymodem协议。

4、include目录 存放所有的头文件,包括S3C2410微处理器的和S3C2410开发板的头文件。 2、Documentation目录26

5、init目录 该目录下是系统初始化文件main.c、version.c,后者是vivi版本信息,main.c为vivi整个初始化的结构。

6、lib目录 该目录下是公共应用及接口代码,如时钟功能文件time.c,堆栈初始化文件heap.c等文件。

7、scripts目录 该目录存放的是系统配置需要的脚本文件,如menuconfig和configue文件。 5、init目录27 8、CVS目录 所有的目录下面都有一个CVS目录,存放的是该目录的路径和它的子目录。 8、CVS目录28

二、vivi源代码文件与功能结构 vivi源代码文件: 1、vivi/arch/s3c2410/head.s 2、一段过度,实现循环调用,main返回后重新复位 LDR SP, DW_STACK_START MOV FP, #0 MOV A2, #0 BL MAIN MOV PC, #FLASH_BASE 3、vivi/init/main.c 二、vivi源代码文件与功能结构296.1.5viviBootloader接口命令 vivi有两种工作模式,一种是“启动加载”模式,另一种是命令行模式。利用串行口与主机的连接,可以进行命令行操作。 vivi启动后,通过串行口发出如下信息:PressReturntostarttheLinuxnow,anyotherkeyforvivi 按下除了“Enter”之外的键,便可进入命令行模式。 vivi的接口命令有5条。6.1.5viviBootloader接口命令 vi30

1、load---下载文件命令

功能:将二进制文件下载到Flash或RAM格式:load<media_type>[<partname>|<addr><size>]<x|y|z> media_type:存储器类型,Flash或RAM partname:分区名称 addrsize:下载的地址及占用空间大小 x|y|z:文件的传输协议。x表示采用xmodem协议,y表示采用ymodem协议,z表示采用zmodem协议。目前vivi仅支持xmodem协议。 1、load---下载文件命令31

例1:vivi>loadflashkernelx 表示下载压缩的内核映像文件zImage到flash存储器的内核分区中,采用xmodem传输协议。

例2:vivi>loadflash0x800000xc0000x嵌入式系统讲义嵌入式系统软件移植与Linux下程课件32 2、part---MTD分区操作命令

操作命令:显示、增加、删除、复位、保存MTD分区等。

各个命令格式: partshow:显示分区信息 partdel<partname>:删除指定的分区 partreset:恢复分区的默认值 partsave:在flash中保存分区和参数值 2、part---MTD分区操作命令33 增加新的分区partadd<partname><offset><size><flag>: partname:新分区名称 offset:新分区的偏移地址 size:新分区的大小 flag:新分区的类型,可以是JFFS2、LOCKED、BONFS 增加新的分区34

3、param---设置或查看分区参数命令 查看分区参数:paramshow 设置启动等待按键延迟: paramsetboot_delayn(μs) 设置通信初始化超时:

paramsetxmodem_initial_timeoutm(μs) 3、param35

4、boot---引导内核命令格式:boot[media_type][<partname>|<addr><size>] media_type:存储器类型,flash或RAM partname:内核所在分区名称 addr:内核所在器件的偏移地址 size:内核的大小若 boot (无参数),则从kernel内核对应的分区中(kernel)读取内核映像启动。 4、boot---引导内核命令36 例如: 1、vivi>bootnand0x80000 内核在nandflash中,偏移地址为0x80000,大小为缺省值0xc0000 2、vivi>bootnor0x80000 例如:37

5、flash---flash存储器管理命令

擦除flash数据格式:flasherase[<partname>|<offset><size>] 说明: 对flash只有擦除命令。 例如: flasherase0x800000xc0000 5、flash---flash存储器管理命令38vivi接口命令命令功能Load下载flash或RAM命令PartMTD分区操作命令param设置、查看参数命令Boot启动系统命令flashFlash管理命令第三讲到此vivi接口命令命令功能Load下载f396.1.6vivi源码的修改移植 vivi的移植方法步骤: 对vivi进行修改移植 对vivi进行配置 对vivi进行编译 下载、运行vivi

一、对vivi进行修改移植设Linux系统的目录结构为 6.1.6vivi源码的修改移植 vivi的移植方法步40 设Linux系统的目录结构为:cygwin friendly-arm crosstool kernel vivi … 设Linux系统的目录结构为:41

1、修改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/Makefile42

2)修改编译器库文件路径:将: 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)修改编译器库文件路径:43

3)增加交叉编译时头文件的搜索路径:

LIBC_INCLUDE_DIR=本机的include的路径如:

LIBC_INCLUDE_DIR=/friendly-arm/crosstool/arm-linux/gcc-2.95.3-glibc-2.2.3/include 3)增加交叉编译时头文件的搜索路径:44

(2)Linux内核包含文件修改Linux头文件所在路径将:LINUX_INCLUDE_DIR=/opt/host/armv4l/include改为:

LINUX_INCLUDE_DIR=符合本机的如: LINUX_INCLUDE_DIR=/friendly-arm/kernel/include (2)Linux内核包含文件45

2、修改vivi中与硬件相关的部分 只需要修改:/friendly-arm/vivi/include/platform/ 下面的文件smdk2410.h即可。 文件smdk2410.h的内容是针对开发板的硬件配置的,主要有:时钟设置、存储器初始化、通用I/O口初始化、UART初始化、vivi初始配置等。 根据自己的目标板的实际情况进行设置即可。

2、修改vivi中与硬件相关的部分46

3、支持NorFlash启动的修改(vivi/arch/s3c2410/smdk.c)

(1)Norflash分区 对于一个嵌入式系统,可能会采用Norflash、Nandflash、SDRAM等多种介质构成存储器系统,Norflash(如1、2MB)用于存放、运行bootloader,Nandflash用于存放操作系统、其它系统软件、应用程序和各种文件,SDRAM用于运行程序和存放数据。 如果系统有Norflash存储器(一般没有),则需要做相应修改。 3、支持NorFlash启动的修改47

修改方法:在vivi/arch/s3c2410/smdk.c中的分区代码,添加上Norflash分区:#ifdefCONFIG_S3C2410_AMD_BOOTmtd_partition_tdefault_mtd_partitions[]={ { name: "vivi", offset: 0, size: 0x00020000, flag: 0 }, 修改方法:在vivi/arch/s3c2410/smdk48 { name: "param", offset: 0x00020000, size: 0x00010000, flag: 0 },{ name: "kernel", offset: 0x00030000, size: 0x000C0000, flag: 0 }, {49 { name: "root", offset: 0x00100000, size: 0x00140000, flag: MF_BONFS }};#endif {50

(2)内核启动参数设置 经过上面修改,系统板可以从Nandflash中启动Linux,也可以从Norflash中启动Linux,另外还需要修改启动命令: (2)内核启动参数设置51 还需要修改启动命令:#ifdefCONFIG_S3C2410_NAND_BOOTCharLinux_cmd[]=

"noinitrdroot=/dev/bon/2init=/linuxrc console=tty1 console=ttyS0";#elseCharLinux_cmd[]=

"noinitrdroot=/dev/mtdblock/3 init=/linuxrcconsole=tty1console=ttyS0"; 还需要修改启动命令:52 式中启动命令: noinitrd :不使用ramdisk; root :根文件系统所在的MTD分区 init :内核运行入口命令文件 console :内核信息输出控制台 ttyS0表示串行口; tty0表示虚拟终端LCD。 说明: 关于Linux启动命令的参数,可以参考Kernel/Documentatio/下面的文件 kernel-parameters.txt。 式中启动命令:53

4、增加一种下载操作loadflash<partname>j操作 在Nand启动时,可以从JTAG下载程序到SDRAM(0x30000000),然后用“loadflash<partname>j”来烧写相应的分区,并且可以做vivi、kernel、root这3个分区的操作。其中大部分操作与使用X-Modem和Y-Modem等功能类似,所以命名为J-Modem,并特别修改以下3个部分。 4、增加一种下载操作54 (1)在vivi/include/priv_data.h中增加宏定义 原来为:#defineX_MODEM 1#defineY_MODEM 2#defineZ_MODEM 3

增加:#defineJTAG_D 4 (1)在vivi/include/priv_data.55 (2)在vivi/lib/load_file.c中增加对J-Modem的识别 原来为:modem_is(constchar*mt){ …… }elseif(strncmp("z",mt,1)==0) returnZ_MODEM; else returnUNKNOWN_MODEM; } (2)在vivi/lib/load_file.c中56 修改为:modem_is(constchar*mt){ …… }elseif(strncmp("z",mt,1)==0) returnZ_MODEM;

elseif(strncmp(“J",mt,1)==0) returnJTAG_D;

else returnUNKNOWN_MODEM; } 说明:该修改仅提高了下载到SDRAM的速度 修改为:57

二、对vivi进行配置 运行vivi配置程序menuconfig: make menuconfig 启动对vivi配置的主菜单,根据自己的目标系统逐项进行设置,设置完后退出保存即可。

二、对vivi进行配置58嵌入式系统讲义嵌入式系统软件移植与Linux下程课件59

三、对vivi进行编译 在vivi目录下执行以下命令:

make clean make

makeclean是清除以前编译时生成的所有目标文件和临时文件。 如果没有错误,编译后会生成vivi的目标文件vivi.bin。 三、对vivi进行编译60 四、对vivi进行下载 利用JTAG口将vivi下载到目标板的Norflash空间(0x00000---0x20000)。 然后对目标板加电,使vivi启动运行,观察运行情况。嵌入式系统讲义嵌入式系统软件移植与Linux下程课件616.2Linux内核及移植本节内容1、Linux内核结构2、Linux移植3、Linux编译4、Linux下载6.2Linux内核及移植本节内容626.2.1Linux内核结构

一、Linux操作系统的移植性

Linux操作系统具有很好的移植性,能够很方便地从一个硬件平台移植到另一个硬件平台上,其根本原因是Linux操作系统的代码,将与硬件相关的代码与硬件无关的代码是分开编写的。

Linux移植所涉及的文件:对Linux移植时,只需要修改与硬件相关的代码即可,涉及的文件主要是各个目录下的makefile文件,以及少数的汇编语言文件。6.2.1Linux内核结构 一、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目录 该目录下面保存的是所用设备的驱动程序,其下的每个目录是一种设备。 台都包含以下几个目录。65

3、fs目录 该目录下面列出了Linux所支持的文件系统,其下每个目录代表一种文件系统,文件系统代码与平台无关。

4、include目录 该目录下面是编译内核所需要的头文件,与平台无关的部分在linux子目录下面,其余的子目录都是与各种平台相关的头文件。 5、init目录 其下只有两个文件:main.c和version.c,前者是核心的初始化代码,后者是版本信息 3、fs目录66

6、ipc目录 其文件是核心进程的通信代码。

7、kernel目录 为与平台无关的内核管理代码,与平台相关部分在arch/***/kernel下面。

8、lib目录 该目录下面的文件是与平台无关的通用函数。

9、mm目录 该目录下面的文件是与平台无关的内存管理代码,与平台相关部分在arch/***/mm下面。 6、ipc目录67 10、net目录 是网络功能代码,其每个子目录对应网络的一个方面。 11、其它目录 Documentation目录下存放的是说明和应用文档,scripts目录下存放的是配置内核脚本。 另外在每个目录下几乎都有一个depend文件和Makefile文件,depend是被包含在Makefile中的,编译目标所依赖的头文件。

10、net目录686.2.2Linux移植 对于后面的移植,假设内核的目录为/my-arm/kernel,并且设环境变量为$KERNELCODE=/my-arm/kernel。

一、/my-arm/kernel---根目录 根目录下只需要修改Makefile文件。该文件的任务有两个:产生Linux内核镜像压缩文件vmlinux和内核模块,Makefile递归进入到各个子目录中,调用子目录中的Makefile最终产生出目标文件。6.2.2Linux移植 对于后面的移植,假设内核的目69 需要修改的内容:

(1)指定目标平台:将: ARCH:=$(shelluname–m|sed–es/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:=$(shellbin/pwd)修改为: TOPDIR:=$(/my-arm/kernel)

(4)修改export INSTALL_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 = 0xC0008000 MACHINE = s3c2410 endif

TEXTADDR决定内核起始运行地址,即image.ram应下载的位置,其值与具体目标板有关。 0xC0008000的含义:从地址0xC0000000开始,共有32MB空间。 二、arch/arm目录72

2、对config.in文件的修改 config.in是配置文件,运行menuconfig时出现的菜单就是config.in的内容。因为2.4.18内核没有中没有S3C2410x处理器的信息,所以需要加入相关信息。

(1)添加CONFIG_ARCH_S3C2410子选项

修改后为:

if[“$CONFIG_ARCH_S3C2410”=“y”];thencomment’S3C2410Implementation’dep_bool‘SMDK(MERITECHBOARD)’CONFIG_S3C2410_SMCK$CONFIG_ARCH_S3C2410fi 2、对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 =

0x30008000

ZRELADDR =

0x30208000 endif

ZRELADDR为内核解压后输出的地址。ZTEXTADDR为Boorloader执行的起始地址,若直接启动执行,则设为0,否则为装入RAM中的开始地址。 这两个地址由具体的目标板决定。随目标变化随目标板变化 三、arch/arm/boot目录随目标变化随目标板变化75 2、compressed/Makefile修改后: ifeq($(CONFIG_ARCH_S3C2410),y) OBJS +=head-s3c2410.o endif 加入head-s3c2410.o 3、compressed/head-s3c2410.S 这是新加入的文件 2、compressed/Makefile76#include<linux/config.h>#include<linux/linkage.h>#include<asm/mach-types.h> .section ".start",#alloc,#execinstr__S3C2410_start: bic r2,pc,#0x1f addr3,r2,#0x4000 @16kbisquiteenough...1: ldrr0,[r2],#32 teq r2,r3 bne 1b mcr p15,0,r0,c7,c10,4 @drainWB mcr p15,0,r0,c7,c7,0 @flushI&Dcaches#include<linux/config.h>77#if0 @disablingMMUandcaches mrc p15,0,r0,c1,c0,0 @readcontrolregister bic r0,r0,#0x05 @disableDcacheandMMU bicr0,r0,#1000 @disableIcache mcrp15,0,r0,c1,c0,0#endif#if078

mov r0,#0x002000001: subs r0,r0,#1 bne 1b mov r0,#0x00200000796.2.3Linux编译 Linux内核的编译需要以下三步操作。

一、配置内核 可以执行以下几个命令:

make config make menuconfig make xconfig

make oldconfig makeconfig命令在文本方式界面下进行配置

make menuconfig命令在菜单界面下进行配置 make xconfig命令在图形界面下进行配置6.2.3Linux编译 Linux内核的编译需要以下80 配置过程共130多个选项。 配置完成后会生成.config文件,并且在include/linux/目录下生成一个自动配置文件autoconf.h,保存配置信息,下次配置产生新的.config和autoconf.h文件,原来的.config被更名为.config.old。

二、创建内核的依赖关系 命令:

make dep 该命令搜索Linux编译输出与源代码头文件之间的依赖关系,并生成依赖文件。 配置过程共130多个选项。81

三、编译内核

make clean make zImage make modules make modules_install makeclean是清除以前构造内核时生成的所有目标文件、模块文件和临时文件。 makezImage是编译内核,生成压缩的内核映像文件,存放在/arch/arm/boot目录下。 Makemodules是创建内核模块。 Makemodules_install是创建内核模块安装信息文件。 三、编译内核826.3嵌入式应用程序开发过程 需要以下几个步骤。

一、编写源程序 如编写一个“hello.c”程序,在Linux下、用编辑软件vim进行编辑,源程序为: #include <stdio.h> int main() { printf(“Helloworld!\n”); }6.3嵌入式应用程序开发过程 需要以下几个步骤。83

二、编译程序 在Linux下,用交叉编译软件对“hello.c”进行编译,命令为: arm-linux-gcc–ohellohello.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嵌入式系统讲义

第6章嵌入式系统软件移植与Linux下程序开发周国运2007.9嵌入式系统讲义

第6章嵌入式系统软件移植与Linux下108本章主要内容1、Bootloader及vivi移植2、嵌入式Linux内核及移植3、基于Linux的应用程序开发4、基于Linux的驱动程序开发5、驱动程序开发实例本章主要内容1、Bootloader及vivi移植1096.1Bootloader及vivi移植本节内容1、Bootloader简介2、Bootloader工作模式3、Bootloader启动过程4、viviBootloader源代码分析5、viviBootloader接口命令6、vivi源代码修改移植6.1Bootloader及vivi移植本节内容110建立交叉编译环境Bootloader的/移植/配置/编译kernel的移植/配置/编译根文件系统Cramfs的实现嵌入式系统软件开发流程用户应用程序开发建立交叉编译环境Bootloader的/移植/配置/编译ke1116.1.1Bootloader简介

Bootloader,为引导加载程序,是嵌入式系统加电后运行的第一段代码,相当于PC机的BIOS。

Bootloader的位置:通常固化在硬件上的某个固态存储设备上,加电后自启动。

Bootloader功能:初始化硬件设备、建立内存空间的映射图,将系统的软、硬件环境带到一个合适的状态,以便为最终调用操作系统内核准备好正确的环境。6.1.1Bootloader简介 Bootloade112 Bootloader在软件的层次位置 Bootloader在软件的层次位置113

Bootloader的地址:在嵌入式系统中,系统在上电或复位时从地址0x0000,0000处开始执行,在这个地址处安排的就是Bootloader。

Bootloader是严重地依赖于硬件而实现的。每种不同体系结构的处理器都有不同的Bootloader。不过Bootloader的发展也趋于支持多种体系结构,如现在比较成熟的vivi、RedBoot和U-Boot等。 Bootloader的地址:在嵌入式系统中,系统在上电或114几种发布的Bootloader1、vivi vivi是韩国Mizi公司开发的Bootloader,适用于ARM9处理器。2、RedBootRedBoot即红帽(RedHat)嵌入式调试引导程序,是一种用于嵌入式系统的独立开放源代码引导/装载器。3、U-BootU-Boot(UniversalBootloader)由德国DENX小组开发,是一款目前功能较为强大的开源Bootloader程序,它支持多种处理器平台,包括ARM、PowerPC、MIPS等。几种发布的Bootloader1、vivi vivi是韩国M1156.1.2Bootloader操作模式 大多数Bootloader都有两种不同的操作模式:“启动加载”模式和“下载”模式。其区别对于开发人员才有意义。 从最终用户的角度看,Bootloader的作用就是用来加载操作系统,而并不存在所谓的启动加载模式与下载模式的区别。6.1.2Bootloader操作模式 大多数Boot1161、启动加载(Bootloading)模式 启动加载模式称为“自举”(Autonomous)模式。即Bootloader从目标机上的某个固态存储设备上将操作系统加载到RAM中运行,整个过程并没有用户的介入。 启动加载模式是Bootloader的正常工作模式,在嵌入式产品发布的时侯,Bootloader必须工作在这种模式下。1、启动加载(Bootloading)模式1172、下载(Downloading)模式

下载方式:在这种模式下,目标机上的Bootloader将通过串口连接或网络连接等通信手段从主机下载文件。

下载内容及存储:主要是下载内核映像和根文件系统映像等。从主机下载的文件通常首先被Bootloader保存到目标机的RAM中,然后再被Bootloader写到目标机上的FLASH类固态存储设备中。2、下载(Downloading)模式118

下载模式应用场合:Bootloader的这种模式通常在第一次安装内核与根文件系统时被使用;此外,以后的系统更新也会使用到这种工作模式。

用户应用接口:工作于这种模式下的Bootloader通常都会向它的终端用户提供一个简单的命令行接口。如在RedBoot下,将出现“RedBoot>”提示符;在viviBootloader下出现“vivi>”提示符。 下载模式应用场合:Bootloader的这种模式通常在第1192、下载(Downloading)模式2、下载(Downloading)模式120RedBoot的Bootloader 像RedBoot或U-Boot等功能强大的Bootloader通常都可同时支持这两种工作模式,而且允许用户在这两种工作模式之间进行切换。 比如,RedBoot在启动时处于正常的启动加载模式,但是它会延时3秒等待终端用户按下任意键而将RedBoot切换到下载模式。如在等待时间内没有接收到用户按键,则继续启动Linux内核。RedBoot的Bootloader1216.1.3Bootloader启动过程

Bootloader的启动可以分为两个阶段

1、第一阶段 阶段1主要包含依赖于CPU体系结构及硬件设备的初始化等。通常都用汇编语言来实现。这个阶段的任务有5: (1)、基本的硬件设备初始化 这是Bootloader一开始就执行的操作,其目的是为阶段2的执行、以及随后kernel的执行准备好一些基本的硬件环境。6.1.3Bootloader启动过程 Bootloa122

它通常包括以下工作:屏蔽所有的中断、设置CPU的速度和时钟频率、关闭处理器内部指令/数据cache等。 它通常包括以下工作:屏蔽所有的中断、设置CPU的速度123

(2)、为阶段2代码准备RAM空间 为了获得更快的执行速度,通常把阶段2的代码加载到RAM空间中来执行。 准备RAM空间考虑的因素:阶段2代码大小、堆栈、页大小(4KB的倍数)、安排位置等。 总的空间有1MB足够,安排在RAM的顶端较恰当。 (2)、为阶段2代码准备RAM空间124

(3)、拷贝阶段2代码到RAM空间 (4)、设置好堆栈 堆栈指针sp设置在1MB的RAM空间的最顶端(堆栈向下生长)。

(5)、跳转到阶段2的C程序入口点 在上述一切都就绪后,就可以跳转到Bootloader的stage2去执行了。 (3)、拷贝阶段2代码到RAM空间125

Bootloader的阶段2可执行映像刚被拷贝到RAM空间时的系统内存布局Bootloader的阶段2可执行映像刚被拷贝到RAM空间1262、第二阶段 阶段2通常用C语言来实现,以便实现更复杂的功能,也使程序有更好的可读性和可移植性。这个阶段的主要任务有5:

(1)、初始化本阶段要使用到的硬件 至少初始化一个串口,以便和终端用户进行I/O输出信息等。2、第二阶段127

(2)、检测系统内存映射(memorymap) 所谓内存映射,就是指在整个物理地址空间中有哪些地址范围被分配用来作为系统的RAM单元。为后面使用RAM、运行程序做好准备。 (3)、将kernel和根文件系统映像从flash读到RAM空间 (2)、检测系统内存映射(memorymap)128

(4)、为kernel设置启动参数 这是在调用内核之前应该做的准备工作。Linux2.4.x以后的内核都期望以标记列表(taggedlist)的形式来传递启动参数。 启动参数标记列表方法:以ATAG_CORE标记开始,以ATAG_NONE标记结束。 在嵌入式Linux系统中,通常需要由BootLoader设置的启动参数有:ATAG_CORE、ATAG_MEM(内存映射)、ATAG_NONE等。 (4)、为kernel设置启动参数129

(5)、调用内核 Bootloader调用Linuxkernel的方法是直接跳转到内核的第一条指令处。在跳转时必须满足下列条件: 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)、调用内核1306.1.4viviBootloader源码分析

vivi是韩国Mizi公司开发的Bootloader,适用于ARM9处理器。 vivi有两种工作模式,在启动时可以选择。在vivi启动时,通过串行口发出如下信息:PressReturntostarttheLinuxnow,anyotherkeyforvivi 按回车键启动LinuxOS,按其它键进入vivi命令接口模式,可以使用vivi提供的命令进行一些操作。6.1.4viviBootloader源码分析 vi131一、vivi源代码目录结构 vivi源代码包含的目录有:arch、Documentation、drivers、init、include、lib、scripts、test、util等10目录,共300多个文件。各个目录内容如下:

1、arch(architecture)目录 它下面的文件为与CPU硬件相关的初始化代码,此目录包含了所用vivi支持的CPU。一般只包含S3C2410x的文件。一、vivi源代码目录结构132

2、Documentation目录 其下文件为vivi使用指南。

3、drivers目录 存放的为MTD(数据存储媒质)设备读写控制文件和串行口操作文件,对串行口支持xmodem和ymodem协议。

4、include目录 存放所有的头文件,包括S3C2410微处理器的和S3C2410开发板的头文件。 2、Documentation目录133

5、init目录 该目录下是系统初始化文件main.c、version.c,后者是vivi版本信息,main.c为vivi整个初始化的结构。

6、lib目录 该目录下是公共应用及接口代码,如时钟功能文件time.c,堆栈初始化文件heap.c等文件。

7、scripts目录 该目录存放的是系统配置需要的脚本文件,如menuconfig和configue文件。 5、init目录134 8、CVS目录 所有的目录下面都有一个CVS目录,存放的是该目录的路径和它的子目录。 8、CVS目录135

二、vivi源代码文件与功能结构 vivi源代码文件: 1、vivi/arch/s3c2410/head.s 2、一段过度,实现循环调用,main返回后重新复位 LDR SP, DW_STACK_START MOV FP, #0 MOV A2, #0 BL MAIN MOV PC, #FLASH_BASE 3、vivi/init/main.c 二、vivi源代码文件与功能结构1366.1.5viviBootloader接口命令 vivi有两种工作模式,一种是“启动加载”模式,另一种是命令行模式。利用串行口与主机的连接,可以进行命令行操作。 vivi启动后,通过串行口发出如下信息:PressReturntostarttheLinuxnow,anyotherkeyforvivi 按下除了“Enter”之外的键,便可进入命令行模式。 vivi的接口命令有5条。6.1.5viviBootloader接口命令 vi137

1、load---下载文件命令

功能:将二进制文件下载到Flash或RAM格式:load<media_type>[<partname>|<addr><size>]<x|y|z> media_type:存储器类型,Flash或RAM partname:分区名称 addrsize:下载的地址及占用空间大小 x|y|z:文件的传输协议。x表示采用xmodem协议,y表示采用ymodem协议,z表示采用zmodem协议。目前vivi仅支持xmodem协议。 1、load---下载文件命令138

例1:vivi>loadflashkernelx 表示下载压缩的内核映像文件zImage到flash存储器的内核分区中,采用xmodem传输协议。

例2:vivi>loadflash0x800000xc0000x嵌入式系统讲义嵌入式系统软件移植与Linux下程课件139 2、part---MTD分区操作命令

操作命令:显示、增加、删除、复位、保存MTD分区等。

各个命令格式: partshow:显示分区信息 partdel<partname>:删除指定的分区 partreset:恢复分区的默认值 partsave:在flash中保存分区和参数值 2、part---MTD分区操作命令140 增加新的分区partadd<partname><offset><size><flag>: partname:新分区名称 offset:新分区的偏移地址 size:新分区的大小 flag:新分区的类型,可以是JFFS2、LOCKED、BONFS 增加新的分区141

3、param---设置或查看分区参数命令 查看分区参数:paramshow 设置启动等待按键延迟: paramsetboot_delayn(μs) 设置通信初始化超时:

paramsetxmodem_initial_timeoutm(μs) 3、param142

4、boot---引导内核命令格式:boot[media_type][<partname>|<addr><size>] media_type:存储器类型,flash或RAM partname:内核所在分区名称 addr:内核所在器件的偏移地址 size:内核的大小若 boot (无参数),则从kernel内核对应的分区中(kernel)读取内核映像启动。 4、boot---引导内核命令143 例如: 1、vivi>bootnand0x80000 内核在nandflash中,偏移地址为0x80000,大小为缺省值0xc0000 2、vivi>bootnor0x80000 例如:144

5、flash---flash存储器管理命令

擦除flash数据格式:flasherase[<partname>|<offset><size>] 说明: 对flash只有擦除命令。 例如: flasherase0x800000xc0000 5、flash---flash存储器管理命令145vivi接口命令命令功能Load下载flash或RAM命令PartMTD分区操作命令param设置、查看参数命令Boot启动系统命令flashFlash管理命令第三讲到此vivi接口命令命令功能Load下载f1466.1.6vivi源码的修改移植 vivi的移植方法步骤: 对vivi进行修改移植 对vivi进行配置 对vivi进行编译 下载、运行vivi

一、对vivi进行修改移植设Linux系统的目录结构为 6.1.6vivi源码的修改移植 vivi的移植方法步147 设Linux系统的目录结构为:cygwin friendly-arm crosstool kernel vivi … 设Linux系统的目录结构为:148

1、修改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/Makefile149

2)修改编译器库文件路径:将: 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)修改编译器库文件路径:150

3)增加交叉编译时头文件的搜索路径:

LIBC_INCLUDE_DIR=本机的include的路径如:

LIBC_INCLUDE_DIR=/friendly-arm/crosstool/arm-linux/gcc-2.95.3-glibc-2.2.3/include 3)增加交叉编译时头文件的搜索路径:151

(2)Linux内核包含文件修改Linux头文件所在路径将:LINUX_INCLUDE_DIR=/opt/host/armv4l/include改为:

LINUX_INCLUDE_DIR=符合本机的如: LINUX_INCLUDE_DIR=/friendly-arm/kernel/include (2)Linux内核包含文件152

2、修改vivi中与硬件相关的部分 只需要修改:/friendly-arm/vivi/include/platform/ 下面的文件smdk2410.h即可。 文件smdk2410.h的内容是针对开发板的硬件配置的,主要有:时钟设置、存储器初始化、通用I/O口初始化、UART初始化、vivi初始配置等。 根据自己的目标板的实际情况进行设置即可。

2、修改vivi中与硬件相关的部分153

3、支持NorFlash启动的修改(vivi/arch/s3c2410/smdk.c)

(1)Norflash分区 对于一个嵌入式系统,可能会采用Norflash、Nandflash、SDRAM等多种介质构成存储器系统,Norflash(如1、2MB)用于存放、运行bootloader,Nandflash用于存放操作系统、其它系统软件、应用程序和各种文件,SDRAM用于运行程序和存放数据。 如果系统有Norflash存储器(一般没有),则需要做相应修改。 3、支持NorFlash启动的修改154

修改方法:在vivi/arch/s3c2410/smdk.c中的分区代码,添加上Norflash分区:#ifdefCONFIG_S3C2410_AMD_BOOTmtd_partition_tdefault_mtd_partitions[]={ { name: "vivi", offset: 0, size: 0x00020000, flag: 0 }, 修改方法:在vivi/arch/s3c2410/smdk155 { name: "param", offset: 0x00020000, size: 0x00010000, flag: 0 },{ name: "kernel", offset: 0x00030000, size: 0x000C0000, flag: 0 }, {156 { name: "root", offset: 0x00100000, size: 0x00140000, flag: MF_BONFS }};#endif {157

(2)内核启动参数设置 经过上面修改,系统板可以从Nandflash中启动Linux,也可以从Norflash中启动Linux,另外还需要修改启动命令: (2)内核启动参数设置158 还需要修改启动命令:#ifdefCONFIG_S3C2410_NAND_BOOTCharLinux_cmd[]=

"noinitrdroot=/dev/bon/2init=/linuxrc console=tty1 console=ttyS0";#elseCharLinux_cmd[]=

"noinitrdroot=/dev/mtdblock/3 init=/linuxrcconsole=tty1console=ttyS0"; 还需要修改启动命令:159 式中启动命令: noinitrd :不使用ramdisk; root :根文件系统所在的MTD分区 init :内核运行入口命令文件 console :内核信息输出控制台 ttyS0表示串行口; tty0表示虚拟终端LCD。 说明: 关于Linux启动命令的参数,可以参考Kernel/Documentatio/下面的文件 kernel-parameters.txt。 式中启动命令:160

4、增加一种下载操作loadflash<partname>j操作 在Nand启动时,可以从JTAG下载程序到SDRAM(0x30000000),然后用“loadflash<partname>j”来烧写相应的分区,并且可以做vivi、kernel、root这3个分区的操作。其中大部分操作与使用X-Modem和Y-Modem等功能类似,所以命名为J-Modem,并特别修改以下3个部分。 4、增加一种下载操作161 (1)在vivi/include/priv_data.h中增加宏定义 原来为:#defineX_MODEM 1#defineY_MODEM 2#defineZ_MODEM 3

增加:#defineJTAG_D 4 (1)在vivi/include/priv_data.162 (2)在vivi/lib/load_file.c中增加对J-Modem的识别 原来为:modem_is(constchar*mt){ …… }elseif(strncmp("z",mt,1)==0) returnZ_MODEM; else returnUNKNOWN_MODEM; } (2)在vivi/lib/load_file.c中163 修改为:modem_is(constchar*mt){ …… }elseif(strncmp("z",mt,1)==0) returnZ_MODEM;

elseif(strncmp(“J",mt,1)==0) returnJTAG_D;

else returnUNKNOWN_MODEM; } 说明:该修改仅提高了下载到SDRAM的速度 修改为:164

二、对vivi进行配置 运行vivi配置程序menuconfig: make menuconfig 启动对vivi配置的主菜单,根据自己的目标系统逐项

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论