嵌入式Linux开发环境的搭建.ppt_第1页
嵌入式Linux开发环境的搭建.ppt_第2页
嵌入式Linux开发环境的搭建.ppt_第3页
嵌入式Linux开发环境的搭建.ppt_第4页
嵌入式Linux开发环境的搭建.ppt_第5页
已阅读5页,还剩57页未读 继续免费阅读

下载本文档

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

文档简介

第5章嵌入式Linux开发环境的搭建 嵌入式开发环境的搭建U Boot 嵌入式交叉编译环境的搭建 交叉开发概念模型 minicom tftp 主机 目标板 各种连接方式 Cross Tools Chain Linux内核 网线串口线并口线USB电缆JTAG电缆 minicom 根文件系统 BootLoader Minicom Linux下的Minicom很像Windows下面的超级终端 利用Minicom作为被开发目标板的终端 实现目标板相关信息的显示与交互 适于在Linux通过超级终端对嵌入式设备的管理以及对嵌入操作系统的升级 tftp服务 tftp是用来下载远程文件的最简单网络协议 它基于UDP协议而实现 嵌入式Linux的tftp开发环境包括两个方面 一是嵌入式Linux宿主机的tftp server支持二是嵌入式linux目标机的tftp client支持 配置宿主机上的tftp服务 主要为以后下载相应的内核映像和文件系统做准备 在嵌入式Linux的开发过程中 开发者需要在Linux服务器上进行所有的软件开发 交叉编译后 通用tftp方式将可执行文件下载到嵌入式系统运行 DHCP服务 目标板的Bootloader或者内核都需要分配IP地址 这可以通过动态主机配置协议 DHCPDynamicHostConfigurationProtocol 或者BOOTP协议实现 BOOTP协议可以给计算机分配IP地址并且通过网络获取映像文件的路径 DHCP则是向后兼容BOOTP的协议拓展 Linux操作系统的主机一般包含dhcpd的软件包 可以配置DHCP服务 配置服务的操作需要root用户的权限 busybox busybox是构造文件系统最常用的软件工具包 它被非常形象地称为嵌入式Linux系统中的 瑞士军刀 因为它将许多常用的Linux命令和工具结合到了一个单独的可执行程序 busybox 中 虽然与相应的GNU工具比较起来 busybox所提供的功能和参数略少 但在比较小的系统 例如启动盘 或者嵌入式系统中已经足够了 busybox在设计上就充分考虑了硬件资源受限的特殊工作环境 它采用一种很巧妙的办法减少自己的体积 所有的命令都通过 插件 的方式集中到一个可执行文件中 在实际应用过程中通过不同的符号链接来确定到底要执行哪个操作 采用单一执行文件的方式最大限度地共享了程序代码 甚至连文件头 内存中的程序控制块等其他系统资源都共享了 对于资源比较紧张的系统来说 真是最合适不过了 在busybox的编译过程中 可以非常方便地加减它的 插件 最后的符号链接也可以由编译系统自动生成 NFS文件系统 1 NFS为NetworkFileSystem的简称 最早是由Sun公司提出发展起来的 其目的就是让不同的机器 不同的操作系统之间通过网络可以彼此共享文件 NFS可以让不同的主机通过网络将远端的NFS服务器共享出来的文件安装到自己的系统中 从客户端看来 使用NFS的远端文件就像是使用本地文件一样 在嵌入式中使用NFS会使应用程序的开发变得十分方便 并且不用反复地进行烧写映像文件 NFS的使用分为服务端和客户端 其中服务端是提供要共享的文件而客户端则通过挂载 mount 这一动作来实现对共享文件的访问操作 下面主要介绍NFS服务端的使用 在嵌入式开发中 通常NFS服务端在宿主机上运行 而客户端在目标板上运行 NFS文件系统 2 NFS服务端是通过读入它的配置文件 etc exports 来决定所共享的文件目录的 在这个配置文件中 每一行都代表一项要共享的文件目录以及所指定的客户端对它的操作权限 客户端可以根据相应的权限 对该目录下的所有目录文件进行访问 共享的目录 客户端主机名称或IP 参数1 参数2 在这里 主机名或IP是可供共享的客户端主机名或IP 若对所有的IP都可以访问 则可用 表示 这里的参数有很多种组合方式 U Boot Linux启动过程 自解压 跳到入口 初始化硬件 数据结构 驱动程序 挂接根文件系统 从inittab获取运行级别 检测与初始化系统环境 启动与级别相应的服务项 启动终端等待用户登录 祖先进程 控制其他进程 从预定地址执行 0 xFFFF0000 硬件初始化 跳到启动盘第一扇区 将Linux内核映像装入内存 跳到内核映像入口 Bootloader的概念 BootLoader就是在操作系统内核运行之前运行的一段小程序 通过这段小程序 我们可以初始化硬件设备 建立内存空间的映射图 从而将系统的软硬件环境带到一个合适的状态 以便为最终调用操作系统内核准备好正确的环境 通常 BootLoader是严重地依赖于硬件而实现的 特别是在嵌入式世界 因此 在嵌入式世界里建立一个通用的BootLoader几乎是不可能的 尽管如此 我们仍然可以对BootLoader归纳出一些通用的概念来 以指导用户特定的BootLoader设计与实现 Bootloader的概念 Bootloader是一段可执行程序 完成的主要功能是将可执行文件 一般是操作系统 搬移到内存中 然后将控制权交给这段可执行文件 操作系统 cpu loader Bootloader的工作模式 一 下载模式对研发人员来说 Bootloader一般需要工作在这种模式下 特别是调试内核或者Bootloader本身的时候 通过串口终端与Bootloader进行交互 可以操作系统硬件 比如通过网口或者串口下载内核 烧写Flash等等 Bootloader的工作模式 二 启动加载模式嵌入式产品发布的时候 Bootloader必须工作在该模式下 这种情况下 Bootloader必须完成硬件自检 配置 并从Flash中将内核拷贝到SDRAM中 并跳转到内核入口 实现自启动 而不需要人为的干预 Bootloader的安装媒介 系统上电时或复位以后 都从芯片厂商预先安排的一个地址处取第一条指令执行 对S3C2410芯片 从0 x0处开始 由于上电或复位需要运行的第一段程序就是Bootloader 故必须把Bootloader放入该地址 将Bootloader写入固态存储设备 永久保存 系统上电后将自动执行Bootloader Bootloader的烧写 Bootloader可以配置系统 没有Bootloader 系统就不能启动 Bootloader可以实现自烧写 但是系统中没有还没有Bootloader的时候 怎么启动 JTAG烧写 典型的Flash存储空间分配图 bootloader 启动参数 内核 根文件系统 提供较多命令接口 U Boot简介 1999年由德国DENX软件工程中心的WolfgangDenk发起 全称UniversalBootloader 特点 支持多种硬件构架 包括ARM x86 PPC MIPS m68k NIOS Blackfin 支持多种操作系统 包括Linux VxWorks NETBSD QNX RTEMS ARTOS LynxOS 支持多达216种以上的开发板 开放源代码 遵循GPL条款 易于移植 调试官方网站 http www denx de wiki U Boot WebHome U Boot目录结构 board目标板相关文件 主要包含硬件初始化 SDRAM初始化 common独立于处理器体系结构的通用代码 cpu与处理器相关的文件 包含cpu初始化 串口初始化 中断初始化等代码 docU Boot的说明文档 drivers设备驱动代码 如Flash驱动 网卡驱动 串口驱动等 net网络功能的上层文件 实现各种协议 如nfs tftp arp等 U Boot目录结构 fsU Boot支持的文件系统的实现 如cramfs fat ext2 jffs2等 includeU Boot使用的头文件 包括不同硬件构架的头文件 lib xxx处理器相关文件 如我们要使用的lib arm 与arm体系结构相关的文件 大多数引导系统都分为stage1和stage2两大部分 依赖于处理器体系结构和板级初始化的代码通常都放在stage1中 用汇编实现 而stage2则通常用C语言来实现 这样可以实现更复杂的功能 同时代码具有更好的可读性和可移植性 18 引导系统的stage1 1 硬件设备初始化 2 为加载引导系统的stage2准备RAM空间 3 拷贝引导系统的stage2到RAM空间中 4 设置好堆栈 5 跳转到stage2的C入口点 引导系统的stage2 1 初始化本阶段要用到的硬件设备 2 检测系统内存映射 memorymap 3 将内核映像和根文件系统映像从flash上读到RAM空间中 4 为内核设置启动参数 5 调用内核 U Boot启动可分为两个阶段 U Boot启动流程之stage1 第一阶段的代码位于cpu arm920t start S中 依次完成以下功能 1 系统上电 进入svc模式2 关闭看门狗 禁止所有中断3 进行初级硬件初始化4 将自身代码拷贝到SDRAM中5 设置堆栈6 清空bss段7 跳转到C语言实现的stage2中 从NANDFlash启动 经典2410试验箱不带NORFlash 只能从NANDFlash启动 由硬件实现选择从NAND启动 系统上电或者复位时NANDFlash控制器自动将NANDFlash的前4KB拷贝到一段内置RAM 并将这段RAM映射到0 x00000000处 NORFlash与NANDFlash比较 进入SVC模式 start code setthecputoSVC32mode mrsr0 cpsrbicr0 r0 0 x1forrr0 r0 0 xd3msrcpsr r0 看门狗和中断处理 ldrr0 pWTCONmovr1 0 x0strr1 r0 maskallIRQsbysettingallbitsintheINTMR default movr1 0 xffffffffldrr0 INTMSKstrr1 r0 ldrr1 0 x3ffldrr0 INTSUBMSKstrr1 r0 copy myself的实现 copy myself ldrr0 UBOOT RAM BASE 0 x33f80000movr1 0 x0movr2 0 x30000blnand read wholetstr0 0 x0beqok nand read1 b1bnand read whole用C语言实现 根据ARM过程调用标准 AAPCS 参数传递如下 R0C程序的第一个参数 在函数中被定义为读取的目的地址R1C程序的第二个参数 在函数中被定义为读取的源地址R2C程序的第三个参数 在函数中被定义为读取数据块的大小nand read whole的原型如下 在board up2410 nand c中实现 intnand read whole unsignedchar buf unsignedlongstart addr intsize 若读取成功 函数返回0 否则返回1 根据AAPCS 返回结果放在r0中 nand read whole intnand read whole unsignedchar buf unsignedlongstart addr intsize while i 9 设置堆栈指针 stack setup ldrr0 TEXT BASEsubr0 r0 CFG MALLOC LENsubr0 r0 CFG GBL DATA SIZEsubsp r0 12 U Boot启动流程之stage2 ldrpc start armboot start armboot wordstart armboot start armboot和start armboot都是symbol 程序链接时由连接器使用 上面程序的第二行表示在symbol处放置一个值 这个值就是start armboot的链接地址 也是程序代码存放的地址 将这个地址放入PC中 从而实现程序的跳转 U Boot启动流程之stage2 该函数是c语言的入口函数 定义在lib arm board c中 首先 初始化全局变量global data gd gd t armboot start CFG MALLOC LEN sizeof gd t memset void gd 0 sizeof gd t gd bd bd t char gd sizeof bd t memset gd bd 0 sizeof bd t gd是全局变量的一个指针 始终保存在r8中 global data的成员大多是开发板的基本设置 如串口波特率 设备序列号 mac地址 启动参数存储地址等 U Boot启动流程之stage2 调用初始化序列 init fnc t init sequence board init board up2410 up2410 c GPIO PLL及内核启动参数存放地址设置interrupt init cpu arm920t s3c24x0 interrupts c 初始化时钟中断env init common env nand c 设置缺省环境变量init baudrate lib arm board c 设置串口波特率serial init common serial c 初始化串口 硬件层面 display banner lib arm board c 打印U Boot信息dram init board up2410 up2410 c 初始化SDRAM U Boot启动流程之stage2 进入无限循环 for main loop main loop在common main c中实现 它通过串口和U Boot进行交互 以便引导内核或进行其他参数的修改 设置 U Boot启动Linux内核 1 3 ARMLinuxKernelBootRequirements 设置machinetypenumber 定义在include asm arm mach types h中 defineMACH TYPE SMDK2410193赋值gd bd bi arch number MACH TYPE SMDK2410 把该值设置到环境变量中 得到该值bd t bd gd bd intmachid bd bi arch number U Boot启动Linux内核 2 3 do boot linux函数 在lib arm armlinux c中实现 设置内核启动参数 setup start tag bd setup serial tag 内核启动参数存放地址 0 x30000100 在board up2410 up2410 h中设置 tag结构体 structtag structtag headerhdr union structtag corecore structtag mem32mem structtag videotextvideotext structtag ramdiskramdisk structtag initrdinitrd structtag serialnrserialnr structtag revisionrevision structtag videolfbvideolfb structtag cmdlinecmdline structtag memclkmemclk u structtag header u32size u32tag tag header structtag header u32size u32tag size是tag header加上后面的u联合体的字的大小 而不是字节大小 tag的定义如右边所示 tag header中tag的定义 defineATAG CORE0 x54410001 defineATAG NONE0 x00000000 defineATAG MEM0 x54410002 defineATAG RAMDISK0 x54410004 defineATAG INITRD0 x54410005 defineATAG INITRD20 x54420005 defineATAG SERIAL0 x54410006 defineATAG CMDLINE0 x54410009Bootloader和内核中的定义是一致的 以实现参数传递 为内核设置taglist params是一个指向tag结构体的指针 staticvoidsetup start tag bd t bd params structtag bd bi boot params params hdr tag ATAG CORE params hdr size tag size tag core params u core flags 0 params u core pagesize 0 params u core rootdev 0 params tag next params definetag next t structtag u32 t t hdr size 为内核设置taglist staticvoidsetup memory tags bd t bd inti for i 0 ihdr tag ATAG MEM params hdr size tag size tag mem32 params u mem start bd bi dram i start params u mem size bd bi dram i size params tag next params U Boot启动Linux内核 3 3 theKernel函数指针 声明 void theKernel intzero intarch uintparams 赋值 theKernel void int int uint ntohl hdr ih ep 关于入口地址 mkimag中 对入口地址进行设置 case e ep strtoul argv char 跳转到内核入口处 前面已经从环境变量中读出了machinetypenumber 设置好了内核启动所需参数 只需要跳转到内核入口处就可以了 theKernel 0 machid bd bi boot params 根据AAPCS r0 r1和r2中分别放置了0 machid和启动参数的地址 U Boot的使用 1 3 1 printenv打印环境变量打印U Boot的环境变量 包括串口波特率 ip地址 mac地址 内核启动参数 服务器ip地址等等 2 setenv设置环境变量对环境变量的值进行设置 保存在SDRAM中 但不写入Flash 这样系统掉电以后设置的环境变量就不存在了 3 saveenv保存环境变量将环境变量写入Flash 永久保存 掉电以后不消失 U Boot的使用 2 3 4 ping测试网络命令ping命令用于测试目标板的网络是否通畅 格式 ping ipaddr5 tftp通过tftp协议下载文件至SDRAM将tftp服务器上的文件下载到指定的地址 速度快 格式 tftp 存放地址 文件名6 loadb通过串口下载二进制文件在目标板不具备网络功能的时候 可以配合超级终端下载二进制文件至内存中 缺点是速度慢 格式 loadb 存放地址 U Boot的使用 3 3 7 bootm引导内核先将内核下载到SDRAM中 通过tftp命令或者loadb命令 然后执行bootm命令引导内核 格式 bootm 内核地址8 help或者 查看U Boot支持的命令及其作用 用U Boot启动Linux内核 经典2410开发板SDRAM空间分布 0 x30000000 参数 0 x30000100 内核 0 x30008000 u boot bin 0 x33f80000 uboot内存空间 0 x30008040 用U Boot启动Linux内核 1 下载u boot bin到SDRAM的0 x30008000处tftp0 x30008000uImage2 启动内核bootm0 x30008000 U Boot移植 U Boot移植主要步骤 建立自己的开发板类型 Makefile 修改程序链接地址 board s3c2410 config mk 修改中断禁止的部分 cpu arm920t start S 因为在fs2410开发板启动时是直接从nandflash加载代码 所以应该启动代码 cpu arm920t start S 修改内存配置 board fs2410 lowlevel init S 加入nandflash读函数 board fs2410 nand read c 加入nandflash的初始化函数 board fs2410 fs2410 c 修改外设控制器相关宏 board fs2410 fs2410 c 提供nandflash相关宏定义 include configs fs2410 h 加入nandflash设备 include linux mtd nand ids h 设置nandflash环境 common env nand c vivi 1 vivi简介vivi是由韩国mizi公司为ARM处理器系列设计的一个bootloader 它同样支持启动加载模式和下载工作模式 在下载模式下 vivi为用户提供一个命令行人机接口 通过这个人机接口可以使用vivi提供的一些命令 如果嵌入式系统没有键盘和显示 那么可以利用vivi中的串口 将其和宿主机连接起来 利用宿主机中的串口软件 如windows中的超级终端或者Linux中的minicom 来控制 vivi文件结构代码包括arch init lib drivers和include等几个目录 共200多条文件vivi的配置和编译 makedistclean 清除一些早先生成的无用的目标文件 makemenuconfig 然后可以根据菜单中的信息进行配置 make 命令开始编译 vivi vivi 3 vivi的配置和编译vivi的配置和嵌入式Linux内核一样 可以采用菜单化的形式进行 其步骤主要如下 makedistclean 清除一些早先生

温馨提示

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

评论

0/150

提交评论