北航国家精品课程嵌入式系统Experiment3LINUX内核在arm平台上的移植_第1页
北航国家精品课程嵌入式系统Experiment3LINUX内核在arm平台上的移植_第2页
北航国家精品课程嵌入式系统Experiment3LINUX内核在arm平台上的移植_第3页
北航国家精品课程嵌入式系统Experiment3LINUX内核在arm平台上的移植_第4页
北航国家精品课程嵌入式系统Experiment3LINUX内核在arm平台上的移植_第5页
已阅读5页,还剩28页未读 继续免费阅读

下载本文档

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

文档简介

1、 2006 Embedded LINUXLINUX内核在内核在armarm平台上的移植平台上的移植 牛建伟 邹 琪 嵌入式系统课程嵌入式系统课程实验三实验三 2006 Embedded 实验目的 实验内容 Bootloader Linux内核 实验步骤 2006 Embedded 实验目的实验目的 了解bootloader及其作用,了解Linux内核结构。 掌握配置和编译Linux系统内核的方法以及移植嵌入式 Linux的基本步骤。 2006 Embedded 实验内容实验内容 在Linux系统的宿主PC下,修改裁减内核源码,编译生成 bootloader、内核映像和根文件系统。 在Windo

2、ws系统的宿主PC下,烧写bootloader、内核映像 和根文件系统。(带U盘) 2006 Embedded 嵌入式嵌入式Linux系统构成系统构成 引导加载程序(armboot, blob, redboot, vivi, U-Boot) 启动加载模式(正常工作模式),下载模式 内核 文件系统 用户应用程序(有时还包括嵌入式图形用户界面) 内核 根文件系统 Bootloader 启动参数 2006 Embedded Bootloader介绍介绍 引导加载程序bootloader是系统加电后运行的第一段代码, 它完成整个系统的加载启动任务。 在基于ARM的嵌入式系统中,系统在上电或复位时通常都

3、 从地址0 x00000000处开始执行,而在这个地址处放的通常 就是系统的bootloader。 通过这段小程序,可以初始化硬件设备、建立内存空间的 映射图,从而将系统的软硬件环境带到一个合适的状态, 以便为最终调用操作系统内核准备好正确的环境。 2006 Embedded Bootloader的启动流程的启动流程 第一个阶段主要包括依赖于CPU的体系结构硬件初始化的 代码,通常用汇编语言实现。这个阶段的任务有: 基本的硬件设备初始化(屏蔽所有中断、关闭处理器内部指令/数据cache等) 为第二阶段准备RAM空间 如果是从某个固态存储媒质中,则复制Bootloader的第二阶段代码到RAM

4、设置堆栈 跳转到第二阶段的C程序入口点 第二个阶段通常用C语言完成,以便实现更复杂的功能, 也使程序有更好的可读性和移植性。这个阶段的任务有: 初始化本阶段要使用到的硬件设备 检测系统内存映射 将内核映像和根文件系统映像从flash读到RAM 为内核设置启动参数 启动内核(将控制交给内核) 2006 Embedded Linux内核介绍内核介绍 目前专门针对嵌入式设备的Linux改版有针对无MMU的 uClinux和针对有MMU的标准Linux在各硬件体系结构上的 移植版本。 uClinux是通过对标准Linux内核裁减,去除虚拟内存管理 部分的代码,并对内存分配进行优化,从而达到提高系统 运

5、行效率的目的。 因此uClinux的应用程序开发要求用户自己正确的处理内 存管理,一旦错误地修改了其他进程的内存,将可能造成 系统死机。基于像ARM2410这样的ARM9内核的ARM-Linux使 用了MMU的内存管理,对进程有保护,提高了嵌入式系统 中多进程的保护能力。使用户应用程序的可靠性得以提高, 降低了用户的开发难度。 2006 Embedded Linux内核结构内核结构 /arch目录,包含了体系结构相关部分的内核代码,如 i386 arm等平台,而每个平台又包括以下几个目录: boot:包括启动内核所用的部分或全部代码 kernel:存放支持体系结构特有的特征的实现 lib:存放

