基于ARM9的Linux代码移植

发布者:逍遥游侠最新更新时间:2021-01-25 来源: 21ic关键字:ARM9  Linux  代码移植 手机看文章 扫描二维码
随时随地手机看文章

简介:介绍了嵌入式Linux移植的方法和过程,给出了嵌入式开发环境下基于硬件平台ARM9的bootloader、Linux内核移植的实现方案,该方案可为嵌入式系统的应用研究提供操作系统层面的支持。


摘要:介绍了嵌入式Linux移植的方法和过程,给出了嵌入式开发环境下基于硬件平台ARM9的bootloader、Linux内核移植的实现方案,该方案可为嵌入式系统的应用研究提供操作系统层面的支持。


O 引言


随着计算机技术、通信技术以及Internet的飞速发展。嵌入式系统已得到越来越广泛的应用。与此同时,嵌入式系统的复杂性也在不断增加,嵌入式操作系统已经成为其中最重要的组成部分。目前,市场上存在着众多的嵌入式操作系统,而在这些系统之中,兼有Linux和嵌入式优点的嵌入式Linux操作系统,凭借其在结构清晰、源代码开放性、裁剪性好,开发与使用均易实现等方面的优势,拥有巨大的市场前景和商业机会。当前嵌入式Linux的一个热点应用就是将Linux内核移植到一些典型的微控制器和微处理器上,提供操作系统层面支持,以实现嵌入式系统用软件的开发。


此研究基于Linux 2.6内核的嵌入式Linux系统,分析了所面临的理论问题、关键技术,实现了Linux内核在ARM9平台上的运行。


1 开发环境介绍


嵌入式IJnux移植是嵌入式系统开发的重要组成部分,它需要相应的软件组件支持,同时又与目标硬件平台关系密切。因此,在正式移植


前,首先应明确嵌入式系统开发的流程与开发环境,再根据目标硬件平台的特点和所选择的软件组件,正确搭建功能完善的交叉开发环境,最后制定出合理的移植方案,从而使移植工作可以顺利的进行。


1.1 ARM9硬件平台


本次移植采用斯道ARM9开发板作为硬件平台,其基本构成为核心板和底板(外设板或基本板),核心板上集成了SamsungS3C2410处理器、64 M的FLASH和64M的SDRAM,为应用研发提供了足够的空间,基板则提供了丰富的外围接口。其硬件平台结构如图l所示。

此完整的应用系统具有体积小、耗电低、处理能力强等特点,能够装载和运行嵌入式Linux操作系统。用户可以在这个系统平台上自主进行软件开发。


1.2 Linux内核及处理器


目前用于嵌入式Linux系统的内核大多数使用2.4.x版,然而,随着嵌入式微处理器性能的不断增强及其应用范围的日趋扩大,Linux-2.6版内核由于其针对嵌入式系统应用的显著特点,必将会越来越多的被应用于嵌入式系统移植与开发Linux系统之中。文中采用的是Linux-2.6版内核。


vivi是韩国mizi公司开发的bootloader,适用于ARM9处理器,支持S3C2410X嵌入式ARM-Linux移植的应用处理器。和所有的bootloader一样,vivi也有两种工作模式,即启动加载模式和下载模式。启动加载模式指在一段时间后(这个时间可更改)自行启动Linux内核,它是vivi的默认模式。下载模式则是指vivi为用户提供一个命令行接口,用户可通过接口使用命令。


2 系统移植方案


在硬件方面,为支持NAND Flash引导模式,S3C2410A处理器在芯片内集成了4 KB的被称为steppingstone的SRAM。NAND Flash引导模式下,系统复位后NAND Flash中的前4位内容首先被复制到steppingstone,接着将steppingstone映射到nGCSO,即内存BankO起始她址为Ox00000000,随后系统开始正常引导。


同样,在软件方面,bootloader程序应被烧写到NAND Flash最前面的部分。通常bootloader程序大于4 KB,因此,在bootloader的前4 KB程序段中,必须先完成内存SDRAM的初始化,并将自身完全复制到SDRAM中,同时设置必要的堆栈,然后跳转到SDRAM中去执行这一系列工作。这样方可完成后续的初始化系统资源及装载操作系统内核的任务。


本次移植使用ARM9开发板,通过跳线方式设置OM[1:0]引脚来支持NAND Flash启动模式,因此,移植方案使用NAND Flash+SDRAM的存储模式,bootloader放在SDRAM中,内核和文件系统都放在NAND Flash中,根据选用的方案,整个系统移植要做的工作包括两方面:


