linux交叉编译环境_第1页
linux交叉编译环境_第2页
linux交叉编译环境_第3页
linux交叉编译环境_第4页
linux交叉编译环境_第5页
已阅读5页,还剩105页未读 继续免费阅读

下载本文档

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

文档简介

嵌入式Linux开发环境的构建主要介绍如何构建嵌入式Linux的开发环境,包括:

1.创建交叉编译工具2.Linux内核的移植

3.根文件系统的制作4.Bootloader的移植1第一页,共一百一十页。商用嵌入式LINUXARMIRIX

Embedded

Linux--derived

form

DebianCoollogic

Coollinux--combines

Linux

and

JavaCoventive

Xlinux--kernel

can

be

as

small

as

142kbEsfia

Redblue

Linux--400k,

designed

for

wireless

apps2第二页,共一百一十页。商用嵌入式LINUXKYZO

Pizza

Box

Linux--Samba

based

file,

print,CD

serverLineo

Embedix--supports

realtime

and

high

availability

appsLynuxWorks

BlueCat--general

purpose

embedded

solutionsMonta

Vista

Linux--

general

purpose

embedded

solutions3第三页,共一百一十页。商用嵌入式LINUXNeoware

NeoLinuxRed

Hat

derived

for

information

appliancesPalmPalm

TynuxInternet

appliance

and

multimediaRed

Hat

Embedded

Linuxgeneral

purpose

embedded

solutionRed

Sonic

Red-Ice

Linuxruns

from

DiskonChip

or

CompactFlash4第四页,共一百一十页。商用嵌入式LINUXRidgeRun

DSP

Linuxfor

multimedia,

wireless,

RT

on

DSPTimeSys

Linux

GPLlow

latency

enhanced

kernelTuxia

TASTEdistro

targets

Internet

appliancesVital

Systems

vLinuxfor

ARM

based

embedded

apps5第五页,共一百一十页。开源嵌入式LinuxEmbedded

Debian

Project--–

convert

Debian

to

an

embedded

OSETLinuxfor

PC104

SBC’suCLinuxfor

microprocessors

that

don’t

have

MMUuLinux

(muLinux)distro

fits

on

a

single

floppy6第六页,共一百一十页。Linux如何做到实时?7第七页,共一百一十页。Linux如何做到实时?8第八页,共一百一十页。Linux支持的CPUIntel

X86MIPSARMStrongARMPowerPCHitachi

SuperH9第九页,共一百一十页。嵌入式系统的开发模式本机开发:在目标机中直接进行操作系统移植及应用程序的开发。在这种方式下进行开发,首先就得在目标机中安装操作系统,并且具有良好的人机开发界面。但是由于一般的嵌入式系统都是资源受限系统,如内、外存储空间小,CPU处理速度不够快等,在这样的环境下进行嵌入式linux的开发必然会影响到系统的成本以及开发速度,所以多数情况下都不采用这种开发方式。10第十页,共一百一十页。嵌入式系统的开发模式交叉开发:在一台主机上进行操作系统的裁剪,以及编写应用程序,在主机上应用交叉编译环境编译内核及应用程序,然后把目标代码下载到目标机上运行。这就需要在主机上安装、配置交叉编译环境(交叉开发工具链),使其能够编译成在目标机上运行的目标代码。11第十一页,共一百一十页。嵌入式系统的开发模式模拟开发:建立在交叉开发环境基础之上。除了主机和目标机以外,还得提供一个在主机上模拟目标机的环境,这就不需要每次的修改都下载到目标机中,待程序正确后再下载到目标机上运行。这样就可以达到在没有目标机的情况下调试软件的目的。比较著名的模拟开发环境有SkyEye,能够模拟如ARM等处理器的开发环境。模拟硬件环境是一件比较复杂的工程,所以多数商业嵌入式系统的开发采用的是交叉开发模式。12第十二页,共一百一十页。开发平台的选择Linux作为开发平台选择Linux作为编译及编译的平台,这需要在Linux平台上安装交叉编译环境,然后直接在Linux平台上直接进行开发,使用Linux的文本编辑器vi或emacs来修改操作系统内核代码,编写应用程序,并使用Linux下的Minicom作为串口控制台,与目标机器进行通信。13第十三页,共一百一十页。开发平台的选择Windows作为开发平台选择Windows作为开发平台,可以使用自己熟悉的文本编辑器来书写源代码,但需要安装cgywin软件用来提供Windows下的Linux开发环境,同时还要安装适用于cygwin的交叉开发环

境,或能够自己编译出cygwin下的交叉开发工具。这种开发环境下,可以使用Windows下的串口控制台软件与目标机器进行