6、高速的体现结构特有的通用函数的实现 mm:存放体系结构特有的内存管理程序的实现 /drivers目录,保存了内核中所有设备驱动程序。 /fs目录,列出了Linux支持的所有文件系统的代码,如 ntfs ext3和yaffs等 /include目录,包括编译核心所需要的大部分头文件,例 如与平台无关的头文件在include/linux子目录下。不同 的平台需要的头文件会有所不同,因此该目录和arch目录 一样,按平台划分多个子目录,如asm-arm是arm平台的。 2006 Embedded Linux内核结构(续)内核结构(续) /init目录,包含了内核的初始化代码,有main.c vers

7、ion.c两个文件。 /ipc目录,包含了核心进程间的通信代码。 /kernel目录,内核管理的核心代码在此,与处理器结构 相关的代码都在arch/*/kernel目录下。 /lib目录,包括与平台无关的通用函数。 /mm目录,包含了所有的内存管理代码。与具体硬件体系 结构相关的内存管理代码位于arch/*/kernel目录下。 /net目录,里面是核心的网络部分代码,其每个子目录对 应于网络的一个方面。 其他目录,Documentation目录存放了许多文档。scripts 目录存放配置内核的一些脚本文件。 2006 Embedded Linux内核移植内核移植 1 Linux内核的移植主要

8、包含启动代码的修改,内核的链接及装 入,参数传递,内核引导几个部分。我们在移植工作中要改 动的代码主要集中在与体系结构相关部分。 在/arch/arm/boot/bootp目录中,有个init.S的ARM汇编文件, 它就是引导Linux内核在arm平台上启动的初始化代码。它里 面定义了一个全局符号_start,它定义了默认的起始地址, 同时它也是整体内核二进制镜像的起始标志。 Init.S主要完成以下功能: 定义数据、代码段、bbs(未初始化数据段)起始地址变量并对bbs段初始化 设置寄存器以初始化系统硬件 关闭中断 初始化LCD显示 将数据段复制到内存 跳转到内核起始函数start_kern

9、el继续执行 对主寄存器的修改 2006 Embedded Init.S / /* * * * linux/arch/arm/boot/bootp/init.S linux/arch/arm/boot/bootp/init.S * * * * Copyright (C) 2000 Russell King Copyright (C) 2000 Russell King * * * * This program is free software; you can redistribute it and/or modify This program is free software; you ca

10、n redistribute it and/or modify * * it under the terms of the GNU General Public License version 2 as it under the terms of the GNU General Public License version 2 as * * published by the Free Software Foundation. published by the Free Software Foundation. * * * * Header file for splitting kernel +

11、 initrd. Note that we pass Header file for splitting kernel + initrd. Note that we pass * * r0 through to r3 straight through. r0 through to r3 straight through. * */ / .section .start,#alloc,#execinstr.section .start,#alloc,#execinstr .type.type_entry, #function_entry, #function _entry:_entry:adrad

12、rr10, initdatar10, initdata ldrldrr11, initdatar11, initdata subsubr11, r10, r11r11, r10, r11 work out exec offset work out exec offset b bsplitifysplitify .size.size_entry,. - _entry_entry,. - _entry .type.typeinitdata, #objectinitdata, #object initdata:initdata:.word.wordinitdatainitdata compiled

13、address of this compiled address of this .size.sizeinitdata,. - initdatainitdata,. - initdata .text.text splitify:splitify:adradrr13, datar13, data ldmialdmiar13!, r4-r6r13!, r4-r6 move the initrd move the initrd addaddr4, r4, r11r4, r4, r11 correction correction blblmovemove ldmialdmiar13!, r4-r6r1

14、3!, r4-r6 then the kernel then the kernel movmovr12, r5r12, r5 addaddr4, r4, r11r4, r4, r11 correction correction blblmovemove 2006 Embedded / /* * * * Setup the initrd parameters to pass to the kernel. This can either be Setup the initrd parameters to pass to the kernel. This can either be * * pass

15、ed in via a param_struct or a tag list. We spot the param_struct passed in via a param_struct or a tag list. We spot the param_struct * * method by looking at the first word; this should either indicate a page method by looking at the first word; this should either indicate a page * * size of 4K, 16

16、K or 32K. size of 4K, 16K or 32K. * */ / ldmialdmiar13, r4-r8r13, r4-r8 get size and addr of initrd get size and addr of initrd r5 = ATAG_INITRD r5 = ATAG_INITRD r6 = initrd start r6 = initrd start r7 = initrd end r7 = initrd end r8 = param_struct address r8 = param_struct address ldrldrr9, r8, #0r9

