armlinux系统开发流程1、开发目标硬件系统2、建立交叉编译工具3、开发bootloader4、移植linux内核5、开发一个文件系统6、开发相关硬件的驱动程序7、开发上层应用程序8、烧写bootloader、内核、文件系统等。嵌入式交叉编译环境简介交叉编译就是在一个平台上生成另一个平台上的可执行代码。这里说的平台分别指的是主机平台Host和目标平台Target。就我们在ARM平台上移植Linux来说,Host是一台一般的PC机,它通过串口或网络接口与Target通信;Target是arm-linux平台(这里说的arm指的是平台所使用的CPU是ARM9处理器,linux指的是运行的操作系统是Linux)。我们在Host上开发程序,并在这个平台上运行交叉编译器CrossComplier,编译我们的程序,而由CrossComplier生成的程序将在Target上运行需要交叉编译的原因:首先,在项目的起始阶段,目标平台尚未建立,因此需要做交叉编译,以生成我们所需要的Bootloader以及kernel(因为Bootloader和kernel的源码需要经过交叉编译后才可以在目标平台上运行);其次,当目标平台能启动之后,由于目标平台上资源的限制,当我们编译大型程序时,依然可能需要用到交叉编译。如何建立交叉编译工具链构建交叉工具链通常有以下3种方法:1.分步骤手工编译分步编译和安装交叉编译工具链所需要的库和源代码,最终生成交叉编译工具链。2.通过脚本编译通过crosstool脚本工具来实现一次编译生成交叉编译工具链3.直接获取交叉编译工具链直接通过网上下载已经制作好的交叉编译工具链。ftp:arm.kernel.org.ukftp:kernel.orgftp:gnu.orgLinux内核代码linux-2.6.10.tar.gzglibc库glibc-2.3.2.tar.gz工具程序binutils-2.15.tar.bz2内核线程包glibc-linuxthreads-2.3.2.tar.gz编译器gcc-3.3.6.tar.gz配置开发板PXA270嵌入式系统的宿主机交叉编译环境arm-linux.tar.gz提供ARM系统开发的交叉编译器/usr/local/arm-linux/binvi/etc/profilepathmunge/usr/local/arm-linux/bincparm-linux.tar.gz/usr/localcd/usr/localtar-xzfarm-linux.tar.gz目标机与主机的通讯方式1、minicomminicom很像Windows下面的超级终端,我們利用minicom作为目标板的终端显示视窗;通过串口控制目标板2、从菜单中选择SerialPortSetup配置minicom1、#minicom-s3、“A”以设置“SerialDevice”。如果使用串口1,则输入/dev/ttyS0。如果使用串口2,则输入/dev/ttyS1。4、“E”键进入设置“bps/par/Bits”(波特率)界面,再按“I”以设置波特率为115200设置被保存到“/etc/minirc.dfl”目标板上电后,目标板的启动过程显示在minicom;CTR+A+s---zmodern2NFS服务NFS服务可以使网络上的同为Linux或Unix系统主机共享文件系统。NFS可以将远程文件系统载入在本地文件系统下。远程的硬盘、目录和光驱都可以变成本地主机目录树中的一个子目录。载入后与处理自己的文件系统一样使用即可。不只方便,也节省了重复保存文件的空间、传输文件的时间及网络带宽。NFS特点NFS系统也是使用C/S体系结构,就是有服务器端与客户端服务器端提供共享的文件系统,必须把文件系统输出(export)出去客户端则要把文件系统载入到自己的系统下使用NFS,需要在服务器端设置输出,在客户端设置载入NFS服务器端配置(1)关闭防火墙(2)配置共享目录----客户端主机IP范围(3)主机IP(4)启动NFS服务NFS客户端(1)设置客户端IP地址(2)挂载共享目录mount-tnfs主机ip:共享目录挂载点注意事项:关闭防火墙,主机与客户端在同一ip段具体配置步骤服务器端1)关闭防火墙具体配置步骤2)配置NFS服务器具体配置步骤2-1)设置共享目录和主机范围具体配置步骤2-2)设置其他选项具体配置步骤2-3)设置其他选项具体配置步骤3)设置NFS服务器的IP具体配置步骤4)启动NFS服务具体配置步骤客户端1)配置ip具体配置步骤2)挂载NFS/etc/exports它的基本格式是Directoryhost(权限选项、用户映像、)Directory:表示打算共享的目录名称;Host:共享这个目录的主机名称;权限选项:定义安全选项;权限选项1)ro:只读,只允许客户机挂载这个文件系统为只读模式。2)rw:明确指定共享目录为读/写权限。用户映像来限定某些用户对NFS共享文件的使用权限no_root_squash:其他安全选项1)Insecure:以非安全端口的方式访问,即默认用户端口是1024或者更高,而NFS服务器默认的安全的服务器端口应该是低于1024的。2)Sync:根据请求进行同步。例:vi/etc/exports/home/ls192.168.0.50(rw,insecure,no_root_squash)表示共享的目录为/home/ls,允许访问的客户机地址为192.168.0.50的主机,权限为可读可写(rw),非安全方式访问(insecure),让客户机的根用户在服务器上拥有根权限。例:vi/etc/exports/home/ls*(rw)表示共享的目录为/home/ls,允许任意主机访问,权限可读可写Bootloader是什么?Bootloader,为引导加载程序,是嵌入式系统加电后运行的第一段代码,相当于PC机的BIOS。Bootloader的位置:通常固化在硬件上的某个固态存储设备上,加电后自启动。基于ARM处理器核的CPU在复位时通常都从地址0x00000000取它的第一条指令。在这个地址处安排的就是Bootloader。Bootloader是在操作系统运行之前执行的一段小程序。通过这段小程序,我们可以初始化硬件设备、建立内存空间的映像表,从而建立适当的系统软硬件环境,为最终调用操作系统内核做好准备。3BootloaderBootloader参数系统内核根文件系统从低地址到高地址方向Flash几种发布的BootloaderBootloader是严重地依赖于硬件而实现的。每种不同体系结构的处理器都有不同的Bootloader。不过Bootloader的发展也趋于支持多种体系结构,如现在比较成熟的vivi、RedBoot和U-Boot等。操作模式大多数Bootloader都有两种不同的操作模式:“启动加载”模式和“下载”模式。其区别对于开发人员才有意义。从最终用户的角度看,Bootloader的作用就是用来加载操作系统,而并不存在所谓的启动加载模式与下载模式的区别。1、启动加载(Bootloading)模式即Bootloader从目标机上的某个固态存储设备上将操作系统加载到RAM中运行,整个过程并没有用户的介入。启动加载模式是Bootloader的正常工作模式,在嵌入式产品发布的时侯,Bootloader必须工作在这种模式下。2、下载(Downloading)模式下载方式:在这种模式下,目标机上的Bootloader将通过串口连接或网络连接等通信手段从主机下载文件。下载内容及存储:主要是下载内核映像和根文件系统映像等。从主机下载的文件通常首先被Bootloader保存到目标机的RAM中,然后再被Bootloader写到目标机上的FLASH类固态存储设备中。下载模式应用场合:Bootloader的这种模式通常在第一次安装内核与根文件系统时被使用;此外,以后的系统更新也会使用到这种工作模式。用户应用接口:工作于这种模式下的Bootloader通常都会向它的终端用户提供一个简单的命令行接口。如在U-BOOT下,将出现“#”提示符;在vivi下出现“vivi”提示符。下载(Downloading)模式示例Bootloader启动过程大多数BootLoader启动都分为stage1和stage2两大部分。依赖于处理器体系结构和板级初始化的代码,通常都放在stage1中,用汇编语言实现而stage2则通常用C语言来实现,这样可以实现更复杂的功能,而且代码会具有更好的可读性和可移植性。BootLoader的stage1通常包括以下步骤(以执行的先后顺序):1.硬件设备初始化。2.为加载BootLoader的stage2准备RAM空间。3.拷贝BootLoader的stage2到RAM空间中。4.设置好堆栈5.跳转到stage2的C入口点。Stage1主要工作是硬件初始化,并准备第二阶段的C语言运行环境关闭处理器内部指令/数据cache等设置CPU的速度和时钟频率RAM初始化初始化led等为了获得更快的执行速度,通常把阶段2的代码加载到RAM空间中来执行。准备RAM空间考虑的因素:阶段2代码大小、堆栈、页大小(4KB的倍数)、安排位置等。stage2_start.........stage1为stage2可执行映像准备的RAM地址范围,大小:1MBramdisk...(blank)内核映像...(blank)stage2可执行映像可能的最大大小:1MBstage1可执行映像大小:1MBRAM地址空间Flash地址空间堆栈指针sp:stage_end-40x0001,0000(64KB)0x0000,0400(1KB)0x0000,0000...(blank)BootLoader的stage2通常包括以下步骤(以执行的先后顺序):1.初始化本阶段要使用到的硬件设备。2.检测系统内存映射(memorymap)。3.将kernel映像和根文件系统映像从flash上读到RAM空间中。4.为内核设置启动参数。5.调用内核。stage2的代码通常用C语言来实现,以便于实现更复杂的功能和取得更好的代码可读性和可移植性。与普通C语言应用程序不同的是,在编译和链接bootloader这样的程序时,我们不能使用glibc库中的任何支持函数。Stage2的主要目的是运行Linux内核,在此之前需要完成硬件和内存初始化工作。Bootloader调用Linuxkernel的方法是直接跳转到内核的第一条指令处。在跳转时必须满足下列条件:1)、CPU寄存器的设置:R0为0;R1为机器类型ID;R2为启动参数,标记列表在RAM中的起始基地址。2)、CPU模式:CPU必须设置为SVC模式,必须禁止中断(IRQs和FIQs)。3)、MMU和Cache的设置:MMU必须关闭;指令Cache可以打开也可以关闭;数据Cache必须关闭。viviBootloader源码分析vivi是韩国Mizi公司开发的Bootloader,适用于ARM9处理器。vivi有两种工作模式,在启动时可以选择。在vivi启动时,通过串行口发出如下信息:PressReturntostarttheLinuxnow,anyotherkeyforvivi按回车键启动LinuxOS,按其它键进入vivi命令接口模式,可以使用vivi提供的命令进行一些操作。vivi源代码目录结构vivi源代码包含的目录有:arch、Documentation、drivers、init、include、lib、scripts、test、util等10目录,共300多个文件。各个目录内容如下:1、arch(architecture)目录它下面的文件为与CPU硬件相关