the success's road

25
The success's road 嵌嵌嵌 嵌嵌嵌 Linux Linux 嵌嵌嵌 嵌嵌嵌 www.farsight.com.cn

Upload: brianna-nixon

Post on 04-Jan-2016

38 views

Category:

Documents


4 download

DESCRIPTION

The success's road. 嵌入式 Linux 的移植. www.farsight.com.cn. 今天的内容. 移植的基本概念 Linux 操作系统在嵌入式平台上的移植方法. 移植的基本概念. 移植是指将软件从一个平台迁移到另一个平台 从一个硬件平台移植到另一个硬件平台 从一个操作系统移植到另一个操作系统 从一种软件库环境移植到另一个软件库环境 软件进行移植的容易程度即可移植性. Linux 硬件平台. 在 Linux 内核里,每一个处理器指令集对应一个独立的体系结构 architecture ,比如 - PowerPoint PPT Presentation

TRANSCRIPT

Page 1: The success's road

The success's road

嵌入式嵌入式 LinuxLinux的移植的移植

www.farsight.com.cn

Page 2: The success's road

远见品质 今天的内容移植的基本概念Linux 操作系统在嵌入式平台上的移植方法

Page 3: The success's road

远见品质 移植的基本概念移植是指将软件从一个平台迁移到另一个平台从一个硬件平台移植到另一个硬件平台从一个操作系统移植到另一个操作系统从一种软件库环境移植到另一个软件库环境

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

Page 4: The success's road

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

每个体系结构可以有若干变种 variant ,或不同配置的硬件 machine 统称sub-architecture 。以 arm 体系结构举例variants 包括 arm7tdmi, arm926ejs, strongarm,

xscalemachine 包括 edb7312, smdk2410, omap-h2

Page 5: The success's road

远见品质 硬件平台对 C程序的影响处理器字长,定义为处理器一次能处理的数据位数。

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

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

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

Page 6: The success's road

远见品质 数据对齐数据对齐是指数据块的地址是某个特定大小的整数倍32 位处理器字对齐 n*4页对齐 n*PAGESIZECache line 对齐 n*CLINES

IZE

数据访问要求至少是字对齐的,多数情况下编译器会处理数据访问的对齐。不对齐访问的例子 char a[10] ;unsigned long* pl = (unsigned long *)(a+1);unsigned l = *pl;

Page 7: The success's road

远见品质 字节顺序 字节顺序 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); /* convert cpu's byte order to big-endi

an */ u32 __cpu_to_le32(u32); /* convert cpu's byte order to little-endi

an */ u32 __be32_to_cpu(u32); /* convert big-endian to cpu's byte ord

er */ u32 __le32_to_cpus(u32); /* convert little-endian to cpu's byte o

rder */

Page 8: The success's road

远见品质 时间软件中的与时间相关的代码也会影响移植采用平台无关的时间表达方法可以提高代码可移植性

Linux 内核里面采用 HZ 来表示每秒钟有多少个内部时钟滴答,以下对时间的描述是平台无关的 HZ /* one second */ (2*HZ) /* two seconds */ (HZ/2) /* half a second */ (HZ/100) /* 10 ms */ (2*HZ/100) /* 20 ms */

Page 9: The success's road

远见品质 内存页面大小Linux 使用虚拟内存机制来管理内存,内存的使用基于页面。

不同的体系结构有不同的页面大小常用的 32 位处理器使用 4kB 页面大小部分体系结构可以支持多种页面大小内核在 <asm/page.h> 里面定义 PAGE_SIZ

E, PAGE_SHIFT PAGE_SIZE 表示页面大小 PAGE_SHIFT 表示页面号在地址中的偏移量 PAGE_SIZE=2^ PAGE_SHIFT

Page 10: The success's road

远见品质 Linux操作系统移植工具链移植

binutils (assembler, linker..)gcc (compiler, libgcc)glibc/uclibc

内核移植 arch implementationdrivers porting

应用程序移植C program recompile Implement absent library

Page 11: The success's road

远见品质 Linux内核的平台相关代码Linux 内核对多平台有很好的支持内核的对外部接口是统一的,并且与平台无关

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

arch/architecture include/asm-architecture

比如 arm 体系的平台相关代码主要是 arch/arm include/asm-arm

Page 12: The success's road

远见品质 已有代码向 Linux内核移植将已有代码向内核中移植有一些限制内核中没有标准 C 库支持内核中没有象用户程序那样的内存保护内核中不便使用浮点操作内核的堆栈是固定大小的,并且比较有限在内核中需要编程者考虑并发带来的竞争与冒险,以及同步问题

Page 13: The success's road

远见品质 Linux内核移植Linux 内核代码可以分为平台相关部分和平台无关部分

Linux 内核绝大部分代码是平台无关的,可以被各种平台所共享 调度算法 存储器管理 I/O 子系统 网络协议栈

依赖于特定硬件的代码在 Linux 中采用条件编译的方式区分 ARCH = x86 即打开 x86 特有的代码 ARCH = arm 即打开 arm 特有的代码

Page 14: The success's road

远见品质 Linux内核的 arch目录进入 arch 目录,每个体系结构代码都有一个子目录

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

Page 15: The success's road

远见品质 实现 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 macrosDebug output macrosIrq number definationsDMA definationsMemory mapping/translationReset operationIDLE function

Page 16: The success's road

远见品质 mach-smdk2410

在 mach-smdk2410.c 中,我们要定义以下几个内容 smdk2410_iodesc ,描述了所有保留的设备 io 地址。这个描述符是我们移植一个特定目标板非常重要的地方

在这个板描述文件中还要定义.phys_ram.phys_io.io_pg_offst.boot_params.map_io.init_irq.timer

Page 17: The success's road

远见品质 map_io

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

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

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

Page 18: The success's road

远见品质 init_irq

在这个调用里面,关于中断的初始化将会被完成清除中断 pending 寄存器注册主要的中断处理程序设置系统中的设备中断

Page 19: The success's road

远见品质 timer

timer 是一个 sys_timer 类型的结构,它包含以下成员 init 调用执行硬件相关的 timer初始化offset 调用返回自从上次 timer 中断以来经过的微秒数

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

Page 20: The success's road

远见品质 应用程序移植最理想情况下,程序可以不作更改,或仅仅打一些补丁,然后告诉编译环境按照目标环境要求编译即可busyboxbash sysv init

Page 21: The success's road

远见品质 应用程序移植( 2)依赖某些平台特性的应用程序移植起来往往难度更大图形库为速度进行优化的代码,比如编解码器

Page 22: The success's road

远见品质 应用程序移植( 3)软件编程语言的跨平台性直接影响软件的可移植性。此外还有其他因素

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

Page 23: The success's road

远见品质 应用程序移植常见问题依赖软件造成移植性问题

C 库版本问题图形库带来的问题软件依赖某些服务带来问题

网络应用在 little-endian 平台上的处理网络传递数据是 big-endian 的

软件依赖特定平台的特性平台的数据一致性模型差异

Page 24: The success's road

远见品质 让我们一起讨论!

Page 25: The success's road

www.TopSight.com.cn

谢谢!

成功之路