2.建立交叉编译环境

一般而言,直接在移植的目标硬件平台上编写和调试Linux比较困难,目前一般采用的办法是首先在通用计算机上编写程序,然后通过交叉编译生成目标平台上可以运行的二进制代码格式,最后再下载到目标平台上的特定位置上运行。

移植前需要在宿主机上建立如图2所示的ARM的交叉编译环境,建立ARM的交叉编译环境主要用到的开发工具有: binutils、gcc、glibc,其中 binutils是二进制文件的处理工具; gcc是编译工具, 用来编译内核代码的工具; glibc 是链接和运行库。社区的开发者和一些芯片厂商已经编译出了常用体系结构的工具链,使用这些工具链,可以大大减少工作量。交叉编译工具的安装步骤如下: (1)从官方站点http://arm.Linux.org.uk下载cross-2.95.3.tar.bz2;

(2)在usr/local/arm下解压:#tar -jxvf cross-2.95.3.tar.bz2;

(3)在/etc/bashrc文件中修改PATH环境变量,加入export PATH=/usr/local/arm/2.95.3/bin:$PATH。

3. ARM Linux系统的开发

3.1 Linux启动代码Bootloader的移植

Bootloader是在操作系统内核运行之前运行的一段小程序。这段程序完成硬件的初始化和建立内存空间的映射图等重要工作,为内核的启动创建正确的环境,并最终启动内核,Bootloader在Linux嵌入式系统中所处的层次位置如图3所示。Bootloader的实现依赖于CPU的体系结构,大多数的Bootloader都分为stage 1和stage 2两大部分,图4为两阶段Bootloader的结构框图。依赖于CPU体系结构的代码,如设备初始化代码等,通常都放在stage 1,而且用汇编语言实现。而stage 2则通常用C语言实现,这样可以实现复杂功能,而且有更好的可读性和移植性。

目前基于嵌入式系统的Bootloader版本很多,如Blob、Redboot、Vivi和U-Boot等,下面就以现在最流行的U-Boot为例,详细介绍如何将它移植到自己的目标板上。U-boot移植主要步骤如下:

首先基于自己的目标板的硬件资源,修改或添加U-Boot源代码的board/at91rm9200目录中如下源码文件:(1)重写FLASH的设备控制程序flash.c , U-Boot读、写和删除Flash设备的源代码文件。由于在不同目标板中FLASH存储器种类各不相同,参照自己flash的datasheet重写 flash的设备控制程序flash.c,该程序完成的功能包括Flash初始化、打印Flash信息、Flash擦除和Flash写入等操作。(2)添加memsetup.s。该汇编源码文件初始化时钟、SMC控制器和SDRAM控制器。(3)添加网卡芯片DM9161E的设备控制程序dm9161.c 和dm9161.h,程序。(4)修改Makefile文件。对上述修改或添加的源代码文件编译后,在Makefile里面主要做如下修改: OBJS :=at91rm9200dk.c at45.o dm9161.o flash.o  SOBJS:=memsetup.o(5) U-Boot.lds ,设置U-boot中各个目标文件的连接地址,基本不做修改。(6)config.mk。根据目标板的一级boot来修改,修改后TEXT BASE=0x21f00000。

其次,修改目录include/configs的头文件at91rm9200dk.h,根据目标板的资源配置,修改内容包括CPU ,系统时钟、RAM 、Flash等配里信息以及内存映射相关参数。该头文件还定义了U-Boot的一些环境变量和内核启动参数.可在U-Boot启动后通过setenv和 saveenv命令修改。U-Boot-1.1.2版本对at91rm9200处理器提供良好的支持,因此对于目录CPU at91rm9200中的源码基本不做修改。在U-Boot-1.1.2的Makefile中加入如下代码:

at91rm9200dk_config: unconfig@/mkconfig $(@: _config=) arm at91rm9200 at91rm9200dk

其中“arm”是CPU的种类,at91rm9200是ARM CPU对应的代码目录,at91rm9200dk是目标板对应的目录。由于交叉编译器安装在目录/usr/local/arm,应把环境变量 CROSS_COMPILE设置成相应路径:CROSS_COMPILE=/usr/local/arm/2.95.3 /bin/arm-linux-