Bootloader:为装载操作系统内核,支持NAND Flash及网络下载和串口通信,从而方便嵌人式ARM.Linux移植以开发调试。


Linux系统:支持NAND Flash,并移植Cramfs+Yaffs混合文件系统;支持NFS文件系统及网络通信、串口等。


3 Linux内核移植


在同一硬件平台上可以嵌入不同的嵌入式操作系统,这就好比PC既可以安装Windows又可以安装Linux一样。同样,有些操作系统经过移植后即可运行在不同的硬件平台上。通常情况下,如果一个系统可以在不同硬件平台上运行,那么这个系统便是可移植的。将某一个平台的代码运行在其他平台上的过程称作移植。嵌入式系统是“硬件可裁剪”的,因此工程师们设计的硬件电路会有所不同,从而使这些代码可能无法正确运行,因而要实现移植就应结合自己的硬件电路,对已有的内核代码进行修改。


3.1 内核移植难点


Linux系统的内核是多层次结构的单体内核,其可移植性比微内核要差一些,但是,这种内核具有较高的效率。从操作系统发展的趋势来看,微内核作为一种先进的操作系统结构,是操作系统发展的一个潮流。但是,微内核结构较低的系统通信效率大大的降低了系统的性能。所以,从系统效率和性能的角度来考虑,Linux并没有采用先进的微内核结构而是选择了传统的单体内核机构。


3.2 内核移植的基本策略


在Linux2.6内核支持下,Linux已经在许多典型的硬件平台上实现移植,其中包括:I386、ARM、MIPS、ALPHA、PowerPC、SPARC、SH等。但是对于基于特定硬件体系设计的硬件平台,需要从头对Linux进行移植。此外还有部分体系的硬件平台,Linux只对其中部分的CPU或目标板提供了支持,如果使用了Linux尚未支持的CPU或目标板,也需要对Linux内核进行移植工作。通常可以采用以下两种方法进行Linux内核移植工作:


(1)从头设计。即采用“自底向上”的设计方法,从硬件的需求考虑逐步的采用分析、设计、编码、测试。这种方法比较适合针对一种全新的硬件平台开展移植工作。


(2)修改已有的代码。如前所述,Linux已经可以在多种体系结构中运行,那么,我们可以参考相近的体系结构的代码,只修改与我们的目标硬件平台不同的部分即可。这种方法的难点在于开发人员除了要了解目标硬件平台外。还必须对已支持的软硬件有一个较好的理解。本次研究的移植工作就是采用了这种开发方法。


3.3 内核移植方法


对于系统移植而言,Linux实际上是由两个比较独立的部分所构成,即内核部分和系统部分。通常启动一个Linux系统的过程为:一个不隶属于任何操作系统的加载程序将Linux部分内核调入内存,并将控制权交给内存中Linux内核的第一行代码,这样就完成了加载程序的工作。此后Linux要将自己的剩余部分全部加载到内存,初始化所有的设备,在内存中建立好所需的数据构(有关进程、设备、内存等)。此时,内核已经可以控制所有硬件设备。而后转入系统部分,操作并使用这些硬件设备。接下来内核加载根设备并启动init守护进程,init守护进程会根据配置文件加载文件系统、配置网络、服务进程及终端等。一旦终端初始化完毕,我们就会看到系统的欢迎界面了。概括说来,一部分内核初始化和控制绝大部分硬件设备,为内存管理、进程管理、设备读写等做好一切准备工作;另一部分系统加载必需的设备,配置各种环境以便用户可以使用整个系统。

图2所示为Linux内核硬件相关结构。可以看出,Linux内核中与具体硬件平台相关的结构主要分为两个部分:与具体的处理器结构相关的部分,包括中断处理、内存操作以及进程控制等;与具体外设关系密切的部分,包括硬件驱动与I/O设备。


内核移植由五个功能部分组成:进程管理(包括调度和通信)、内存管理、设备驱动、虚拟文件系统与网络,它们之间存在复杂的调用关


系。前三部分按从前到后的顺序,越靠前代表它们与硬件设备的相关程度越高,后面的虚拟文件系统和网络则几乎与平台无关,它们由设备管理中所支持的驱动程序来提供底层支持。因此,在做内核移植的时候,需要改动的就是进程管理、内存管理和设备管理中被独立出来的那部分即硬件相关部分的代码。在Linux内核源代码树中,这部分代码全部在areh目录下,主要是被内核直接调用的底层支持部分。这些代码重写了内核所需调用的所有函数,因为接口函数是固定的,所以这里更像是为硬件平台编写API。