通信。14第十四页,共一百一十页。开发平台的选择Linux服务器,Windows工作站的开发方式–如果习惯了Windows的操作,或在开发的同时还要使用Windows的其他软件,但又只习惯Linux下的交叉开发工具链,还有一种方式:搭建一个Linux服务器,在上边运行telnet和ftp服务,在Windows工作站上用telnet客户端和ftp工具远程登陆到Linux服务器来开发。15第十五页,共一百一十页。1.

创建交叉编译工具由于一般嵌入式开发系统存储大小有限,通常要在pc机上建立一个用于目标机的交叉编译环境。这是一个由编译器、连接器和解释器组成的综合开发环境。交叉编译工具包括:Binutils—用于操作二进制文件的实用程序集合。包括诸如ar、as、objdump、objcopy

这样的实用程序。Gcc—GNU

C

编译器。Glibc—所有用户应用程序都将链接到的C

库。避免使用任何C

库函数的内核和 其它应用程序可以在没有该库的情况下进行编译。16第十六页,共一百一十页。1.创建交叉编译工具(cont.)创建交叉编译工具的一般步骤:1.下载源文件、补丁和建立编译环境

a)下载源文件linux内核源码及相应的补丁binutils-2.10.1gcc-2.95.3glibc-2.2.3glibc-linuxthreads-2.2.3b)建立工作目录,设置环境变量,安装Linux头文件。17第十七页,共一百一十页。1.

创建交叉编译工具(cont.)建立二进制工具(binutils)binutils包中的工具常用来操作二进制目标文件。该包中最重要的两个工具就是GNU汇编器as和链接器ld。创建初始编译器(bootstrap

gcc)创建交叉编译版本的Gcc,需要交叉编译版本的glibc,而交叉编译版本的glibc是通过交叉编译版本的gcc创建的。面对这个先有鸡还是先有蛋的问题,解决的办法是先只编译对C语言的支持,并禁止支持线程。18第十八页,共一百一十页。1.

创建交叉编译工具(cont.)4.第一次创建c库(glibc)这一步编译好的glic还不能用,它只是第二次编译所需要的工具。后面的编译工作都需要连接到这个库上。19第十九页,共一百一十页。1.创建交叉编译工具(cont.)建立全套编译器(full

gcc)有了交叉编译版本的glibc,就可以创建完整版本的Gcc了。第二次创建C库重新编译glibc,并把glibc安装到特定的工作目录中。20第二十页,共一百一十页。嵌入式Linux开发涉及的层次嵌入式Linux开发大致涉及三个层次:引导装载程序Linux内核图形用户界面(或称GUI)21第二十一页,共一百一十页。引导装载程序引导装载程序通常是在任何硬件上执行的第一段代码。在PC系统中,通常将引导装载程序装入主引导记录(Master

B

ot

Record,(MBR))中,或者装入Linux驻留的磁盘的第一个扇区中。通常,在台式机或其它系统上,BIOS

将控制移交给引导装载程序。22第二十二页,共一百一十页。问题在大多数情况下,嵌入式系统没有BIOS支持,如何实现第一次引导呢?23第二十三页,共一百一十页。解决方法一专用软件专用软件可以直接与远程系统上的闪存设备进行交互并将引导装载程序安装在flash的给定位置中。

这个软件使用目标机上的JTAG

端口,它是用于执行外部输入的指令的接口

JFlash-linux

是一种用于直接写闪存的流行工具。它在主机机器上执行并通过JTAG

接口使用并行端口访问目标闪存芯片。24第二十四页,共一百一十页。解决方法二微小的引导代码根据几个字节的指令初始化一些DRAM

,并启用目标上的一个串行(或者USB,或者以太网)端口与主机程序通信。然后,主机程序或装入程序可以使用这个连接将引导装载程序传送到目标上,并将它写入闪存。在安装它并给予其控制后,这个引导装载程序执行Bootloader的功能25第二十五页,共一百一十页。2.Bootloader的移植一、什么是bootloader(引导加载程序)BootLoader就是在操作系统内核或用户应用程序运行之前运行的一段小程序。可以初始化硬件设备、建立内存空间的映射图(有的CPU没有

内存映射功能如S3C44B0),从而将系统的软硬件环境带到一个

合适的状态,以便为最终调用操作系统内核或用户应用程序准备好正确的环境。26第二十六页,共一百一十页。2.Bootloader的移植(cont.)二、Boot

Loader的操作模式多数BootLoader都包含两种不同的操作模式:√

“启动加载(Boot

loading)”模式:也称为“自主”(Autonomous)模式,也即BootLoader从目标机上的某个固态存储设备上将操作系统加载到RAM中运行,整个过程并没有用户的介入。是BootLoader的正常工作模式。在嵌入式产品发布的时候,BootLoader必须工作在这种模式下.√

从最终用户的角度看,BootLoader的作用就是用来加载操作系统,而并不存在所谓的启动加载模式与下载工作模式的区别。27第二十七页,共一百一十页。2.Bootloader的移植(cont.)下载(Down

loading)模式:在这种模式下目标机上的BootLoader

