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

下载本文档

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

文档简介

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

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

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

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

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

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

7、心代码在此,与处理器结构相关的代码都在arch/*/kernel目录下。 /lib目录,包括与平台无关的通用函数。 /mm目录,包含了所有的内存管理代码。与具体硬件体系结构相关的内存管理代码位于arch/*/kernel目录下。 /net目录,里面是核心的网络部分代码,其每个子目录对应于网络的一个方面。 其他目录,Documentation目录存放了许多文档。scripts目录存放配置内核的一些脚本文件。 2006 EmbeddedLinux内核移植内核移植 1 Linux内核的移植主要包含启动代码的修改,内核的链接及装入,参数传递,内核引导几个部分。我们在移植工作中要改动的代码主要集中在与体

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

9、bootp/init.Slinux/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 can redistribute it and/or modify * * it under the terms of the GNU Gen

10、eral 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 + Header file for splitting kernel + initrdinitrd. Note that we pass.

11、Note that we pass * * r0 through to r3 straight through. r0 through to r3 straight through. * */ /.section .section .start,#alloc,#execinstrstart,#alloc,#execinstr.type.type_entry, #function_entry, #function_entry:_entry:adradrr10, r10, initdatainitdataldrldrr11, r11, initdatainitdatasubsubr11, r10,

12、 r11r11, r10, r11 work out exec offset work out exec offsetb bsplitifysplitify.size.size_entry,. - _entry_entry,. - _entry.type.typeinitdatainitdata, #object, #objectinitdatainitdata: :.word.wordinitdatainitdata compiled address of this compiled address of this.size.sizeinitdatainitdata,. - ,. - ini

13、tdatainitdata.text.textsplitifysplitify: :adradrr13, datar13, dataldmialdmiar13!, r4-r6r13!, r4-r6 move the move the initrdinitrdaddaddr4, r4, r11r4, r4, r11 correction correctionblblmovemoveldmialdmiar13!, r4-r6r13!, r4-r6 then the kernel then the kernelmovmovr12, r5r12, r5addaddr4, r4, r11r4, r4,

14、r11 correction correctionblblmovemove 2006 Embedded/ /* * * * Setup the Setup the initrdinitrd parameters to pass to the kernel. This can either be parameters to pass to the kernel. This can either be * * passed in via a passed in via a param_structparam_struct or a tag list. We spot the or a tag li

15、st. We spot the param_structparam_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, 16K or 32K. size of 4K, 16K or 32K. * */ /ldmialdmiar13, r4-r8r13, r4-r8 get size and get size

16、and addraddr of of initrdinitrd r5 = ATAG_INITRD r5 = ATAG_INITRD r6 = r6 = initrdinitrd start start r7 = r7 = initrdinitrd end end r8 = r8 = param_structparam_struct address addressldrldrr9, r8, #0r9, r8, #0 no no paramparam structstruct? ?teqteqr9, #0 x1000r9, #0 x1000 4K? 4K?teqneteqner9, #0 x400

17、0r9, #0 x4000 16K? 16K?teqneteqner9, #0 x8000r9, #0 x8000 32K? 32K?beqbeqparam_structparam_structldrldrr9, r8, #4r9, r8, #4 get first tag get first tagteqteqr9, r4r9, r4bnebnetaglisttaglist ok, we have a tag list ok, we have a tag list/ /* * * * We didnt find a valid tag list - create one. We didnt

18、find a valid tag list - create one. * */ /strstrr4, r8, #4r4, r8, #4movmovr4, #8r4, #8strstrr4, r8, #0r4, r8, #0movmovr4, #0r4, #0strstrr4, r8, #8r4, r8, #8/ /* * * * find the end of the 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

19、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 tag takes precidenceprecidence. . * */ / 2006 Embeddedtaglisttaglist: :ldrldrr9, r8, #0r9, r8, #0 tag length tag lengthteqteqr9, #0r9, #0

20、 last tag? last tag?addneaddner8, r8, r9r8, r8, r9bnebnetaglisttaglistmovmovr4, #16r4, #16 length of length of initrdinitrd tag tagmovmovr9, #0r9, #0 end of tag list terminator end of tag list terminatorstmiastmiar8, r4, r5, r6, r7, r9r8, r4, r5, r6, r7, r9movmovpc, r12pc, r12 call kernel call kerne

21、l/ /* * * * We found a We found a paramparam structstruct. Modify the . Modify the paramparam structstruct for the for the initrdinitrd * */ /param_structparam_struct: :addaddr8, r8, #16r8, r8, #16* *4 4stmiastmiar8, r6,r7r8, r6,r7 save in save in param_structparam_structmovmovpc, r12pc, r12 call ke

22、rnel call kernelmove:move:ldmialdmiar4!, r7 - r10r4!, r7 - r10 move 32-bytes at a time move 32-bytes at a timestmiastmiar5!, r7 - r10r5!, r7 - r10ldmialdmiar4!, r7 - r10r4!, r7 - r10stmiastmiar5!, r7 - r10r5!, r7 - r10subssubsr6, r6, #8 r6, r6, #8 * * 4 4bcsbcsmovemovemovmovpc, pc, lrlrdata:data:.wo