17、, r8, #0 no param struct? no param struct? teqteqr9, #0 x1000r9, #0 x1000 4K? 4K? teqneteqner9, #0 x4000r9, #0 x4000 16K? 16K? teqneteqner9, #0 x8000r9, #0 x8000 32K? 32K? beqbeqparam_structparam_struct ldrldrr9, r8, #4r9, r8, #4 get first tag get first tag teqteqr9, r4r9, r4 bnebnetaglisttaglist ok

18、, we have a tag list ok, we have a tag list / /* * * * We didnt find a valid tag list - create one. We didnt find a valid tag list - create one. * */ / strstrr4, r8, #4r4, r8, #4 movmovr4, #8r4, #8 strstrr4, r8, #0r4, r8, #0 movmovr4, #0r4, #0 strstrr4, r8, #8r4, r8, #8 / /* * * * find the end of th

19、e tag list, and then add an INITRD tag on the end. find the end of the tag list, and then add an INITRD tag on the end. * * If there is already an INITRD tag, then we ignore it; the last INITRD If there is already an INITRD tag, then we ignore it; the last INITRD * * tag takes precidence. tag takes

20、precidence. * */ / 2006 Embedded taglist:taglist:ldrldrr9, r8, #0r9, r8, #0 tag length tag length teqteqr9, #0r9, #0 last tag? last tag? addneaddner8, r8, r9r8, r8, r9 bnebnetaglisttaglist movmovr4, #16r4, #16 length of initrd tag length of initrd tag movmovr9, #0r9, #0 end of tag list terminator en

21、d of tag list terminator stmiastmiar8, r4, r5, r6, r7, r9r8, r4, r5, r6, r7, r9 movmovpc, r12pc, r12 call kernel call kernel / /* * * * We found a param struct. Modify the param struct for the initrd We found a param struct. Modify the param struct for the initrd * */ / param_struct:param_struct:add

22、addr8, r8, #16r8, r8, #16* *4 4 stmiastmiar8, r6,r7r8, r6,r7 save in param_struct save in param_struct movmovpc, r12pc, r12 call kernel call kernel move:move:ldmialdmiar4!, r7 - r10r4!, r7 - r10 move 32-bytes at a time move 32-bytes at a time stmiastmiar5!, r7 - r10r5!, r7 - r10 ldmialdmiar4!, r7 -

23、r10r4!, r7 - r10 stmiastmiar5!, r7 - r10r5!, r7 - r10 subssubsr6, r6, #8 r6, r6, #8 * * 4 4 bcsbcsmovemove movmovpc, lrpc, lr data:data:.word.wordinitrd_startinitrd_start .word.wordinitrd_addrinitrd_addr .word.wordinitrd_leninitrd_len .word.wordkernel_startkernel_start .word.wordkernel_addrkernel_ad

24、dr .word.wordkernel_lenkernel_len .word.word0 x544100010 x54410001 r4 = ATAG_CORE r4 = ATAG_CORE .word.word0 x544200050 x54420005 r5 = ATAG_INITRD r5 = ATAG_INITRD .word.wordinitrd_addrinitrd_addr r6 r6 .word.wordinitrd_leninitrd_len r7 r7 .word.wordparamsparams r8 r8 .type.typekernel_start,#objectk

25、ernel_start,#object .type.typeinitrd_start,#objectinitrd_start,#object 2006 Embedded Linux内核移植内核移植 2 修改根目录下的Makefile,指定目标平台和交叉编译器 ARCH := arm CROSS_COMPILE = /opt/host/armv4l/bin/armv4l-unknown-linux- 修改/arch/arm下的Makefile,手动增加下面内容: ifeq ($(CONFIG_ARCH_S3C2410),y) TEXTADDR = 0 xC0008000 MACHINE = s3

26、c2410 endif TEXTADDR决定内核起始运行地址,从0 xC0008000开始32M的 空间 修改/arch/arm下config.in,make menuconfig菜单中,在 2.4.18版本内核中没有S3C2410处理器,需要加相关信息: if $CONFIG_ARCH_S3C2410 = y ; then comment S3C2410 Implementation dep_bool SMDK (MERI TECH BOARD) CONFIG_S3C2410_SMDK $CONFIG_ARCH_S3C2410 $CONFIG_ARCH_S3C2400 = y -o $CON

