惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

Google Online Security Blog
Google Online Security Blog
博客园_首页
酷 壳 – CoolShell
酷 壳 – CoolShell
Jina AI
Jina AI
博客园 - Franky
大猫的无限游戏
大猫的无限游戏
Hugging Face - Blog
Hugging Face - Blog
博客园 - 司徒正美
V
V2EX
雷峰网
雷峰网
云风的 BLOG
云风的 BLOG
V
Visual Studio Blog
F
Full Disclosure
Y
Y Combinator Blog
V
V2EX - 技术
Attack and Defense Labs
Attack and Defense Labs
S
Security @ Cisco Blogs
Schneier on Security
Schneier on Security
Microsoft Azure Blog
Microsoft Azure Blog
SecWiki News
SecWiki News
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
The GitHub Blog
The GitHub Blog
量子位
PCI Perspectives
PCI Perspectives
S
Secure Thoughts
D
Darknet – Hacking Tools, Hacker News & Cyber Security
AWS News Blog
AWS News Blog
Blog — PlanetScale
Blog — PlanetScale
爱范儿
爱范儿
K
Kaspersky official blog
B
Blog
A
Arctic Wolf
Hacker News: Ask HN
Hacker News: Ask HN
L
LangChain Blog
T
Tor Project blog
P
Privacy & Cybersecurity Law Blog
Recent Announcements
Recent Announcements
宝玉的分享
宝玉的分享
The Register - Security
The Register - Security
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
L
Lohrmann on Cybersecurity
D
Docker
A
About on SuperTechFans
H
Hackread – Cybersecurity News, Data Breaches, AI and More
Google DeepMind News
Google DeepMind News
The Last Watchdog
The Last Watchdog
S
Security Affairs
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
P
Privacy International News Feed
Simon Willison's Weblog
Simon Willison's Weblog

博客园 - safeking

移动互联网,我来了 CPU内实现指令的方式 ARP(AddressResolutionProtocol)地址解析协议 满足网络处理应用的LA-1接口标准概述 下一代NSE架构 常用的电平标准总结 DDR技术与HSTL电平(ZZ) vxworks与linux内核比较 不同CPU的区别 vxworks中断服务程序 VxWorks中断处理程序 ISR特性 去掉副作用的最小宏定义方式(linux kernel定义) 关于C语言中函数调用和参数传递机制的探讨(ZZ) ubuntu7.1下nvidia gfore4驱动安装(转,遇到终端空白,请参考本站相关的随笔) nbnutu7.1安装nvidia gf4驱动后,终端空白显示问题解决办法 风河公司用“硬实时”为Linux注入新活力 c的预处理 内联函数与宏 宏使用方法要点
浅谈嵌入式 Linux 的移植(转)
safeking · 2007-03-22 · via 博客园 - safeking

1、移植的基本概念
      移植是指将软件从一个平台迁移到另一个平台,包括以下几个方面:
      -- 从一个硬件平台移植到另一个硬件平台;
      -- 从一个操作系统移植到另一个操作系统;
      -- 从一种软件库环境移植到另一个软件库环境。
2、Linux 硬件平台
       在 Linux 内核里,每一个处理器指令集对应一个独立的体系结构(architecture),比如 alpha、arm、i386、mips、 ppc。每个体系结构可以有若干变种 variant,或不同配置的硬件 machine,统称 sub-architecture。以 ARM 体系结 构举例:
      -- variants 包括 arm7tdmi、arm926ejs、strongarm、xscale;
      -- machine 包括 edb7312、smdk2410、omap-h2。
3、硬件平台对 C 程序的影响
       处理器字长,定义为处理器一次能处理的数据位数。字长等于处理器内部数据通路的宽度,一般可以通过通用寄存器的宽度来判断。处理器字长会影响 int、 long 等 C 类型的长度。C 代码当中需要使用确定大小的数据类型,可以使用显式长度的类型,如:u8、s8、u16、s16、u32、s32、 u64、s64。
4、数据对齐
      数据对齐是指数据块的地址是某个特定大小的整数倍,如:
      -- 32 位处理器字对齐 n*4
      -- 页对齐 n*PAGESIZE
      -- Cache line 对齐 n*CLINESIZE
      数据访问要求至少是字对齐的,多数情况下编译器会处理数据访问的对齐。不对齐访问的例子:
      -- char a[10];
      -- unsigned long* pl = (unsigned long *)(a+1);
      -- unsigned l = *pl;
5、字节顺序
      字节顺序 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 bigendian*/
      -- u32 __cpu_to_le32(u32);/* convert cpu's byte order to littleendian*/
      -- 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 */
