关于嵌入式linux移植的理论问题

时间:2011-09-05

 

  嵌入式Linux的概念

  应用为中心、以计算机技术为基础、软件硬件可裁剪、适应应用系统对功能、可靠性、成本、体积、功耗严格要求的专用计算机系统。举例来说,大到油田的集散控制系统和工厂流水线,小到家用VCD机或手机,甚至组成普通PC终端设备的键盘、鼠标、软驱、硬盘、显示卡、显示器、 Modem、网卡、声卡等均是由嵌入式处理器控制的,嵌入式系统市场的深度和广度,由此可见一斑,尽管如此,它的市场价值也许仍然超过了您的想象:今天,嵌入式系统带来的工业年产值已超过了1万亿美元。

  嵌入式Linux的特点

  嵌入式Linux操作系统产品在2000年开始涌现,短短一年之后,嵌入式Linux操作系统达到了整个嵌入式操作系统市场的1/4。人们惊呼,没想到Linux行业的赢利竟然是从嵌入式Linux系统开始的!Linux在嵌入式系统领域能取得成功有以下几点原因:

  1)性能稳定,功能强大,占用资源较少。Linux是按照POSIX标准编写的,许多源代码借鉴了UNIX。

  2)模块的动态加载,独特的内核结构和工作方式使Linux非常适合于工作在嵌入式系统中。

  3)良好的平台可移植性,Linux-2.4.0已经支持除i386、i586、i686和arm之外的alpha、m68k、mips、mips64、ppc、sparc、sparc64、ia64的十多种体系结构。

  4)系统可剪裁性,可以灵活的添加和删减各种驱动程序,具体的PDE(Portable Digital Equippment)跟实际应用联系十分密切,采用的器件多种多样,良好的平台可移植性和系统可剪裁性对灵活的系统设计有着极其重要的意义,也为开发调试提供了方便。

  5)整个系统是的,只要遵守GPL规则,任何人都可以使用、修改甚至销售Linux,全世界有无数个人和组织在不断的完善Linux,有众多的计算机厂商提供Linux相关的产品和服务。开放源代码意味着对新设计、制造的硬件产品的快速支持。嵌入式系统的应用领域通常要求系统高度个性化、高度细分。因此,对新产品的快速支持是一个适合推广的嵌入式操作系统必须具备的能力。

  6)对多种网络协议的完美支持。在即将到来的后PC时代,联网将成为数字产品必备的能力,没有联网能力的设备,在信息化时代会显得毫无意义。而Linux天生具备优良的网络连接能力,支持当前所有的网络协议。

  移植的基本概念:

  移植是指将软件从一个平台迁移到另一个平台

  * 从一个硬件平台移植到另一个硬件平台

  * 从一个操作系统移植到另一个操作系统

  * 从一种软件库环境移植到另一个软件库环境

  软件进行移植的容易程度即可移植性

  Linux硬件平台:

  在Linux内核里,每一个处理器指令集对应一个独立的体系结构architecture,比如alpha, arm,i386, mips, ppc

  每个体系结构可以有若干变种variant,或不同配置的硬件machine

  统称sub-architecture。以arm体系结构举例

  * variants 包括arm7tdmi, arm926ejs, strongarm,xscale

  * machine 包括edb7312, smdk2410, omap-h2

  硬件平台对C程序的影响:

  处理器字长,定义为处理器能处理的数据位数。

  字长等于处理器内部数据通路的宽度,一般可以通过通用寄存器的宽度来判断

  处理器字长会影响int, long等C类型的长度

  C代码当中需要使用确定大小的数据类型,可以使用显式长度的类型u8, s8, u16, s16, u32, s32, u64, s64

  数据对齐:

  数据对齐是指数据块的地址是某个特定大小的整数倍

  * 32位处理器字对齐n*4

  * 页对齐n*PAGESIZE

  * Cache line对齐n*CLINESIZE

  数据访问要求至少是字对齐的,多数情况下编译器会处理数据访问的对齐。不对齐访问的例子

  * char a[10];

  * unsigned long* pl = (unsigned long *)(a+1);

  * unsigned l = *pl;

  字节顺序:

  字节顺序byte order是指一个字中字节排列的顺序

  不同硬件可能采用不同byte order

  *  x86 little-endian

  *  ppc big-endian

  Linux内核将硬件的byte order放在<asm/byteorder.h> 里面定义,__BIG_ENDIAN或__LITTLE_ENDIAN

  在include/linux/byteorder /里面有几个头文件,定义了

  *  u23 __cpu_to_be32(u32);

  *  u32 __cpu_to_le32(u32);

  *  u32 __be32_to_cpu(u32);

  *  u32 __le32_to_cpus(u32);

  时间:

  软件中的与时间相关的代码也会影响移植

  采用平台无关的时间表达方法可以提高代码可移植性

  Linux内核里面采用HZ来表示每秒钟有多少个内部时钟滴答,以下对时间的描述是平台无关的

  *  HZ

  *  (2*HZ)

  *  (HZ/2)

  *  (HZ/100)

  *  (2*HZ/100)

  内存页面大小:

  Linux使用虚拟内存机制来管理内存,内存的使用基于页面。

  不同的体系结构有不同的页面大小

  常用的32位处理器使用4kB页面大小

  部分体系结构可以支持多种页面大小

  内核在<asm/page.h>里面定义PAGE_SIZE,PAGE_SHIFT

  *  PAGE_SIZE表示页面大小

  *  PAGE_SHIFT表示页面号在地址中的偏移量

  *  PAGE_SIZE=2^ PAGE_SHIFT

  Linux操作系统移植:

  工具链移植

  * binutils (assembler, linker)

  * gcc (compiler, libgcc)

  * glibc/uclibc

  内核移植

  * arch implementation

  * drivers porting

  应用程序移植

  * C program recompile

  * Implement absent library

  Linux内核的平台相关代码:

  Linux内核对多平台有很好的支持 内核的对外部接口是统一的,并且与平台无关

  内核的大多数代码也是与平台无关的主要的体系结构相关代码存在于

  * arch/architecture

  * include/asm-architecture

  比如arm体系的平台相关代码主要是

  * arch/arm

  * include/asm-arm

  已有代码向Linux内核移植:

  将已有代码向内核中移植有一些限制

  * 内核中没有标准C库支持

  * 内核中没有象用户程序那样的内存保护

  * 内核中不便使用浮点操作

  * 内核的堆栈是固定大小的,并且比较有限

  * 在内核中需要编程者考虑并发带来的竞争与冒险,以及同步问题

  Linux内核移植:

  Linux内核代码可以分为平台相关部分和平台无关部分

  Linux内核绝大部分代码是平台无关的,

  可以被各种平台所共享

  *  调度算法

  *  存储器管理

  *  I/O子系统

  *  网络协议栈

  依赖于特定硬件的代码在Linux中采用条件编译的方式区分

  *  ARCH = x86 即打开x86特有的代码

  *  ARCH = arm 即打开arm特有的代码

  Linux内核的arch目录:

  进入arch目录,每个体系结构代码都有一个子目录

  进入arm目录,在arm体系结构下我们可以看到很多sub-arch的子目录

  实现sub-arch:

  在sub-arch子目录下,以mach-s3c2410为例 一个硬件平台支持需要实现以下几个硬件相关的文件

  *  mach-s3c2410.c, irq.c, clock.c, dma.c, gpio.c, pm.c,sleep.c, time.c

  *  同时在include/asm-arm/arch-s3c2410要实现

  Low-level IRQ helper macros

  Debug output macros

  Irq number definations

  DMA definations

  Memory mapping/translation

  Reset operation

  IDLE function

  mach-smdk2410.c:

  在mach-smdk2410.c中,我们要定义以下几个内容

  smdk2410_iodesc,描述了所有保留的设备io地址。这个描述符是我们移植一个特定目标板非常重要的地方

  在这个板描述文件中还要定义

  .phys_ram

  .phys_io

  .io_pg_offst

  .boot_params

  .map_io

  .init_irq

  .timer

  map_io:

  map_io里面需要实现设备io的初始化

  在这里要用到smdk2410_iodesc描述符。该描述符是一个数组,其中每一项都描述了一个设备的IO映射

  时钟pll的设置、uart的设置都可以在map_io中调用

  init_irq:

  在这个调用里面,关于中断的初始化将会被完成

  * 清除中断pending寄存器

  * 注册主要的中断处理程序

  * 设置系统中的设备中断

  timer:

  timer是一个sys_timer类型的结构,它包含以下成员

  -init 调用执行硬件相关的timer初始化

  -offset 调用返回自从上次timer中断以来经过的微秒数

  -resume 调用执行系统唤醒后的timer恢复操作,一般实现上和init里面的初始化一样

  应用程序移植:

  理想情况下,程序可以不作更改,或仅仅打一些补丁,然后告诉编译环境按照目标环境要求编译即可

  * busybox

  * bash

  * sysv init

  依赖某些平台特性的应用程序移植起来往往难度更大

  * 图形库

  * 为速度进行优化的代码,比如编解码器

  软件编程语言的跨平台性直接影响软件的可移植性。此外还有其他因素

  软件协议/源代码的开放程度

  应用程序移植常见问题:

  1依赖软件造成移植性问题

  * C库版本问题

  * 图形库带来的问题

  * 软件依赖某些服务带来问题

  2网络应用在little-endian平台上的处理

  * 网络传递数据是big-endian的

  3软件依赖特定平台的特性

  4平台的数据一致性模型差异

  嵌入式Linux的移植是近几年才发展起来的新事物,它以其诸多优点为整个IT行业带来新的活力,成为后PC时代

  的重要标志之一,促进了整个嵌入式领域的竞争与发展,为我国的IT行业带来了新的机遇。但嵌入式

  Linux技术还不是特别成熟,现正处于快速发展阶段,其广泛的应用还尚需时日,这有待于我们进一步的

  深入分析研究。



  
上一篇:可测距的低成本超声子系统设计
下一篇:浅谈智能家居系统设计中的几个关键技术

免责声明: 凡注明来源本网的所有作品,均为本网合法拥有版权或有权使用的作品,欢迎转载,注明出处。非本网作品均来自互联网,转载目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责。

相关技术资料