3.4 内核移植过程


首先在通用计算机上编写程序,然后通过交叉编译生成可在目标平台上运行的二进制代码格式,最后再下载到目标平台计算机的特定位置上运行。Linux内核移植过程如下:


(1)建立移植所必须的交叉开发环境。需准备两台计算机,一台用作修改编译Linux内核,另一台用作移植Linux内核。


(2)编写和修改Linux内核。在通用计算机上修改和编写新的内核代码,编译出新的Linux内核。


(3)调试新的Linux内核。将编译后生成的新Linux内核加载到目标计算机上进行运行和调试,这个调试的过程就是交叉调试。


调试器是一个单独运行着的进程,它通过操作系统提供的调试接口来控制被调试的进程。在Linux内核移植过程中,调试时采用的是在宿主机和目标机之间进行的交叉调试。交叉调试有多种方法,它有一些典型特点:


◇调试器和被调试进程通常运行在不同的机器上(注:Linux内核作为操作系统内核,不同于普通进程,但在交叉调试中作为被调试对象,与普通进程没有区别),一般调试器运行在PC或者工作站主机(宿主机)上,而被调试的进程则运行在各种专业调试板(目标机)上。调试器通过某种通信方式与被调试进程建立联系,如串口、并口、网络、DBM或者专用的通信方式。本次移植采用了串口和JTAG两种方式与目标机进行通信。


◇在目标机上一般会具备某种形式的调试代理,它负责与调试器共同配合完成对目标机上运行着的进程的调试。这种调试代理可能是某些支持调试功能的硬件设备(如 DBI2000),也可能是某些专门的调试软件(如 gdbserver)。本次移植使用的是GDB—Stub。


◇如果目标机是某种形式的系统仿真器,通过在宿主机上运行目标机的仿真软件,整个调试过程可以在一台计算机上运行。虽然此时物理上只有一台计算机,但逻辑上仍然存在着宿主机和目标机的区别。本次移植没有使用系统仿真器。调试时,作为调试器的GDB运行在宿主机上,相应的GDB—Stub运行在目标机上。GDB通过串口或者网络与GDB—Stub进行通信,发出指令控制、访问运行在目标硬件平台上的新的Linux内核,读取Linux内核的当前状态,并能够改变Linux内核的运行状态。


经过多次移植测试后,就在基于ARM920T核的53C24lO处理器为核心处理器的ARM9平台上成功移植了Linux操作系统。


4 结束语


文中阐述了在基于ARM920T核的53C2410处理器为核心的ARM9平台上移植Linux操作系统的环境、方案和过程,对移植的难点进行了重点分


析,这对ARM9平台上的嵌入式Linux移植具有较好的实用价值和参考价值,同时对于其它平台上的嵌入式Linux移植的方法也具有一定的借鉴意义。


关键字:ARM9  Linux  代码移植 引用地址:基于ARM9的Linux代码移植

上一篇:以ARM和DSP嵌入式系统为核心的实时仿真平台的开发
下一篇:基于LPC2131嵌入式系统的CAN模块设计与实现

推荐阅读最新更新时间:2024-11-09 14:18