6、时间
      软件中与时间相关的代码也会影响移植。采用平台无关的时间表达方法可以提高代码可移植性。Linux 内核里面采用 HZ 来表示每秒钟有多少个内部时钟滴答,以下对时间的描述是平台无关的:
      -- HZ /* one second */
      -- (2*HZ) /* two seconds */
      -- (HZ/2) /* half a second */
      -- (HZ/100) /* 10 ms */
      -- (2*HZ/100) /* 20 ms */
7、内存页面大小
      Linux  使用虚拟内存机制来管理内存,内存的使用基于页面。不同的体系结构有不同的页面大小。常用的32位处理器使用4kB页面大小。部分体系结构也可以支持多种 页面大小。内核在 <asm/page.h> 里面定义 PAGE_SIZE 和 PAGE_SHIFT:
      -- PAGE_SIZE 表示页面大小;
      -- PAGE_SHIFT 表示页面号在地址中的偏移量;
      -- PAGE_SIZE = 2^ PAGE_SHIFT。
8、Linux 操作系统移植
    (1)工具链移植
      -- binutils (assembler, linker..)
      -- gcc (compiler, libgcc)
      -- glibc/uclibc
    (2)内核移植
      -- arch implementation
      -- drivers porting
    (3)应用程序移植
      -- C program recompile
      -- Implement absent library
9、Linux 内核的平台相关代码
      Linux 内核对多平台有很好的支持。内核的对外部接口是统一的,并且与平台无关。内核的大多数代码也是与平台无关的。主要的体系结构相关代码存在于:
      -- arch/architecture
      -- include/asm-architecture
      比如 ARM 体系的平台相关代码主要是:
      -- arch/arm
      -- include/asm-arm
10、已有代码向 Linux 内核移植
      将已有代码向内核中移植有一些限制:
      (1)内核中没有标准 C 库支持;
      (2)内核中没有象用户程序那样的内存保护;
      (3)内核中不便使用浮点操作;
      (4)内核的堆栈是固定大小的,并且比较有限;
      (5)在内核中需要编程者考虑并发带来的竞争与冒险,以及同步问题。
11、Linux 内核移植
      Linux 内核代码可以分为平台相关部分和平台无关部分。Linux 内核绝大部分代码是平台无关的,可以被各种平台所共享,如:
      -- 调度算法
      -- 存储器管理
      -- I/O子系统
      -- 网络协议栈
      依赖于特定硬件的代码在 Linux 中采用条件编译的方式区分:
      -- ARCH = x86 即打开 x86 特有的代码
      -- ARCH = arm 即打开 arm 特有的代码
12、Linux 内核的 arch 目录
      进入 arch 目录,每个体系结构代码都有一个子目录:

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


13、实现 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
14、mach-smdk2410
      在 mach-smdk2410.c 中,我们要定义以下几个内容:
      smdk2410_iodesc,描述了所有保留的设备 IO 地址。这个描述符是我们移植一个特定目标板非常重要的地方。在这个描述文件中还要定义:
      -- phys_ram
      -- phys_io
      -- io_pg_offst
      -- boot_params
      -- map_io
      -- init_irq
      -- timer
15、map_io
      map_io 里面需要实现设备 IO 的初始化。在这里要用到 smdk2410_iodesc 描述符。该描述符是一个数组,其中每一项都描述了一个设备的 IO 映射。另外,时钟 PLL 的设置,UART 的设置都可以在 map_io 中调用。
16、init_irq
      在这个调用里面,关于中断的初始化将会被完成:
      -- 清除中断 pending 寄存器
      -- 注册主要的中断处理程序
      -- 设置系统中的设备中断
17、timer
      timer 是一个 sys_timer 类型的结构,它包含以下成员:
      -- init,调用执行硬件相关的timer初始化;
      -- offset,调用返回自从上次 timer 中断以来经过的微秒数;
      -- resume,调用执行系统唤醒后的timer恢复操作,一般实现上和init里面的初始化一样。
18、应用程序移植
      最理想情况下,程序可以不作更改,或仅仅打一些补丁,然后告诉编译环境按照目标环境要求编译即可。
      -- busybox
      -- bash
      -- sysv init
      依赖某些平台特性的应用程序移植起来往往难度更大。如:
      -- 图形库
      -- 为速度进行优化的代码,比如编解码器
      软件编程语言的跨平台性直接影响软件的可移植性。此外还有其他因素,如软件协议/源代码的开放程度。
19、应用程序移植常见问题
      依赖软件造成移植性问题:
      -- C库版本问题
      -- 图形库带来的问题
      -- 软件依赖某些服务带来问题
      网络应用在 little-endian 平台上的处理,网络传递数据是 big-endian 的。
      软件依赖特定平台的特性。
      平台的数据一致性模型差异。