最后,调试U-Boot源代码,直到U-Boot在开发板上能正常启动,调试成功后,烧写U-Boot到FLASH,烧写完成后,复位目标板,串口终端就显示U-Boot的启动信息。

3.2  Linux内核的移植、配置和编译

标准Linux内核相对于资源受限的嵌入式系统来说是过于庞大,整个代码分布如图5所示,因此要将其移植到嵌入式系统上,就需要将Linux内核根据目标平台的情况进行剪裁、配置,该目标板的主要硬件资源如图6所示。和ARM体系结构相关的代码都放在arch/arm/以及include/asm-arm/目录下,将linux移植到ARM平台上,主要修改这两个目录下的代码。要想使linux内核应用于自己的ARM平台AT91RM9200上,必须对内核的源代码做一定的修改,主要修改部分如下:(1) 修改根目录下的Makefile文件,确认ARCH和CROSS_COMPILE的定义:ARCH :=arm; CROSS_COMPILE :=arm-linux- (2)修改arch目录下的Makefile文件,根据自己的电路设置TEXTADDR变量,TEXTADDR决定内核起始运行地址,即 image.ram应下载的地址。(3)修改arch目录下的config.in 文件,添加CONFIG_ARCH_AT91RM9200自选项,config文件决定了menuconfig菜单的内容,把使用的平台加在需要的地方,这样在配置linux内核时就能够选择是否支你的平台了。

(4)修改arch/arm/boot目录下的Makefile文件,根据自己的电路设置ZTEXTADDR和ZRELADDR, ZTEXTADDR和ZRELADDR分别是自解压代码的起始地址和内核解压后代码输出起始地址。(5)修改arch/arm/boot /compressed目录下的Makefile文件,加入head-at91rm9200.S (6)修改arch/arm/kernel目录下的Makefile文件,增加AT91RM9200的支持,同时在    debug-armv.S中加入关闭全部外围设备,保证系统正常运行的代码,在entry-armv.S中加入关于CPU中断处理部分的代码。(7)修改 arch/arm目录下的mm-armv.c文件,将init_maps->bufferable=0改为init_maps-> bufferable=1;

当然,一些大的芯片开发商在发行芯片的同时,针对自己芯片的体系结构对linux内核作了一些补丁。实验中使用的是针对AT91RM9200体系结构的补丁patch-2.4.19-rmk7给标准内核源代码打上补丁后,该内核就可应用于AT91RM9200了,这样可以大大减少开发的工作量。

移植之后要做的工作就是编译内核,要想编译适合自己工程中需要的内核,首先要对内核进行配置,常用的配置命令有:make config;make oldconfig;make menuconfig;make xconfig;make defconfig;Linux内核包允许用户对其各类功能逐项配置,在配置时, 大部分选项可以使用其缺省值, 只有小部分需要根据用户不同需要选择。选择的原则是将与内核其它部分关系较远部分且不经常使用的部分功能代码编译成为可加载模块, 有利于减小内核的长度, 减小内核消耗的内存,不需要的功能就不要选, 与内核紧密且经常使用的部分功能代码直接编译到内核中。主要是进行以下几项配置: (1)选择处理器类型;(2)选择板级支持;(3)选择对RAMDISK支持、对设备驱动的支持以及对文件系统的支持。在配置工作完成后, 就可以进行内核编译。

编译内核有压缩方式和非压缩两种方式。非压缩方式使用make vmlinux来编译内核,或者直接运行make命令。压缩方式用make bzImage来编译内核。编译成功后会在arch/arm/boot目录中生成内核的镜像,此镜像下载到flash中就可以通过bootloader引导。具体的编译步骤如下:(1) 进入打上补丁修改好的内核源代码目录下,执行make mrproper;make clean这两条指令,将源代码清理干净(防止以前编译产生的“垃圾”干扰)。(2)执行make at91rm9200dk_config,使源代码按照AT91RM9200体系结构来配置。 (3)执行make o1dconfig(保存原编译配置)(4)执行make menuconfig进入内核编译前配置界面,进行配置。(5)执行make dep声称编译要用的依赖文件。(6)执行make zImage生成内核镜像。