将通过串口连接或网络连接等通信手段从主机下载文件,比如应用程序、数据文件、内核映像等.从主机下载的文件通常首先被BootLoader保存到目标机的RAM中然后再被BootLoader写到目标机上的固态存储设备中。这种模式通常在系统更新时使用。工作于这种模式下的BootLoader通常都会向它的终端用户提供一个简单的命令行接口。28第二十八页,共一百一十页。2.Bootloader的移植(cont.)三、BootLoader的启动过程Boot

Loader的实现依赖于CPU

的体系结构,因此大多数Boot

Loader

的启动都分为stage1

和stage2两大部分。依赖于CPU

体系结构的代码,设备初始化代码等,通常都放在stage1中,而且通常都用汇编语言来实现,以达到短小精悍的目的。stage2则通常用C语言来实现,可以实现给复杂的功能,而且代码会具有更好的可读性和可移植性。29第二十九页,共一百一十页。2.Bootloader的移植(cont.)B

ot

Loader

的stage1

通常包括以下步骤(以执行的先后顺序):硬件设备初始化执行–linux/arch/arm/kernel/head-xxx.S屏蔽所有的中断。为中断提供服务通常是OS

设备驱动程序的责任,因此在

Boot

Loader的执行全过程中可以不必响应任何中断。中断屏蔽可以通过写CPU的中断屏蔽寄存器或状态寄存器(比如ARM

的CPSR

寄存器)来完成。设置CPU

的速度和时钟频率。30第三十页,共一百一十页。2.Bootloader的移植(cont.)RAM初始化。包括正确地设置系统的内存控制器的功能寄存器以及各内存库控制寄存器等。初始化LED。通过GPIO

来驱动LED,表明系统状态是OK

还是

Error。如果板子上没有LED,那么也可以通过初始化UART

向串口打印Boot

Loader的Logo

字符信息来完成这一点。关闭CPU

内部指令/数据cache。31第三十一页,共一百一十页。2.Bootloader的移植(cont.)为加载Boot

Loader

的stage2准备RAM

空间。为了获得更快的执行速度,通常把stage2加载到RAM

空间中来执行,因此必须为加载Boot

Loader的stage2

准备好一段可用的RAM

空间范围。拷贝Boot

Loader的stage2

到RAM

空间中。拷贝时要确定两点:stage2的可执行映象在固态存储设备的存放起始地址和终止地址;RAM

空间的起始地址。32第三十二页,共一百一十页。2.Bootloader的移植(cont.)设置好堆栈。堆栈指针的设置是为了执行C语言代码作好准备。跳转到stage2

的C

入口点。在上述一切都就绪后,就可以跳转到Boot

Loader的stage2

去执行了。比如,在ARM

系统中,这可以通过修改PC

寄存器为合适的地址来实现。33第三十三页,共一百一十页。2.Bootloader的移植(cont.)stage2

的代码通常用C

语言来实现。但是与普通C语言应用程序不同的是,在编译和链接boot

loader

这样的程序时,不能使用glibc库中的任何支持函数。具体步骤(以执行的先后顺序):·

初始化本阶段要使用到的硬件设备。通常包括:(1)初始化至少一个串口,以便和终端用户进行I/O

输出信息;(2)初始化计时器等。设备初始化完成后,可以输出一些打印信息,程序名字字符串、版本号等。34第三十四页,共一百一十页。2.Bootloader的移植(cont.)检测系统内存映射(memory

map)。指在整个4GB物理地址空间中有哪些地址范围被分配用来寻址系统的RAM

单元。比如,在SA-1100

CPU

中,从0xC000,0000

开始的512M

地址空间被用作系统的RAM

地址空间,而在SamsungS3C44B0X

CPU中,从0x0c00,0000

到0x1000,0000

之间的64M

地址空间被用作系统的RAM

地址空间。35第三十五页,共一百一十页。2.Bootloader的移植(cont.)将kernel

映像和根文件系统映像从flash

上读到RAM空间中。规划内存占用的布局包括两个方面:内核映像所占用的内存范围根文件系统所占用的内存范围。在规划内存占用的布局时,主要考虑基地址和映像的大小。从Flash

上拷贝数据36第三十六页,共一百一十页。2.Bootloader的移植(cont.)为内核设置启动参数。在将内核映像和根文件系统映像拷贝到RAM空间中后,就可以准备启动Linux

内核了。但是在调用内核之前,应该作一步准备工作,即:设置Linux

内核的启动参数。调用内核。37第三十七页,共一百一十页。2.Bootloader的移植(cont.)系统初始化linux/init/main.c

---

start_kernel(…)setup_arch(…);//platform

specific

init,

board

param,