27、FIG_ARCH_S3C2410 = y -o 2006 Embedded Linux内核移植内核移植 3 还有以下文件需要修改,具体细节在此不一一列出,请 查阅相关资料 arch/arm/boot/Makefile arch/arm/boot/compressed/Makefile arch/arm/boot/compressed/head-s3c2410.S arch/arm/def-configs目录中复制配置好的config文件 arch/arm/kernel/Makefile arch/arm/kernel/debug-armv.S arch/arm/kernel/entry-arm

28、v.S arch/arm/kernel/setup.c arch/arm/mm/mm-armv.c arch/arm/math-s3c2410目录在2.4.18版内核中没有,这里 都是C语言编写的程序,是用户自己添加的有关开放板上 USB、电源管理等功能的相关代码。 2006 Embedded 实验步骤实验步骤 1-以下步骤在以下步骤在Linux下完成下完成 将所需文件copy到工作目录 mRHEL $ cp -r /arm2410s/exp/bootloader/ /root/embedded 编译生成bootloader-vivi 在/exp/bootloader/vivi/ 目录下包含有

29、vivi的源文件 在终端下键入make menuconfig,出现vivi的配置菜单, 可根据实际情况对vivi的功能进行添加修改,默认的是适 合本开发板的。 然后键入make 命令,会自动在当前目录下生成可用的 bootloader文件vivi 2006 Embedded 2006 Embedded 实验步骤实验步骤 2 裁减Linux内核 进入源代码所在的/root/embedded/kernel-2410s/目录 在终端下键入make menuconfig,出现内核配置菜单,可 根据实际情况对内核的功能进行添加修改,默认的是针对 本开发板定制的选项。 为了配合下次驱动程序的实验,在配置内

30、核时,请将触摸 屏驱动的选项设置为M,在make menuconfig中位置如下: Character devices - Mice - UP-NETARM2410 touch screen for ADS7843 support 2006 Embedded 2006 Embedded 实验步骤实验步骤 3 编译Linux内核 在./kernel-2410s/目录下,执行以下几条命令: make clean 这条命令是在正式编译内核之前把环境清理干净,保证 没有不正确的.o文件存在。 make dep 这条命令是编译相关依赖文件 make zImage 这条命令就是最终的编译命令。生成的内核文

31、件zImage 将会在/kernel-2410s/arch/arm/boot/目录下 2006 Embedded 实验步骤实验步骤 4 编译生成根文件系统 首先将,/root/embedded/develop/root.sh/目录下面的 两个文件mkcramfs和mkroot.sh拷贝到/develop/目录下。 然后,将/develop/目录下的uptech-root.tar文件解压 tar jxf uptech-root.tar.bz2 在/root/embedded/develop/目录下生成了一个名为root 的目录 在/root/embedded/下建立img目录来存放将会生成的文件

32、 在/root/embedded/develop/目录下执行命令./mkroot.sh, 生成根文件系统为/root/embedded/img/目录下的 root.cramfs。 2006 Embedded 实验步骤实验步骤 5-以下步骤在以下步骤在windows下完成下完成 格式化flash 首先将步骤1至4生成的文件vivi、zImage和root.cramfs 通过局域网samba服务器或U盘传到旁边的windows主机下, 将此台PC通过串口和开发板相连。 Samba服务器的使用 和网上邻居网上邻居类似 将redhat的IP地址改到192.168.1.0网段 rootRHEL ifco

33、nfig eth0 add 192.168.1.$机器号 打开超级终端,设置好相关参数:波特率为115200,数据 位8,无奇偶校验,停止位为1,无数据流控制。启动开发 板,按除了Enter外的任意键进入vivi,按照以下命令格 式化flash,重新分区。注意下面的数字注意下面的数字 vivibon part 0 128k 192k 1216k 4288k:m 64704k 2006 Embedded 实验步骤实验步骤 6 烧写vivi 这时已格式化flash,运行的是RAM中的vivi, 。在超级 终端下输入: viviload flash vivi x 回车 此时超级终端提示: Ready for downloadding using xmodem Waiting $ 点击超级终端任务栏上“传送”下拉菜单中的“发送文 件”,选择Xmodem,选择镜像文件vivi,点击“发

温馨提示

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

评论

0/150

提交评论