1、硬件平台对C程序的影响:处理器字长,定义为处理器一次能处理的数据位数。字长等于处理器内部数据通路的宽度,一般可以通过通用寄存器的宽度来判断处理器字长会影响int, long等C类型的长度C代码当中需要使用确定大小的数据类型,可以使用显式长度的类型u8, s8, u16, s16, u32, s32, u64, s64数据对齐:数据对齐是指数据块的地址是某个特定大小的整数倍* 32位处理器字对齐n*4* 页对齐n*PAGESIZE* Cache line对齐n*CLINESIZE数据访问要求至少是字对齐的,多数情况下编译器会处理数据访问的对齐。不对齐访问的例子* char a10;* unsig
2、ned long* pl = (unsigned long *)(a+1);* unsigned l = *pl;字节顺序:字节顺序byte order是指一个字中字节排列的顺序不同硬件可能采用不同byte order* x86 little-endian* ppc big-endianLinux内核将硬件的byte order放在 里面定义,_BIG_ENDIAN或_LITTLE_ENDIAN在include/linux/byteorder /里面有几个头文件,定义了* u23 _cpu_to_be32(u32);* u32 _cpu_to_le32(u32);* u32 _be32_to_
3、cpu(u32);* u32 _le32_to_cpus(u32);时间:软件中的与时间相关的代码也会影响移植采用平台无关的时间表达方法可以提高代码可移植性Linux内核里面采用HZ来表示每秒钟有多少个内部时钟滴答,以下对时间的描述是平台无关的* HZ* (2*HZ)* (HZ/2)* (HZ/100)* (2*HZ/100)内存页面大小:Linux使用虚拟内存机制来管理内存,内存的使用基于页面。不同的体系结构有不同的页面大小常用的32位处理器使用4kB页面大小部分体系结构可以支持多种页面大小内核在里面定义PAGE_SIZE,PAGE_SHIFT* PAGE_SIZE表示页面大小* PAGE_
4、SHIFT表示页面号在地址中的偏移量* PAGE_SIZE=2 PAGE_SHIFTLinux操作系统移植:工具链移植* binutils (assembler, linker.)* gcc (compiler, libgcc)* glibc/uclibc内核移植* arch implementation* drivers porting应用程序移植* C program recompile* Implement absent libraryLinux内核的平台相关代码:Linux内核对多平台有很好的支持 内核的对外部接口是统一的,并且与平台无关内核的大多数代码也是与平台无关的主要的体系结构相
5、关代码存在于* arch/architecture* include/asm-architecture比如arm体系的平台相关代码主要是* arch/arm* include/asm-arm已有代码向Linux内核移植:将已有代码向内核中移植有一些限制* 内核中没有标准C库支持* 内核中没有象用户程序那样的内存保护* 内核中不便使用浮点操作* 内核的堆栈是固定大小的,并且比较有限* 在内核中需要编程者考虑并发带来的竞争与冒险,以及同步问题Linux内核移植:Linux内核代码可以分为平台相关部分和平台无关部分Linux内核绝大部分代码是平台无关的,可以被各种平台所共享* 调度算法* 存储器管理
6、* 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
7、* 同时在include/asm-arm/arch-s3c2410要实现Low-level IRQ helper macrosDebug output macrosIrq number definationsDMA definationsMemory mapping/translationReset operationIDLE functionmach-smdk2410.c:在mach-smdk2410.c中,我们要定义以下几个内容smdk2410_iodesc,描述了所有保留的设备io地址。这个描述符是我们移植一个特定目标板非常重要的地方在这个板描述文件中还要定义.phys_ram.phys
8、_io.io_pg_offst.boot_params.map_io.init_irq.timermap_io:map_io里面需要实现设备io的初始化在这里要用到smdk2410_iodesc描述符。该描述符是一个数组,其中每一项都描述了一个设备的IO映射时钟pll的设置、uart的设置都可以在map_io中调用init_irq:在这个调用里面,关于中断的初始化将会被完成* 清除中断pending寄存器* 注册主要的中断处理程序* 设置系统中的设备中断timer:timer是一个sys_timer类型的结构,它包含以下成员-init 调用执行硬件相关的timer初始化-offset 调用返回
9、自从上次timer中断以来经过的微秒数-resume 调用执行系统唤醒后的timer恢复操作,一般实现上和init里面的初始化一样应用程序移植:最理想情况下,程序可以不作更改,或仅仅打一些补丁,然后告诉编译环境按照目标环境要求编译即可* busybox* bash* sysv init依赖某些平台特性的应用程序移植起来往往难度更大* 图形库* 为速度进行优化的代码,比如编解码器软件编程语言的跨平台性直接影响软件的可移植性。此外还有其他因素软件协议/源代码的开放程度应用程序移植常见问题:1依赖软件造成移植性问题* C库版本问题* 图形库带来的问题* 软件依赖某些服务带来问题2网络应用在little-endian平台上的处理* 网络传递数据是big-endian的3软件依赖特定平台的特性4平台的数据一致性模型差异
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1