memoryrange,etcpaging_init(…);trap_init();init_IRQ();38第三十八页,共一百一十页。2.Bootloader的移植(cont.)sched_init();time_init();parse_options(command_line);console_initkmalloc_initinode_initmem_initbuffer_init();sock_init();kernel

thread

---

init()39第三十九页,共一百一十页。2.Bootloader的移植(cont.)设备驱动初始化挂载root文件系统ROMFS(Or

otheras

root)Open

tty

from

root运行初始化进程40第四十页,共一百一十页。/etc/rchostname

Atmel/bin/expand

/etc/ramfs.img

/dev/ram0mount

-t

proc

proc

/procmount

-t

ext2

/dev/ram0

/varmkdir

/var/tmpmkdir

/var/logmkdir

/var/runmkdir

/var/lockcat

/etc/motdifconfig

lo

route

add

-net

netmask

lodhcpcd41第四十一页,共一百一十页。2.Bootloader的移植(cont.)四、u-boot(1)简介U-Boot,全称Universal

Boot

Loader,是开放源码项目。从FADSROM、8xxROM、PPCBOOT逐步发展演化而来。其源码目录、编译形式与

Linux内核很相似,不少U-Boot源码就是相应的Linux内核源程序的简化,尤其是一些设备的驱动程序,这从U-Boot源码的注释中能体现这一点。42第四十二页,共一百一十页。2.Bootloader的移植(cont.)U-Boot不仅仅支持嵌入式Linux系统的引导,当前,它还支持NetBSD,VxWorks,QNX,RTEMS,ARTOS,LynxOS嵌入式操作系统。其目前要支持的目标操作系统是OpenBSD,NetBSD,FreeBSD,4.4BSD,Linux,SVR4,Esix,Solaris,Irix,SCO,Dell,NCR,VxWorks,LynxOS,pSOS,QNX,RTEMS,ARTOS。这是U-Boot中Universal的一层含义。43第四十三页,共一百一十页。2.Bootloader的移植(cont.)

另外一层含义则是U-Boot除了支持PowerPC系列的处理器外,还能支持MIPS、x86、ARM、NIOS、XScale等诸多常

用系列的处理器。

这两个特点正是U-Boot项目的开发目标,即支持尽可能多的嵌入式处理器和嵌入式操作系统。就目前来看,U-Boot对PowerPC系列处理器支持最为丰富,对Linux的支持最完善。44第四十四页,共一百一十页。2.Bootloader的移植(cont.)(2)u-boot的特点①开放源码;②支持多种嵌入式操作系统内核,如Linux、NetBSD,VxWorks,QNX,RTEMS,ARTOS,LynxOS;③支持多个处理器系列,如PowerPC、ARM、x86、MIPS、XScale;45第四十五页,共一百一十页。2.Bootloader的移植(cont.)④较高的可靠性和稳定性;⑤高度灵活的功能设置,适合U-Boot调试、操作系统不同引导要求、产品发布等;⑥丰富的设备驱动源码,如串口、以太网、SDRAM、FLASH、LCD、NVRAM、EEPROM、RTC、键盘等;⑦较为丰富的开发调试文档与强大的网络技术支持;46第四十六页,共一百一十页。2.Bootloader的移植(cont.)(3)U-Boot主要目录结构board

目标板相关文件,主要包含SDRAM、FLASH驱动;common

独立于处理器体系结构的通用代码,如内存大小探测与故障检测;cpu

与处理器相关的文件。如mpc8xx子目录下含串口、网口、LCD驱动及中断初始化等文件;driver

通用设备驱动,如CFI

FLASH驱动(目前对INTEL

FLASH支持较好)47第四十七页,共一百一十页。2.Bootloader的移植(cont.)doc

U-Boot的说明文档;include

U-Boot头文件;尤其configs子目录下与目标板相关的配置头文件是移植过程中经常要修改的文件;lib_xxx

处理器体系相关的文件,如lib_ppc,lib_arm目录分别包含与PowerPC、ARM体系结构相关的文件;net

与网络功能相关的文件目录,如bootp,nfs,tftp;post

上电自检文件目录。尚有待于进一步完善;rtc

RTC驱动程序;tools

用于创建U-Boot

S-RECORD和BIN镜像文件的工具;48第四十八页,共一百一十页。2.Bootloader的移植(cont.)(4)U-Boot可支持的主要功能

系统引导:支持NFS挂载、RAMDISK(压缩或非压缩)形式的根文件系统;支持NFS挂载、从FLASH中引导压缩或非压缩系统内核;

基本辅助功能:强大的操作系统接口功能;可灵活设置、传递多个关键参数给操作系统,适合系统在不同开发阶段的调试要求与产品发布,尤对Linux支持最为强劲;支持目标板环境参数多种存储方式,如FLASH、NVRAM、EEPROM;CRC32校验,49第四十九页,共一百一十页。2.Bootloader的移植(cont.)可校验FLASH中内核、RAMDISK镜像文件是否完好;