3.3 文件系统的移植

linux采用文件系统组织系统中的文件和设备,为设备和用户程序提供统一接口。linux要启动起来还需要有根文件系统。根文件系统的作用是存放各种工具(如Linux命令)、应用程序、必需的链接库等等。通常用busybox来制作根文件系统,在busybox中包含一百多种Linux上标准的工具程序, 而这些工具程序仅需几百k空间。busybox使用非常方便, 只要建立一个符号连接即可, 用户可以通过配置Config.h 和Makefile文件来定制busybox。将busybox复制到bin目录中,分别使用ln-s 建立每一个命令的符号连接。但应该注意的是busybox需要glibc支持(如果使用静态连接则不需要glibc 库文件),因此还需要将运行busybox所需的库文件copy到lib目录中, 并建立符号连接。到此为止, ARM Linux 的根文件系统就已经建立起来了。

ARM Linux采用RAMDISK的方式来装载根文件系统,所以在运行内核之前,需要先制作RAMDISK,将必须的文件和设备加人到RAMDISK中。内核启动后,会从指定地址去读取根文件系统,这里我们使用RAMDISK在内存中虚拟一个磁盘,具体方法如下:

(1)首先创建一个2048k的虚拟磁盘,文件名为initrd.img:# dd  if= dev/zero of=initrd.img bs= lk count= 2048  (2)将该虚拟磁盘文件格式化成Ext2格式:# mkfs ext2 -c initrd.img这就生成了一个支持Ext2文件系统的ramdisk  (3)mount这个文件系统到/tmp下,# mount -o loop -t ext2 initrd.img /tmp  (4)向/tmp中添加linux启动必须的文件和设备。 # cd  /tmp;  # mkdir bin dev etc lib mnt proc sbin sys usr  以上这几个程序和设备是启动Linux必须的,这样得到的ramdisk大约400k  (5)创建设备节点,添加相应的程序,将已经订制好的一个文件系统全部复制过来。# cp –a  myfs/*  /tmp  (6)压缩映像,把loop设备卸载下来,然后用gzip命令把映像压缩一下。# umount /tmp ;  #gzip –best –c initrd.img > initrd.img.gz现在我们就得到了一个压缩的RAMDISK映像initrd.img.gz制作好了。