23、rd.wordinitrd_startinitrd_start.word.wordinitrd_addrinitrd_addr.word.wordinitrd_leninitrd_len.word.wordkernel_startkernel_start.word.wordkernel_addrkernel_addr.word.wordkernel_lenkernel_len.word.word0 x544100010 x54410001 r4 = ATAG_CORE r4 = ATAG_CORE.word.word0 x544200050 x54420005 r5 = ATAG_INITRD

24、 r5 = ATAG_INITRD.word.wordinitrd_addrinitrd_addr r6 r6.word.wordinitrd_leninitrd_len r7 r7.word.wordparamsparams r8 r8.type.typekernel_start,#objectkernel_start,#object.type.typeinitrd_start,#objectinitrd_start,#object 2006 EmbeddedLinux内核移植内核移植 2 修改根目录下的Makefile,指定目标平台和交叉编译器 ARCH := arm CROSS_COMP

25、ILE = /opt/host/armv4l/bin/armv4l-unknown-linux- 修改/arch/arm下的Makefile,手动增加下面内容: ifeq ($(CONFIG_ARCH_S3C2410),y) TEXTADDR = 0 xC0008000 MACHINE = s3c2410 endif TEXTADDR决定内核起始运行地址,从0 xC0008000开始32M的空间 修改/arch/arm下config.in,make menuconfig菜单中,在2.4.18版本内核中没有S3C2410处理器,需要加相关信息: if $CONFIG_ARCH_S3C2410 =

26、 y ; then comment S3C2410 Implementation dep_bool SMDK (MERI TECH BOARD) CONFIG_S3C2410_SMDK $CONFIG_ARCH_S3C2410 $CONFIG_ARCH_S3C2400 = y -o $CONFIG_ARCH_S3C2410 = y -o 2006 EmbeddedLinux内核移植内核移植 3 还有以下文件需要修改,具体细节在此不一一列出,请查阅相关资料 arch/arm/boot/Makefile arch/arm/boot/compressed/Makefile arch/arm/boot

27、/compressed/head-s3c2410.S arch/arm/def-configs目录中复制配置好的config文件 arch/arm/kernel/Makefile arch/arm/kernel/debug-armv.S arch/arm/kernel/entry-armv.S arch/arm/kernel/setup.c arch/arm/mm/mm-armv.c arch/arm/math-s3c2410目录在2.4.18版内核中没有,这里都是C语言编写的程序,是用户自己添加的有关开放板上USB、电源管理等功能的相关代码。 2006 Embedded实验步骤实验步骤 1-

28、以下步骤在以下步骤在Linux下完成下完成将所需文件copy到工作目录 mRHEL $ cp -r /arm2410s/exp/bootloader/ /root/embedded 编译生成bootloader-vivi 在/exp/bootloader/vivi/ 目录下包含有vivi的源文件 在终端下键入make menuconfig,出现vivi的配置菜单,可根据实际情况对vivi的功能进行添加修改,默认的是适合本开发板的。 然后键入make 命令,会自动在当前目录下生成可用的bootloader文件vivi 2006 Embedded 2006 Embedded实验步骤实验步骤 2 裁

29、减Linux内核 进入源代码所在的/root/embedded/kernel-2410s/目录 在终端下键入make menuconfig,出现内核配置菜单,可根据实际情况对内核的功能进行添加修改,默认的是针对本开发板定制的选项。 为了配合下次驱动程序的实验,在配置内核时,请将触摸屏驱动的选项设置为M,在make menuconfig中位置如下: Character devices - Mice - UP-NETARM2410 touch screen for ADS7843 support 2006 Embedded 2006 Embedded实验步骤实验步骤 3 编译Linux内核 在./

30、kernel-2410s/目录下,执行以下几条命令: make clean 这条命令是在正式编译内核之前把环境清理干净,保证没有不正确的.o文件存在。 make dep 这条命令是编译相关依赖文件 make zImage 这条命令就是最终的编译命令。生成的内核文件zImage将会在/kernel-2410s/arch/arm/boot/目录下 2006 Embedded实验步骤实验步骤 4 编译生成根文件系统 首先将,/root/embedded/develop/root.sh/目录下面的两个文件mkcramfs和mkroot.sh拷贝到/develop/目录下。 然后,将/develop/目

31、录下的uptech-root.tar文件解压 tar jxf uptech-root.tar.bz2在/root/embedded/develop/目录下生成了一个名为root的目录 在/root/embedded/下建立img目录来存放将会生成的文件 在/root/embedded/develop/目录下执行命令./mkroot.sh,生成根文件系统为/root/embedded/img/目录下的root.cramfs。 2006 Embedded实验步骤实验步骤 5-以下步骤在以下步骤在windows下完成下完成 格式化flash 首先将步骤1至4生成的文件vivi、zImage和root

32、.cramfs通过局域网samba服务器或U盘传到旁边的windows主机下,将此台PC通过串口和开发板相连。 Samba服务器的使用 和网上邻居网上邻居类似 将redhat的IP地址改到192.168.1.0网段 rootRHEL ifconfig 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

提交评论