设备驱动:串口、SDRAM、FLASH、以太网、LCD、NVRAM、EEPROM、键盘、USB、PCMCIA、PCI、RTC等驱动支持;

上电自检功能SDRAM、FLASH大小自动检测;SDRAM故障检测;CPU型号;特殊功能:XIP内核引导;50第五十页,共一百一十页。2.Bootloader的移植(cont.)(5)u-boot移植的主要步骤以S3C2410处理器为例,说明u-boot的主要移植步骤:1.修改Makefile文件bks2410_config

:

unconfig@./mkconfig

$(@:_config=)

arm

arm920t

bks2410

NULLs3c24x051第五十一页,共一百一十页。2.Bootloader的移植(cont.)各参数含义:arm:CPU的架构(ARCH)arm920t:CPU的类型(CPU),其对应于cpu/arm920t子目录。bks2410:开发板的型号(BOARD),对应于board/bks2410目录。NULL:开发者/或经销商(vender)。s3c24x0:片上系统(SOC)。52第五十二页,共一百一十页。2.Bootloader的移植(cont.)建立board/bks2410目录,拷贝board/smdk2410下的文件到board/bks2410目录,将smdk2410.c更名为bks2410.ccp

include/configs/smdk2410.h

include/configs/bks2410.h将arm-linux-gcc的目录加入到PATH环境变量中测试编译能否成功:

make

bks2410_config make

all

ARCH=arm生成u-boot.bin就OK了53第五十三页,共一百一十页。2.Bootloader的移植(cont.)依照自己开发板的内存地址分配情况修改board/bks2410/memsetup.S文件在board/bks2410加入NAND

Flash读函数,建立nand_read.c。修改board/bks2410/Makefile修改cpu/arm920t/start.S文件修改include/configs/bks2410.h文件重新编译u-bootmake

all

ARCH=arm通过jtag将u-boot烧写到flash54第五十四页,共一百一十页。2.Bootloader的移植(cont.)五、vivi简介vivi是韩国mizi公司开发的bootloader,适用于ARM9处理器。如果目标平台使用的是ARM9处理器,那么选用vivi来做bootloader是个不错的选择。55第五十五页,共一百一十页。56第五十六页,共一百一十页。3.Linux的内核格式linux的内核有多种格式,vmlinux、老式的zImage和新型的bzImage。vmlinux和zImage

之间的主要区别:vmlinux

是实际的(未压缩的)可执行文件,而zImage是或多或少包含相同信息的自解压压缩文件—只是压缩它以处理(通常是Intel强制的)640

KB

引导时间的限制。57第五十七页,共一百一十页。3.Linux的内核格式zImage和新型的bzImage之间最大的差别是对于内核体积大小的限制。由于zImage内核需要放在实模式1MB的内存之内,所以其体积受到了限制。目前采用的内核格式大多为bzImage,这种格式没有1MB内存限制。58第五十八页,共一百一十页。3.Linux内核的移植使某个平台的代码运行在其他平台上的过程就叫做移植。Linux系统通过移植可以运行在ARM,PowerPC,M68K等多种平台上。Linux内核结构linux内核主要由5个子系统组成:进程调度、内存管理、虚拟文件系统、网络接口和进程间通信。一般在Linux系统中的/usr/src/linux-*.*.*目录下就是内核源代码。59第五十九页,共一百一十页。3.Linux内核的移植(cont.)Linux内核源代码的分布如下:

arch

这个子目录包含了此核心源代码所支持的硬件体系结构相关的核心代码。如对于X86平台就是i386。

include

这个目录包括了核心的大多数include文件。另外对于每种支持的体系结构分别有一个子目录。init

此目录包含核心启动代码。

mm

此目录包含了所有的内存管理代码。与具体硬件体系结构相关的内存管理代码位于arch/*/mm目录下,如对应于X86的就是

arch/i386/mm/fault.c

。60第六十页,共一百一十页。3.Linux内核的移植(cont.)

drivers

系统中所有的设备驱动都位于此目录中。它又进一步划分成几类设备驱动,每一种也有对应的子目录,如声卡的驱动对应于drivers/sound。ipc

此目录包含了核心的进程间通讯代码。modules

此目录包含已建好可动态加载的模块。

fs

Linux支持的文件系统代码。不同的文件系统有不同的子目录对应,如ext2文件系统对应的就是ext2子目录。

kernel

主要核心代码。同时与处理器结构相关代码都放在

arch/*/kernel目录下。61第六十一页,共一百一十页。3.Linux内核的移植(cont.)

net

核心的网络部分代码。里面的每个子目录对应于网络的一个方面。

lib

