1 / 25

The success's road

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

Download Presentation

The success's road

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. The success's road 嵌入式Linux的移植 www.farsight.com.cn

  2. 今天的内容 • 移植的基本概念 • Linux操作系统在嵌入式平台上的移植方法

  3. 移植的基本概念 • 移植是指将软件从一个平台迁移到另一个平台 • 从一个硬件平台移植到另一个硬件平台 • 从一个操作系统移植到另一个操作系统 • 从一种软件库环境移植到另一个软件库环境 • 软件进行移植的容易程度即可移植性

  4. Linux硬件平台 • 在Linux内核里,每一个处理器指令集对应一个独立的体系结构architecture,比如 • alpha, arm, i386, mips, ppc • 每个体系结构可以有若干变种variant,或不同配置的硬件machine统称sub-architecture。以arm体系结构举例 • variants 包括 arm7tdmi, arm926ejs, strongarm, xscale • machine 包括 edb7312, smdk2410, omap-h2

  5. 硬件平台对C程序的影响 • 处理器字长,定义为处理器一次能处理的数据位数。 • 字长等于处理器内部数据通路的宽度,一般可以通过通用寄存器的宽度来判断 • 处理器字长会影响int, long等C类型的长度 • C代码当中需要使用确定大小的数据类型,可以使用显式长度的类型 • u8, s8, u16, s16, u32, s32, u64, s64

  6. 数据对齐 • 数据对齐是指数据块的地址是某个特定大小的整数倍 • 32位处理器字对齐 n*4 • 页对齐 n*PAGESIZE • Cache line对齐 n*CLINESIZE • 数据访问要求至少是字对齐的,多数情况下编译器会处理数据访问的对齐。不对齐访问的例子 • char a[10]; • unsigned long* pl = (unsigned long *)(a+1); • unsigned l = *pl;

  7. 字节顺序 • 字节顺序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-endian */ • u32 __cpu_to_le32(u32); /* convert cpu's byte order to little-endian */ • u32 __be32_to_cpu(u32); /* convert big-endian to cpu's byte order */ • u32 __le32_to_cpus(u32); /* convert little-endian to cpu's byte order */

  8. 时间 • 软件中的与时间相关的代码也会影响移植 • 采用平台无关的时间表达方法可以提高代码可移植性 • Linux内核里面采用HZ来表示每秒钟有多少个内部时钟滴答,以下对时间的描述是平台无关的 • HZ /* one second */ • (2*HZ) /* two seconds */ • (HZ/2) /* half a second */ • (HZ/100) /* 10 ms */ • (2*HZ/100) /* 20 ms */

  9. 内存页面大小 • Linux使用虚拟内存机制来管理内存,内存的使用基于页面。 • 不同的体系结构有不同的页面大小 • 常用的32位处理器使用4kB页面大小 • 部分体系结构可以支持多种页面大小 • 内核在<asm/page.h>里面定义PAGE_SIZE, PAGE_SHIFT • PAGE_SIZE表示页面大小 • PAGE_SHIFT表示页面号在地址中的偏移量 • PAGE_SIZE=2^ PAGE_SHIFT

  10. Linux操作系统移植 • 工具链移植 • binutils (assembler, linker..) • gcc (compiler, libgcc) • glibc/uclibc • 内核移植 • arch implementation • drivers porting • 应用程序移植 • C program recompile • Implement absent library

  11. Linux内核的平台相关代码 • Linux内核对多平台有很好的支持 • 内核的对外部接口是统一的,并且与平台无关 • 内核的大多数代码也是与平台无关的 • 主要的体系结构相关代码存在于 • arch/architecture • include/asm-architecture • 比如arm体系的平台相关代码主要是 • arch/arm • include/asm-arm

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

  13. Linux内核移植 • Linux内核代码可以分为平台相关部分和平台无关部分 • Linux内核绝大部分代码是平台无关的,可以被各种平台所共享 • 调度算法 • 存储器管理 • I/O子系统 • 网络协议栈 • 依赖于特定硬件的代码在Linux中采用条件编译的方式区分 • ARCH = x86 即打开x86特有的代码 • ARCH = arm 即打开arm特有的代码

  14. Linux内核的arch目录 • 进入arch目录,每个体系结构代码都有一个子目录 • 进入arm目录,在arm体系结构下我们可以看到很多sub-arch的子目录

  15. 实现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

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

  17. map_io • map_io里面需要实现设备io的初始化 • 在这里要用到smdk2410_iodesc描述符。该描述符是一个数组,其中每一项都描述了一个设备的IO映射 • 时钟pll的设置,uart的设置都可以在map_io中调用

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

  19. timer • timer是一个sys_timer类型的结构,它包含以下成员 • init 调用执行硬件相关的timer初始化 • offset 调用返回自从上次timer中断以来经过的微秒数 • resume 调用执行系统唤醒后的timer恢复操作,一般实现上和init里面的初始化一样

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

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

  22. 应用程序移植(3) • 软件编程语言的跨平台性直接影响软件的可移植性。此外还有其他因素 • 软件协议/源代码的开放程度

  23. 应用程序移植常见问题 • 依赖软件造成移植性问题 • C库版本问题 • 图形库带来的问题 • 软件依赖某些服务带来问题 • 网络应用在little-endian平台上的处理 • 网络传递数据是big-endian的 • 软件依赖特定平台的特性 • 平台的数据一致性模型差异

  24. 让我们一起讨论!

  25. 成功之路 www.TopSight.com.cn谢谢!

More Related