linux系统移植到arm芯片难吗,Linux操作系统怎么移植到ARM平台?相关推荐

  1. 61-20210407华为海思Hi3516DV300的linux系统下控制GPIO口(标准linux模式点亮LED灯)

    61-20210407华为海思Hi3516DV300的linux系统下控制GPIO口(标准linux模式点亮LED灯) 2021/4/7 15:13 https://xueqiu.com/797071 ...

  2. Linux系统详解 第五篇:Linux的安装-4:Fedora 16的安装

    Linux系统详解 第五篇:Linux的安装-4:Fedora 16的安装 前言: 本系列文章取材广泛,有来自于互联网的,有来自教科书的,有来自自己的笔记的,也有来自自己对Linux的经验积累的.此系 ...

  3. Linux系统运维与架构设计之Linux概述

    Linux系统运维与架构设计之Linux概述 Linux系统运维与架构设计 1.1 浅谈计算机系统 1.1.1 计算机硬件系统 现代计算机是基于冯·诺依曼体系结构,由运算器.控制器.存储器.输入设备. ...

  4. linux系统线程通信的几种方式,Linux进程间通信-线程间通信

    Linux作为一种新兴的操作系统,几乎支持所有的Unix下常用的进程间通信方法:管道.消息队列.共享内存.信号量.套接口. 1.管道 管道( pipe ):管道是一种半双工的通信方式,数据只能单向流动 ...

  5. linux 文件和打印机共享文件夹,能实现Windows和Linux系统之间文件和打印机共享的Linux服务是( )...

    能实现Windows和Linux系统之间文件和打印机共享的Linux服务是( ) 答:SAMBA HTML 代 码 表示() 答:创建一个单选框 根据凯恩思的理论,在短期中总供给线为一条水平线,当总需 ...

  6. Linux系统适配苹果M1 芯片的项目有新进展

    苹果自研的 M1 芯片于 2020 年正式发布,从产品发布起,一些开发者便开始了将 Linux 系统适配 M1 芯片的项目. 近日消息 苹果自研的 M1 芯片于 2020 年正式发布,从产品发布起,一 ...

  7. linux烧录,新人求教,怎么烧录Linux系统到一个小芯片上?

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 你去找一些嵌入式开发的资料就ok了.我这里大概说一下几种情况,便于你理解. 向存储介质上装载linux其实是没有区别的,只不过你需要一个和你的存储介质相对 ...

  8. linux系统无线驱动在哪下载,在linux上怎么安装无线网卡驱动?

    在linux上怎么安装无线网卡驱动? 在linux上安装无线网卡驱动的方法: (1)先确定无线网卡型号,因驱动安装和型号是密切相关的,不同的型号,安装和下载驱动有所不同,但原理是一样的.图例为无线网卡 ...

  9. 基于web的新闻发布系统_终极Linux系统ExTiX 19.8发布,基于深度操作系统deepin15.11...

    近日,GNU/Linux开发人员Arne Exton发布了他的ExTiX 终极Linux系统的新版本,带有全新的底层和更新的组件. ExTiX Deepin 19.8基于Deepin Linux操作系 ...

  10. linux系统和性能监控之cpu篇,Linux系统和性能监控之CPU篇

    1.0 性能监控介绍 性能优化就是找到系统处理中的瓶颈以及去除这些的过程,多数管理员相信看一些相关的"cook book"就可以实现性能优化,通常通过对内核的一些配置是可以简单的解 ...

最新文章

  1. Android 系统提供的文件下载
  2. [BZOJ3668][Noi2014]起床困难综合症 贪心
  3. 制作越狱版本的ipa文件
  4. Hyperledger Fabric 1.0 实例简析 第一课 network_setup.sh分析
  5. 微博环境下利用综合策略构建推荐引擎
  6. windows下恢复删除的逻辑分区
  7. 怎样写一篇优秀论文?看完受益匪浅!
  8. JAVA比较文件是否相同
  9. 最近和一个35岁的朋友聊天,他最近在找工作
  10. 小米 pro 笔记本拆机-加固态
  11. CwRsync | Windows与Windows之间同步备份配置详解
  12. outlook统一签名模版设置
  13. Android 分享到Instagram
  14. python股票预测_利用Keras长短期记忆(LSTM)模型预测股票价格
  15. 关于Cat,同轴,光纤等以太网电缆的所有信息
  16. 【ArcGIS风暴】ArcGIS标注和注记的区别及用法案例详解
  17. 化工学matlab,化工和石化行业
  18. 微信朋友圈会在服务器上保留多久,微信朋友圈设置多久可见,暴露了你的为人...
  19. 信号完整性学习笔记-IBIS模型
  20. 山东大学单片机原理与应用实验 汇编程序实验2

热门文章

  1. [GO语言基础] 一.为什么我要学习Golang以及GO语言入门普及
  2. 【C语言】双人格斗小游戏(源码)
  3. C语言小游戏,游戏设计,500+行代码
  4. python简明教程电子书下载_python简明教程中文pdf下载-Python入门级电子书完整免费版-东坡下载...
  5. 支持java浏览器_如何为浏览器安装支持JAVA的插件
  6. everyting真是一款很好的搜索软件, 免费软件
  7. fmea第五版pfmea表格_FMEA第五版中文版.pdf
  8. miui tv android,MIUI for TV 3.0上线 应用远程安装 手机反控电视
  9. ll1语法分析程序c语言,c语言语法分析器,实现ll1分析
  10. 【MFC开发(5)】单选按钮控件RADIOBUTTON