250 likes | 397 Views
The success's road. 嵌入式 Linux 的移植. www.farsight.com.cn. 今天的内容. 移植的基本概念 Linux 操作系统在嵌入式平台上的移植方法. 移植的基本概念. 移植是指将软件从一个平台迁移到另一个平台 从一个硬件平台移植到另一个硬件平台 从一个操作系统移植到另一个操作系统 从一种软件库环境移植到另一个软件库环境 软件进行移植的容易程度即可移植性. Linux 硬件平台. 在 Linux 内核里,每一个处理器指令集对应一个独立的体系结构 architecture ,比如
E N D
The success's road 嵌入式Linux的移植 www.farsight.com.cn
今天的内容 • 移植的基本概念 • 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); /* 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 */
时间 • 软件中的与时间相关的代码也会影响移植 • 采用平台无关的时间表达方法可以提高代码可移植性 • Linux内核里面采用HZ来表示每秒钟有多少个内部时钟滴答,以下对时间的描述是平台无关的 • HZ /* one second */ • (2*HZ) /* two seconds */ • (HZ/2) /* half a second */ • (HZ/100) /* 10 ms */ • (2*HZ/100) /* 20 ms */
内存页面大小 • 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 • 在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
应用程序移植(2) • 依赖某些平台特性的应用程序移植起来往往难度更大 • 图形库 • 为速度进行优化的代码,比如编解码器
应用程序移植(3) • 软件编程语言的跨平台性直接影响软件的可移植性。此外还有其他因素 • 软件协议/源代码的开放程度
应用程序移植常见问题 • 依赖软件造成移植性问题 • C库版本问题 • 图形库带来的问题 • 软件依赖某些服务带来问题 • 网络应用在little-endian平台上的处理 • 网络传递数据是big-endian的 • 软件依赖特定平台的特性 • 平台的数据一致性模型差异
成功之路 www.TopSight.com.cn谢谢!