预览加载中,请您耐心等待几秒...
1/10
2/10
3/10
4/10
5/10
6/10
7/10
8/10
9/10
10/10

亲,该文档总共16页,到这已经超出免费预览范围,如果喜欢就直接下载吧~

如果您无法下载资料,请参考说明:

1、部分资料下载需要金币,请确保您的账户上有足够的金币

2、已购买过的文档,再次下载不重复扣费

3、资料包下载后请先用软件解压,在使用对应软件打开

嵌入式linux开发教程之移植的理论移植是指将软件从一个平台迁移到另一个平台 *从一个硬件平台移植到另一个硬件平台 *从一个操作系统移植到另一个操作系统 *从一种软件库环境移植到另一个软件库环境 软件进行移植的容易程度即可移植性在Linux内核里,每一个处理器指令集对应一个独立的体系结构architecture,比如alpha,arm,i386,mips,ppc 每个体系结构可以有若干变种variant,或不同配置的硬件machine 统称sub-architecture。以arm体系结构举例 *variants包括arm7tdmi,arm926ejs,strongarm,xscale *machine包括edb7312,smdk2410,omap-h2处理器字长,定义为处理器一次能处理的数据位数。 字长等于处理器内部数据通路的宽度,一般可以通过通用寄存器的宽度来判断 处理器字长会影响int,long等C类型的长度 C代码当中需要使用确定大小的数据类型,可以使用显式长度的类型u8,s8,u16,s16,u32,s32,u64,s64数据对齐是指数据块的地址是某个特定大小的整数倍 *32位处理器字对齐n*4 *页对齐n*PAGESIZE *Cacheline对齐n*CLINESIZE 数据访问要求至少是字对齐的,多数情况下编译器会处理数据访问的对齐。不对齐访问的例子 *chara[10]; *unsignedlong*pl=(unsignedlong*)(a+1); *unsignedl=*pl;字节顺序byteorder是指一个字中字节排列的顺序 不同硬件可能采用不同byteorder *x86little-endian *ppcbig-endian Linux内核将硬件的byteorder放在<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工具链移植 *binutils(assembler,linker..) *gcc(compiler,libgcc) *glibc/uclibc 内核移植 *archimplementation *driversporting 应用程序移植 *Cprogramrecompile *Implementabsentlibrary 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特有的代码进入arch目录,每个体系结构代码都有一个子目录 进入arm目录,在arm体系结构下我们可以看到很多sub-arch的子目录 实现sub-arch: 在sub-arch子目录下,以mach-s3c2410为例一个硬