此目录包含了核心的库代码。与处理器结构相关库代码被放在arch/*/lib/目录下。scripts此目录包含用于配置核心的脚本文件。Documentation

此目录是一些文档,起参考作用。62第六十二页,共一百一十页。3.Linux内核的移植(cont.)Linux内核的移植移植所要做的工作就是根据硬件的配置,修改

Linux内核目录中的Makefile文件、配置文件及某些源代码。63第六十三页,共一百一十页。3.Linux内核的移植(cont.)编译内核1、安装内核如果内核已经安装(/usr/src/目录有linux子目录),跳过;如果没有安装,在光驱中放入linux安装光盘,找到kernel-source-2.xx.xx.rpm文件(xx代表数字,表示内核的版本号),比如RedHatlinux的RPMS目录是/RedHat/RPMS/目录,然后使用命令rpm

-ivh

kernel-source2.xx.xx.rpm安装内核64第六十四页,共一百一十页。3.Linux内核的移植(cont.)2、清除从前编译内核时残留的.o

文件和不必要的关联

cd

/usr/src/linuxmake

mrproper删除所有因构造内核过程中产生的所有文件,除了Make

clean所删除的文件之外,还要删除.config,.depend等文件,把核心源码恢复到最原始的状态。65第六十五页,共一百一十页。3.Linux内核的移植(cont.)3、配置内核,修改相关参数在图形界面下,make

xconfig;字符界面下,make

menuconfig调用./scripts/Configure按照arch/i386/config.in来进行配置。命令执行完后产生文件.config,其中保存着配置信息。下一次再做make

config将产生新的.config文件,原.config被改名为.config.old在内核配置菜单中正确设置个内核选项,保存退出66第六十六页,共一百一十页。3.Linux内核的移植(cont.)4、正确设置关联文件make

dep寻找依存惯性,产生两个文件.depend和.hdepend,其中.hdepend表示每个.h文件都包含其他哪些嵌入文件,而.depend文件有多个,在每个会产生目标文件(.o)文件的目录下均有,它表示每个目录文件都依赖哪些嵌入文件(.h)5、编译内核对于大内核(比如需要SCSI支持),make

bzImage对于小内核,make

zImage根据可用的系统资源和引导装载程序的功能,内核可以编译成vmlinux、Image

或zImage。67第六十七页,共一百一十页。3.Linux内核的移植(cont.)6、编译模块make

modules7、安装模块make

modules_install68第六十八页,共一百一十页。内核链接和装入为目标系统编译了内核后,通过使用引导装载程序(bootloader),内核就被装入到目标系统的内存(在DRAM中或者在闪存中)。通过使用串行、USB

或以太网端口,引导装载程序与主机通信以将内核传送到目标的闪存或DRAM中。在将内核完全装入目标后,引导装载程序将控制传递给装入内核的地址。69第六十九页,共一百一十页。内核链接和装入内核可执行文件由许多链接在一起的对象文件组成。对象文件有许多节,如文本、数据、init数据、bass等等。对象文件都是由一个称为链接器脚本的文件链接并装入的。链接器脚本的功能是将输入对象文件的各节映射到输出文件中;即将所有输入对象文件都链接到单一的可执行文件中,将该可执行文件的各节装入到指定地址处。vmlinux.lds

是存在于arch/<target>/目录中的内核链接器脚本,负责链接内核的各个节并将它们装入内存中特定偏移量处。70第七十页,共一百一十页。典型的vmlinux.lds文件OUTPUT_ARCH(<arch>)

/*

<arch>

includes

architecture

type

*/ENTRY(stext)

/*

stext

is

the

kernel

entry

point

*/SECTIONS