OK6410A 开发板 (八) 8 linux-5.11 OK6410A 详细解析 start_kernel运行时的 栈
include/asm-generic/vmlinux.lds.h 376 #define INIT_TASK_DATA(align) 377 . = ALIGN(align); 378 __start_init_task = .; 379 init_thread_union = .; 380 init_stack = .; 38
[单片机]
基于arm的linux系统调用分析
1系统调用的作用 linux内核中设置了一组用于实现各种系统功能的子程序,称为系统调用,最简单的如read,write,open等等。用户可以通过系统调用命令在自己的应用程序上调用他们,从某种角度来看,系统调用和普通函数调用非常相似。区别在于系统调用由操作系统核心提供,运行在内核态,而普通函数调用由函数库或用户自己提供,运行于用户态。实际上,很多已经被我们习以为常的C语言标准函数,在linux平台上的实现都是靠系统调用来完成的,所以如果想对系统底层原理作深入的了解,就得掌握各种系统调用时初步的要求。 2 系统调用是如何工作的 我们知道一般进程是不能访问内核的,系统调用时用户空间访问内核空间唯一合法的途径。早期linux采用OA
[单片机]
基于arm的<font color='red'>linux</font>系统调用分析
【ARM】一步一步移植Linux Kernel 2.6.13到板子
#1环境搭建所需材料 Linux 内核代码 编译器 文件系统 samba tftp SecureCRT6.0 开发板uboot nfs-kernel-server #2环境搭建所需材料之间的关系 #3所使用的开发板 #4译内核 ##4.1修改makefile ##4.2拷贝配置文件 ##4.3编译得到zImage ##4.4把zImage转成uImage #5开发板串口连接 串口形状 ,在电脑上映射出来的串口设备连接串口 到0回车。。。 #6uboot设置 #7通过tftp服务器下载uImage #8启动内核 这时启动内核后还不会进入文件系统 #9先看挂载文件系统的样子 先看现象
[单片机]
【ARM】一步一步<font color='red'>移植</font><font color='red'>Linux</font> Kernel 2.6.13到板子
OK6410A 开发板 (八) 80 linux-5.11 OK6410A CFS调度器
CFS调度器 和 CFS调度器类 有什么关系 CFS调度器类中 有两种 调度器策略 : SCHED_NORAML SCHED_BATCH , 这个和调度器有什么关系 CFS CFS 完全公平调度 完全公平体现在 每个进程在一次调度间隔内的总的虚拟运行时间相等 一轮调度: cfs中调度中一个进程最小运行时间是0.75ms 调度周期:在某个时间长度可以保证运行队列中的每个进程至少运行一次,我们把这个时间长度称为调度周期。也称为调度延迟,因为一个进程等待被调度的延迟时间是一个调度周期。 调度最小粒度:为了防止进程切换太频繁,进程被调度后应该至少运行一小段时间,我们把这个时间长度称为调度最小粒度。
[单片机]
[S3C6410-01]烧写Linux3.0.1系统
经过Linus Torvalds及无计其数的linux爱好者的努力,linux kernel3的第一个版本3.0.1终于出师。看了一下官方介绍,截至目前,稳定版的3.3.4也已发布,linux3增加了一些功能,同时也增加了很多驱动。具体的细节可以在网上查到。既然linux3都已经出来了,就赶个时髦,在此上面做些东西。 由于我手头只有一块ok6410的板子,在其官方网站上看到飞凌的工程师已经成功移植好ok6410板的linux3.0.1系统,所以闲来无事,我就把我的2.6.28系统升级到3.0.1。 但是飞凌官方的文档写的真不靠谱,如果按照里面的步骤烧写系统,很让人DT。真希望以后他们能找个文档工程师专门来写操作手册。 第一次按照手
[单片机]
OK6410A 开发板 (八) 74 linux-5.11 OK6410A linux 内核同步机制 信号量(count=1)的实现
解决的问题是什么 所有异常原因 限制是什么 加锁函数会引起睡眠,所以不能... 实现 https://elixir.bootlin.com/linux/v4.0/source/kernel/locking/semaphore.c#L53 /* 向下-获取信号量 @sem:要获取的信号量 获取信号量。如果不允许更多任务获取信号量,则调用此函数将使任务进入睡眠状态,直到释放信号量。 不赞成使用此函数,请改用down_interruptible()或down_killable()。 */ void down(struct semaphore *sem) { unsigned long flags; raw_spi
[单片机]
移植QT5.6.0到嵌入式linuxS3C2440单板
目前网上关于QT5.6的移植教程还不完善,本博客详细说明QT5.6.0移植到嵌入式linux单板的详细步骤。并将移植好的分享在GitHub上。 一、实验环境 (1)编译工具链 arm-Linux-gcc-4.4.3.tar.gz (2)linux系统 linux-3.4.2 (3)虚拟机 16.04.1-Ubuntu (4)busybox busybox-1.22.1.tar.bz2 (5)tslib tslib-1.4.tar.gz (6)qt5.6 源码 qt-everywhere-opensource-src-5.6.0.tar.gz (7)S3C24
[单片机]
构建Linux下IMX257 开发环境
  在linux下,我们可以有两种方法来实现:minicom 和 C-kerimit两种方法.   我刚开始使用的是minicom但是主要的原因是minicom使用的时缺出现乱码,也不知道是怎么回事,折腾了一会儿之后,没办法,就换成了C-kermit,经过实验,它确实是一个强大的软件.   C-kermit具体的安装方法此处不再介绍,可以在命令行$sudo apt-get install ckermit下载安装,简单点的也可以再linux自带的软件安装中实现.   安装完毕,接下来就是配置了. 1.配置kermit:   每个用户的kermit的配置文件在~/.mykermrc,如果这个文件不存在,则kermit会使用/etc/k
[单片机]
构建<font color='red'>Linux</font>下IMX257 开发环境
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved