嵌入式Linux系统移植.ppt_第1页
嵌入式Linux系统移植.ppt_第2页
嵌入式Linux系统移植.ppt_第3页
嵌入式Linux系统移植.ppt_第4页
嵌入式Linux系统移植.ppt_第5页
已阅读5页,还剩53页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

2019/7/20,操作系统实验,1,操作系统,实验五:嵌入式Linux系统移植,2019/7/20,操作系统实验,2,内容预览,移植的基本概念 硬件平台对移植的影响 移植环境搭建 Linux操作系统移植 Linux内核结构 Linux内核向S3C2410移植 配置和编译内核,2019/7/20,操作系统实验,3,移植的基本概念,使某个平台的代码运行在其他平台上的过程就叫做移植。Linux系统通过移植可以运行在ARM,PowerPC,M68K等多种平台上。 软件的移植分三种: 从一个硬件平台移植到另一个硬件平台 从一个操作系统移植到另一个操作系统 从一种软件库环境移植到另一个软件库环境 软件进行移植的容易程度即可移植性,2019/7/20,操作系统实验,4,硬件平台对移植的影响,Linux硬件平台 硬件平台对移植的影响 处理器字长 字节顺序 时间,2019/7/20,操作系统实验,5,Linux硬件平台,在Linux内核里,每一个处理器指令集对应一个独立的体系结构architecture,比如 alpha, arm, i386, mips, ppc 每个体系结构可以有若干变种variant,或不同配置的硬件machine,统称sub-architecture。以arm体系结构举例: variants 包括arm7tdmi, arm926ejs, strongarm,xscale machine 包括edb7312, smdk2410, omap-h2,2019/7/20,操作系统实验,6,处理器字长,处理器字长,定义为处理器一次能处理的数据位数。 字长等于处理器内部数据通路的宽度,一般可以通过通用寄存器的宽度来判断 处理器字长会影响int, long等C类型的长度 C代码当中需要使用确定大小的数据类型,可以使用显式长度的类型: u8, s8, u16, s16, u32, s32, u64, s64,2019/7/20,操作系统实验,7,字节顺序,字节顺序byte order是指一个字中字节排列的顺序 不同硬件可能采用不同byte order x86 little-endian ppc big-endian Linux内核将硬件的byte order放在 里面定义,_BIG_ENDIAN或_LITTLE_ENDIAN 在include/linux/byteorder /里面有几个头文件,定义了 u23 _cpu_to_be32(u32); /* convert cpus byte order to big endian*/ u32 _cpu_to_le32(u32); /* convert cpus byte order to little endian*/ u32 _be32_to_cpu(u32); /* convert big-endian to cpus byte order */ u32 _le32_to_cpus(u32); /* convert little-endian to cpus byte order */,2019/7/20,操作系统实验,8,字节顺序,include/linux/byteorder/bigend.h,2019/7/20,操作系统实验,9,字节顺序,include/linux/byteorder/swab.h,2019/7/20,操作系统实验,10,时间,软件中的与时间相关的代码也会影响移植 采用平台无关的时间表达方法可以提高代码可移植性 Linux内核里面采用HZ来表示每秒钟有多少个内部时钟滴答,以下对时间的描述是平台无关的 HZ /* one second */ (2*HZ) /* two seconds */ (HZ/2) /* half a second */ (HZ/100) /* 10 ms */ (2*HZ/100) /* 20 ms */,2019/7/20,操作系统实验,11,移植环境的搭建,获取内核源码 构建交叉编译环境,2019/7/20,操作系统实验,12,获取内核源码,移植内核之前,获取内核源码自然是第一步 一个常用的FTP地址:/pub/linux/kernel/,2019/7/20,操作系统实验,13,构建交叉编译环境,搭建交叉编译环境是嵌入式开发的第一步,也是很关键的一步。不同的体系结构、不同的操作内容设置是不同的版本的内核,都会用到不同的交叉编译器。选择交叉编译器非常重要,有些交叉编译器经常会有部分的bug,都会导致最后的代码无法正常运行。,Gcc的版本有很多种,其中低于3.3.2版本的只能编译Linux2.4版本的内核,而3.3.2既能支持Linux2.4版本的内核,也能支持Linux2.6版本的内核. 我们采用arm-linux-gcc 3.4.1,2019/7/20,操作系统实验,14,构建交叉编译环境,下载交叉编译工具包 .uk/pub/armlinux/toolchain/ 解压缩文件 export PATH=$PATH:/usr/local/arm/3.4.1/bin 然后,我们可以使用命令“echo $PATH”来查看添加后的情况 要验证添加是否成功,在终端中输入“arm-linux-gcc -v”,查看编译器的版本号,2019/7/20,操作系统实验,15,Linux操作系统移植,概述 Linux内核的平台相关代码 已有代码向Linux内核移植 Linux内核移植,2019/7/20,操作系统实验,16,概述,内核移植 arch implementation drivers porting,2019/7/20,操作系统实验,17,Linux内核的平台相关代码,Linux内核对多平台有很好的支持 内核的对外部接口是统一的,并且与平台无关 内核的大多数代码也是与平台无关的 主要的体系结构相关代码存在于 arch/architecture include/asm-architecture 比如arm体系的平台相关代码主要是 arch/arm include/asm-arm,2019/7/20,操作系统实验,18,已有代码向Linux内核移植,将已有代码向内核中移植有一些限制: 内核中没有标准C库支持 内核中没有象用户程序那样的内存保护 内核中不便使用浮点操作 内核的堆栈是固定大小的,并且比较有限 在内核中需要编程者考虑并发带来的竞争与冒险,以及同步问题,2019/7/20,操作系统实验,19,Linux内核移植,Linux内核代码可以分为平台相关部分和平台无关部分 Linux内核绝大部分代码是平台无关的,可以被各种平台所共享 调度算法 存储器管理 I/O子系统 网络协议栈 依赖于特定硬件的代码在Linux中采用条件编译的方式区分 ARCH = x86 即打开x86特有的代码 ARCH = arm 即打开arm特有的代码,2019/7/20,操作系统实验,20,Linux内核的arch目录,进入arch目录,每个体系结构代码都有一个子目录 进入arm目录,在arm体系结构下我们可以看到很多sub-arch的子目录,2019/7/20,操作系统实验,21,实现sub-arch,在sub-arch子目录下,以mach-s3c2410为例 一个硬件平台支持需要实现以下几个硬件相关的文件 mach-s3c2410.c, irq.c, clock.c, dma.c, gpio.c, pm.c,sleep.c, time.c,2019/7/20,操作系统实验,22,Linux内核结构,linux内核主要由5个子系统组成:进程调度、内存管理、虚拟文件系统、网络接口和进程间通信。 一般在Linux系统中的/usr/src/linux-*.*.*目录下就是内核源代码。 Linux内核非常庞大,包括驱动程序在内有数百兆之多,2019/7/20,操作系统实验,23,Linux内核代码分布图,2019/7/20,操作系统实验,24,Linux文件系统,图:Linux 文件系统组件的体系结构,2019/7/20,操作系统实验,25,arch目录,Linux系统能支持如此多的平台的部分原因是因为内核把源程序代码清晰地划分为体系结构无关部分和体系结构相关部分。 arch目录包含了体系结构相关部分的内核代码,其中每一种都代表一种硬件平台,如对于X86平台就是i386,还有alpha,arm等。移植的重点就是arch目录下的文件。 对于任何平台,都必须包含以下几个子目录: boot:包含启动内核所使用的部分或全部平台特有代码 kernel:存放支持体系结构特有的(如信号处理和SMP)特征的实现 lib:存放高速的体系结构特有的(如strlen和memcpy)通用函数的实现 mm:存放体系结构特有的内存管理程序的实现 math-emu:模拟FPU的代码。对于arm处理器来说,此目录用mach-xxx代替,2019/7/20,操作系统实验,26,其他目录,drivers 系统中所有的设备驱动都位于此目录中。它又进一步划分成几类设备驱动,每一种也有对应的子目录,如声卡的驱动对应于drivers/sound。占整个内核发行版本代码的一半以上,非常庞大。有些驱动程序是和硬件平台无关而有些是相关的。 fs Linux支持的文件系统代码。不同的文件系统有不同的子目录对应,如ext2文件系统对应的就是ext2子目录。一般来说,文件系统与硬件平台无关。 include 这个目录包括了编译核心所需要的大多数头文件。不同的平台需要的头文件会有所不同,对于每种支持的体系结构分别有一个子目录,如asm-arm。 init 此目录包含核心启动代码,有main.c和version.c两个文件,这是研究内核如何工作的好的起点。 ipc 此目录包含了核心的进程间通讯代码。,2019/7/20,操作系统实验,27,其他目录,mm 此目录包含了所有的内存管理代码。与具体硬件体系结构相关的内存管理代码位于arch/*/mm目录下,如对应于X86的就是arch/i386/mm/fault.c 。 modules 此目录包含已建好可动态加载的模块。 kernel 主要核心代码。同时与处理器结构相关代码都放在arch/*/kernel目录下。 net 核心的网络部分代码。里面的每个子目录对应于网络的一个方面。 lib 此目录包含了核心的库代码。与处理器结构相关库代码被放在arch/*/lib/目录下,包含与平台无关的通用函数。 scripts此目录包含用于配置核心的脚本文件,在配置内核时用到。 documentation 此目录是一些文档,非常详细,起参考作用。,2019/7/20,操作系统实验,28,Linux内核向S3C2410移植,S3C2410简介 移植内容: 移植Bootloader 移植Linux内核 移植根文件系统,2019/7/20,操作系统实验,29,S3C2410简介,S3C2410简介 S3C2410X是韩国三星公司推出的16/32位RISC微控制器,其CPU采用的是ARM920T内核,加上丰富的片内外设,为手持设备和其它应用,提供了低价格、低功耗、高性能微控制器的解决方案。 主要特性 系统结构,2019/7/20,操作系统实验,30,主要特性,具有16KB指令Cache、 16KB数据Cache和存储器管理单元MMU。 将外部地址空间8组,每组128MB,总容量达1GB;支持从Nand flash存储器启动。 55个中断源,可以设定1个为快速中断,有24个外部中断,并且触发方式可以设定。 4通道的DMA,并且有外部请求引脚。 3个通道的UART,带有16字节的TX/RX FIFO,支持IrDA1.0功能。,2019/7/20,操作系统实验,31,主要特性,有2个USB主机总线的端口,或1个USB设备总线的端口。 有4个具有PWM功能的16位定时器和1个16位内部定时器。 8通道的10位A/D转换器,最高速率可达500kB/s;提供有触摸屏接口。 具有117个通用I/O口和24通道的外部中断源。 兼容MMC的SD卡接口。 具有电源管理功能,可以使系统以普通方式、慢速方式、空闲方式和掉电方式工作。,2019/7/20,操作系统实验,32,主要特性,看门狗定时器。 有LCD控制器,支持4K色的STN和256K色的TFT,配置有DMA通道。 具有PLL功能的时钟发生器,时钟频率高达203MHz。 双电源系统:1.8/2.0V内核供电,3.3V存储器和I/O供电。 没有内置的网络控制器,如果需要网络功能,一般使用CS8900和DM9000,2019/7/20,操作系统实验,33,2019/7/20,操作系统实验,34,Bootloader,Bootloader的概念 Bootloader的结构和启动过程,2019/7/20,操作系统实验,35,Bootloader,Bootloader的概念 系统上电后,需要一段程序来进行初始化:关闭WATCHDOG、改变系统时钟、初始化存储控制器、将更多的代码复制到内存中等。如果它能够将操作系统内核复制到内存中运行,无论从本地(比如Flash)还是从远端(比如通过网络),就成这段程序为Bootloader. 简单的说,Boot咯啊der就是这么一小段程序,它在系统上电时开始执行,初始化硬件设备、准备好软件环境,最后调用操作系统内核。 在开发时,通畅需要使用各种命令操作Bootloader,一般通过串口来连接和开发板,可以再串口上输入各种命令、观察运行结果等。,2019/7/20,操作系统实验,36,Bootloader,Bootloader的结构 嵌入式Linux系统从软件的角度通常可以分为以下四个层次: 引导加载程序 包括固化在固件的Boot代码(BIOS)和Bootloader Linux内核 文件系统 包括根文件系统。里面包含了Linux系统能够运行所必需的应用程序、库等,比如可以给用户提供操作Linux的控制界面的shell程序、动态链接的程序运行时需要的glibc库等 用户应用程序 特定于用户的应用程序也存储在文件系统中。有时在用户应用程序和内核层之间可能还会包括一个嵌入式图形用户界面。常用的嵌入式GUI有:Qtopia和MiniGUI等,2019/7/20,操作系统实验,37,Bootloader,Bootloader的两个阶段 从固态存储设备上启动的Bootloader大多都是两阶段的启动过程。第一阶段使用汇编来实现,它完成一些依赖于CPU体系结构的初始化,并调用第二阶段的代码;第二阶段则通常使用C语言来实现。 Bootloader第一阶段的功能 硬件设备初始化(关闭WATCHDOG,关中断,设置CPU的速度和时钟频率等) 为加载Bootloader的第二阶段代码准备RAM空间 复制Bootloader的第二阶段代码到RAM空间中 设置好栈 跳转到第二阶段的C入口点 Bootloader第二阶段的功能 初始化本阶段要使用到的硬件设备 检测系统内存映射 将内核映像和根文件系统应用从Flash上读到RAM空间中 为内核设置启动参数 调用内核,2019/7/20,操作系统实验,38,配置和编译内核,1、解压内核 tar xvfj linux-.tar.bz2 C /opt/kernel,2019/7/20,操作系统实验,39,Makefile与Kconfig,Linux的Makefile分析 Linux内核源码中含有很多个Makefile文件,这些Makefile文件又要包含其他一些文件(比如配置信息、通用规则等。)这些文件构成了Linux的Makefile体系,可以分为如下五类:,2019/7/20,操作系统实验,40,Makefile与Kconfig,我们主要来关注Makefile是如何决定编译哪些文件的 Linux内核的编译过程从顶层Makefile文件开始,然后递归地进入各级子目录调用他们的makefile,分为三个步骤: 顶层Makefile决定内核根目录下哪些子目录将被编进内核 Arch/$(ARCH)/Makefile决定arch/$(ARCH)目录下哪些文件、哪些目录将被编译进内核 各级子目录下的Makefile决定所在目录下哪些文件将被编译进内核,哪些文件将被编译成模块(即驱动程序),进入哪些子目录继续调用他们的Makefile。,2019/7/20,操作系统实验,41,Makefile与Kconfig,在顶层Makefile中可以看到如下内容:,2019/7/20,操作系统实验,42,Makefile与Kconfig,对于arch/$(ARCH)/Makefile,以arm为例,在arch/arm/Makefile中可以看到如下内容:,2019/7/20,操作系统实验,43,Makefile与Kconfig,Linux内核中的.config文件默认是隐藏的,可以输入指令“ls -a”看到,2019/7/20,操作系统实验,44,Makefile与Kconfig,.config配置文件中定义了一系列的变量,Makefile将结合他们来决定哪些文件被编译进内核、哪些文件被编译成模块、涉及哪些子目录 顶层makefile和arch/$(ARCH)/makefile决定根目录下哪些子目录、arch/$(ARCH)目录下哪些文件和目录将被编译进内核 最后,各级子目录下的makefile决定所在目录下哪些文件将被编进内核,哪些文件将被编成模块,进入子目录哪些子目录继续调用他们的Makefile,2019/7/20,操作系统实验,45,Makefile与Kconfig,内核源码每个子目录中都有一个Makefile与Kconfig。Makefile的作用已经讲述过了,而Kconfig用户配置内核,它就是各种配置界面的源文件。内核的配置工具读取各个Kconfig文件,生成配置界面供开发人员配置内核,最后生成配置文件.config Arch/arm/mach-s3c2410/Kconfig,2019/7/20,操作系统实验,46,配置和编译内核,3、 在系统中添加对ARM的支持 进入内核源码,修改“Makefile”文件,在189行 “ARCH ?= (SUBARCH)” 和 194行 “CROSS_COMPILE ?= “, 将其修改为”ARCH = arm” 和“CROSS_COMPILE = arm-linux-”, 然后保存,2019/7/20,操作系统实验,47,配置和编译内核,4、 配置内核 一般运行make menuconfig配置内核,内核的配置选项有很多,用户可以使用我们提供的预配置文件s3c2410,也可以自行配置,选择相应的配置时,有三种选择(按空格键进行选择),它们分别代表的含义如下: * 将该功能编译进内核 不将该功能编译进内核 M 将该功能编译成可以在需要时动态插入到内核中的模块,2019/7/20,操作系统实验,48,配置和编译内核,2019/7/20,操作系统实验,49,S3C2410X所用到的内核选项配置,内核配置主菜单: Code maturity level options - 代码成熟等级 Loadable module support - 对模块的支持 System Type - 系统类型 General setup - 普通的属性设置 Parallel port support - 并口支持 Memory Technology Devices (MTD) - MTD设备 Plug and Play configuration - 即插即用配置 Block devices - 块设备 Multi-device support (RAID and LVM) -多设备驱动支持 Networking options - 网络选项 Network device support - 网络设备支持 Amateur Radio support - 业余无线广播 IrDA (infrared) support - 红外支持 ATA/IDE/MFM/RLL support - ATA/IDE设备支持 SCSI support - SCSI 支持,2019/7/20,操作系统实验,50,S3C2410X所用到的内核选项配置,IEEE 1394 (FireWire) support (EXPERIMENTAL) - 1394支持 I2O device support - I2O设备支持 ISDN subsystem - ISDN子系统 Input core support - 输入输出设备 Character devices - 字符设备 Multimedia devices - 多媒体设备 File systems - 文件系统 Console drivers - 控制台 Sound - 声音 Multimedia Capabilities Port drivers - 多媒体兼容设备 USB support - USB设备 Bluetooth support - 蓝牙支持 Kernel hacking - 内核调试 - Load an Alternate Configuration File - 保存当前配置 Save Configuration to an Alternate File - 载入预配置,2019/7/20,操作系统实验,51,S3C2410X所用到的内核选项配置,Code maturity level options - 代码成熟等级配置选: * Prompt for development and/or incomplete code/drivers Prompt for obsolete code/drivers 说明: 如果要试验现在仍处于实验阶段的功能,比如IPv6等,就必须把该项选择为Y了;否则可以把它选择为N。在Linux的世界里,每天都有许多人为它开发支持的driver和加强它的核心。但是有些driver还没进入

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论