/*

SECTIONS

command

describes

the

layoutof

the

output

file

*/{.

=

TEXTADDR;

/*

TEXTADDR

is

LMA

for

the

kernel

*/.init

:

{

/*

Init

code

and

data*/_stext

=

.;

/*

First

section

is

stext

followedby

init

data

section

*/

init_begin

=

.;*(.text.init)

init_end

=

.;}.text

:

{

/*

Real

text

segment

follows

init_data

section

*/_text

=

.;*(.text)_etext

=

.;

/*

End

of

text

section*/}71第七十一页,共一百一十页。4.根文件系统的制作嵌入式系统需要一种以结构化格式存储和检索信息的方法;这就需要文件系统的参与。Ramdisk是通过将计算机的RAM用作设备来创建和挂装文件系统的一种机制,它通常用于无盘系统(当然包括微型嵌入式设备,它只包含作为永久存储媒质的闪存芯片)。72第七十二页,共一百一十页。RamDisk简介将RAM模拟当做硬盘来使用的一种技术。相对于传统的硬盘文件访问来说,这种技术可以极大的提高在其上进行的文件访问的速度。但是RAM的易失性也意味着当关闭电源后的数据将会丢失。Ramdisk的速度特别快,大概是现在最快的7200转硬盘速度的30倍。VSuite

Ramdisk——推荐,免费版。RamDisk

Plus——需要序列号。73第七十三页,共一百一十页。创建基于Ext2fs的Ramdiskmke2fs

-vm0

/dev/ram

4096mount

-t

ext2

/dev/ram

/mntcd

/mntcp

/bin,

/sbin,

/etc,

/dev

...

files

in

mntcd

../umount

/mntdd

if=/dev/ram

bs=1k

count=4096of=ext2ramdisk74第七十四页,共一百一十页。ramfs一种基于ram的文件系统,开发ramfs的目的是因为ramdisk浪费了太多的内存cache页,ramfs是基于tmpfs的一个实例。75第七十五页,共一百一十页。Initrd与initramfsinitrd是init

ramdisk的缩写,initramfs是init

ramfs的缩写。init前缀代表它们具有了引导内核启动的功能。ramfs比ramdisk更加高效,自然initramfs也更加优秀,是2.6内核新加入的推荐使用的机制,虽然可能pc中grub使用的内核cmd

line参数是kernel

/vmlinuz-2.6.25-14.fc9.i686

ro

root=UUID=11d7ac51-2b45-489e-8a48-8d2a28e2c04e

rhgb

quietinitrd

/initrd-2.6.25-14.fc9.i686.img实际上使用的是initramfs,文件格式不同,initrd是gziped的,initramfs是cpio的76第七十六页,共一百一十页。initrdinitrd的作用:精简的根文件系统,包含必备的目录和程序。内核镜像不应该静态包含进太多驱动模块。但是

Linux内核启动最后一步,创建init内核线程,需要执行的init程序或者脚本在根文件系统中。根文件系统可能在硬盘、磁盘阵列、nfs、flash上。此时,可使用initrd作为一个过渡。77第七十七页,共一百一十页。initrdinitrd,或者initramfs,无论在pc还是嵌入式,都是可以选择的,分3种情况完全不要initrdinitrd作为最终的根文件系统initrd作为过渡,由initrd的init来加载最终的根文件系统78第七十八页,共一百一十页。情况1,比如嵌入式linux静态包含了nand

flash驱动和jffs2驱动,指定内核启动参数root=/dev/mtdblock2

rootfs=jffs2

rw

console=ttySAC0,115200

init=/linuxrc(使用busybox作为根文件系统)情况2,将根文件系统做成ramdisk镜像,使用ubbot下载到0x30800000,内核启动参数root=/dev/ram

rw

init=/linuxrc

initrd=0x30800000,8M

console=ttySAC0,115200注意,一旦使用了ramdisk作为内核命令行参数root的参数,root=/dev/ram那么就直接把initrd当做最终的根文件系统情况3,pc常见,嵌入式linux也可见这样的启动参数console=ttySAC0,115200

root=nfs

nfsroot=:/source/rootfsinitrd=0x10800000,0x14af4779第七十九页,共一百一十页。4.根文件系统的制作一、根文件系统的基本结构和内容Linux系统的根文件的基本结构如图1所示,其中每个目录中都包含特定内容:1./bin目录/bin目录包含了引导启动所需的命令或普通用户可能用的命令(可能在引导启动后)。这些命令都是二进制文件的可执行程序。80第八十页,共一百一十页。4.根文件系统的制作(cont.)2./sbin目录/sbin目录类似/bin,也用于存储二进制文件。因为其中的大部分文件多是系统管理员使用的基本的系统程序,所以虽然普通用户必要且允许时可以使用,但一般不给普通用户使用。81第八十一页,共一百一十页。4.根文件系统的制作(cont.)/etc目录/etc目录存放着各种系统配置文件,其中包括了用户信息文件/etc/passwd,系统初始化文件/etc/rc等。Linux正是靠这些文件才得以正常地运行。/root目录/r

ot目录是超级用户的目录。82第八十二页,共一百一十页。4.根文件系统的制作(cont.)5./lib目录/根文件系统上的程序所需的共享库,存放根文件系统程序运行所需的共享文件。/lib/modules

目录包含系统核心可加载各种模块,尤其是那些在恢复损坏的系统时重新引导系统所需

的模块(例如网络和文件系统驱动)。83第八十三页,共一百一十页。4.根文件系统的制作(cont.)/dev目录/dev目录存放了设备驱动程序,用户通过这些文件访问外部设备。比如,用户可以通过访问/dev/mouse来访问鼠标的输入。/tmp目录/tmp

目录存放程序在运行时产生的信息和数据。/boot目录/boot目录存放引导加载器(bootloader)使用的文件,如LILO、grub,核心映像也经常放在这里,而不是放在根目录中。84第八十四页,共一百一十页。4.根文件系统的制作(cont.)/mnt目录系统管理员临时安装(mount)文件系统的安装点。程序并不自动支持安装到/mnt

。/mnt

下面可以分为许多子目录,例如/mnt/dosa

可能是使用MSDOS文件系统的软驱,而/mnt/exta可能是使用ext2文件系统的软驱,/mnt/cdrom

光驱等等。/proc,/usr,/var,/home目录其他文件系统的安装点。85第八十五页,共一百一十页。4.根文件系统的制作(cont.)二、嵌入式Linux系统的根文件系统的制作第一步:确定根文件系统的目录结构在嵌入式Linux系统中,必须有的目录包括:/bin,/dev,/etc/,/lib,/proc,/sbin,和/usr,其他目录都是可选的。86第八十六页,共一百一十页。4.根文件系统的制作(cont.)第二步:在根文件系统中各个目录的添加必要的内容,包括:1、链接库glibc2、内核映象,内核配置文件等;3、内核模块;4、设备文件87第八十七页,共一百一十页。4.根文件系统的制作(cont.)只需要一些必备的条目及符号链接就可以满足系统的运行。基本的/dev条目包括:文件名

说明

类型主编号次编号权限位mem

物理内存存取字符

11600null

黑洞设备字符13666zero

以null

byte字符15666为数据来源random随机数产生器字符

1864488第八十八页,共一百一十页。4.根文件系统的制作(cont.)tty0字符

4

0

600现行的虚拟控制台字符

4

1

6004

64

600tty1

第一个虚拟控制台ttyS0

第一个UART

字符串行端口tty

现行的控制台字符

console

系统控制台字符5

0

6665

1

60089第八十九页,共一百一十页。4.根文件系统的制作(cont.)创建/dev中的条目:(使用mknod命令)#mknod

–m

600

mem

c

1

1#

mknod

–m

666

null c

1

3…………创建符号链接:(使用ln–s

命令)链接名称fdstdinstdoutstderr链接对象/proc/self/fdfd/0fd/1fd/290第九十页,共一百一十页。4.根文件系统的制作(cont.)5、主要的系统应用程序标准的Linux工作站和服务器发行套件中都配备了数以千计的二进制命令文件,并且不同的发行套件提供的命令集还各不相同。嵌入式Linux系统中不需要这么多的二进制文件。一般有两种方法来定制嵌入式Linux系统中的二进制命令文件:1、挑选若干标准命令;2、尽可能把命令集浓缩成仅仅实现必要功能的极少数应用程序(如BusyBox)。91第九十一页,共一百一十页。4.根文件系统的制作(cont.)BusyBox简介BusyBox包含了一些简单的工具,例如cat

和echo,还包含了一些更大、更复杂的工具,例如grep、find、mount以及telnet(不过它的选项比传统的版本要少);BusyBox

称为Linux工具里的瑞士军刀。92第九十二页,共一百一十页。4.根文件系统的制作(cont.)93第九十三页,共一百一十页。4.根文件系统的制作(cont.)6、init程序内核初始化的最后一个动作是启动init程序。init程序启动后会根据

inittab文件的内容启动指定的系统服务。大多数Linux使用的init跟System

V

的init类似,嵌入式Linux系统可用BusyBox来提供init的功能。用户需要定制目标平台的

inittab、rc.sysinit、rc等文件。94第九十四页,共一百一十页。4.根文件系统的制作(cont.)三、制作根文件系统的镜像根文件系统的目录结构和内容都准备好了之后,需要把它制成一个镜像文件,以便于将其下载到开发板上。嵌入式系统常用的文件系统介绍:(1)CRamfscramfs是一个压缩式的只读文件系统,不需要一次性地将文件系统中的

所有内容都解压缩到内存之中,而只是在系统需要访问某个位置的数据的时侯,马上计算出该数据在cramfs中的位置,将其实时地解压缩到内存之中,然后通过对内存的访问来获取文件系统中需要读取的数据。95第九十五页,共一百一十页。4.根文件系统的制作(cont.)cramfs中的解压缩以及解压缩之后的内存中数据存放位置都是由

cramfs文件系统本身进行维护的,用户并不需要了解具体的实现过程,因此这种方式增强了透明度,对开发人员来说,既方便,又节省了存储空间。96第九十六页,共一百一十页。4.根文件系统的制作(cont.)cramfs特性:采用实时解压缩方式,但解压缩的时侯有延迟。

cramfs的数据都是经过处理、打包的,对其进先写操作有一定困难。所以cramfs不支持写操作,这个特性刚好适合嵌入式应用中使用Flash存储文件系统的场合。97第九十七页,共一百一十页。4.根文件系统的制作(cont.)cramfs中文件最大不能超过16MB。

支持组标识(gid),但是mkcramfs只将gid的低8位保存下来,因此只有这8位是有效的。

支持硬链接。但是cramfs并没有完全处理好,硬链接的文件属性中,链接数仍然为1.

cramfs的目录中,没有“.”和“..”这两项。因此,

cramfs中的目录的链接数通常也仅有一个。98第九十八页,共一百一十页。4.根文

温馨提示

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

评论

0/150

提交评论