arm linux移植文档.doc_第1页
arm linux移植文档.doc_第2页
arm linux移植文档.doc_第3页
arm linux移植文档.doc_第4页
arm linux移植文档.doc_第5页
免费预览已结束,剩余13页可下载查看

下载本文档

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

文档简介

移植文档1、嵌入式linux 简介LINUX 是一个类似UNIX 的操作系统,其代码是完全重新开放的,内核功能强大,实现简洁。它提供了类似UNIX 的编程接口和系统调用,可以方便的将UNIX系统上的应用程序,移植到Linux上运行。Linux具有一下特点:1可移植性:Linux内核源代码是用C语言编写的,可以运行到各种平台。2支持多种处理器体系结构:Linux内核能够支持的处理器要求是32位处理器,有没有MMU都可以。没有MMU的处理器只有uClinux支持。Linux2.6内核支持的绝大多数都是带MMU的。3开放源代码的优势:Linux内核是开放源代码的,也就是说,用户可以免费获取,修改linux源码。庞大的linux社区和内核源代码工程,有很多各种各样的驱动程序和应用程序可以利用。开发者可以免费得到社区的贡献、支持。众所周知,Linux在嵌入式系统中的应用已经非常普遍。为了进一步促进这方面的应用,在Linux 2.6中,引入了很多非常有利于嵌入式应用的功能。这些新功能包括实时性能的增强、更方便的移植性、对大容量内存的支持、支持微控制器和I/O系统的改进等。2、linux-2.6内核的新特征1改进了响应时间在2.6内核以前,要想让Linux获得更好的响应能力,就需要一些特殊的补丁。通常情况下,需要用户从厂商处购买补丁来改进中断性能和调度反应时间。如今,2.6内核把这些改进加入到了主流的内核当中,因此无需再对其进行特殊的配置。2抢占式内核Linux 2.6内核在一定程度上使用了可抢占的模式。因此,在一些时效性比较强的事件中,Linux 2.6要比2.4具有更好的响应能力。当然了,它实际上并不是一个真正的RTOS,但是与以前的内核相比较,“停顿”的感觉要少得多。3高效的调度程序在2.6版本中,进程调度经过重新编写,去掉了以前版本中效率不高的算法。调度程序每次不再扫描所有的任务,而是在一个任务变成就绪状态时将其放到一个名为“当前队列”的队列之中。当进程调度程序运行时,它只选择队列中最有利的任务来执行。这样,调度就可以在一个恒定的时间里完成。当任务执行时,它就会得到一个时间段,或在其转到另外一个线程之前得到一段时间的处理器使用权。当它的时间段用完之后,任务就会被移到另外一个名为“过期”的队列中。而在该队列中,任务会根据其优先级进行排序。4新的同步措施多进程应用程序有时需要共享一些资源,比如共享内存或设备。为了避免竞争的出现,程序员会使用一个名为互斥的功能来确保同一时刻只有一个任务在使用资源。到目前为止,Linux还是通过一个包含在内核中的系统调用来完成互斥的实现,并由该系统调用来决定一个线程是等待还是继续执行。但当决定继续执行时,这个耗时的系统调用就不需要了5共享内存的改进嵌入式系统有时也是一个有很多处理器的设备,比如在电信网络或大型存储系统中就是如此。而不论是均衡或是松散连接的多处理器,一般都是共享内存的。均衡多进程的设计是所有的处理器都有对内存有均等使用权,而限制使用内存的决定性因素是进程的效率。Linux2.6为多程序提供了一种不同的途径,即所谓的NUMA(Non Uniform Memory Access)。这种方法中,内存和处理器是相互连接的,但是对于每一个处理器,一些内存是“关闭”的,而有的内存则是“更远”的。这就意味着当内存竞争出现时,“更近”的处理器对就近的内存有更高的使用权。6POSIX线程、信号和计时器与POSIX线程一起,2.6把POSIX信号和POSIX高精度计时器作为了主流内核的一个组成部分。POSIX信号比以前Linux版本中使用的Unix模式的信号有了很大的改进。新的POSIX信号不能被丢失,并且可以携带信息作为参数。此外,POSIX信号也可以从一个POSIX线程传送至另外一个线程,而不是像Unix信号一样,只能从一个进程至另外一个进程。嵌入式系统通常要求硬件能够在固定的时间安排下来运行任务。POSIX计时器可以轻松地让任何一个任务都可以周期性地得到预定安排的时间。计时器的时钟可以达到很高的精度,从而可以让软件工程师更加精确地控制任务的调度。7支持通用设计嵌入式世界里的硬件设计通常都要经过定制,以满足特定的应用程序。因此,设计人员经常需要使用原始的方式来解决设计上的问题。比如,为特定目的制造的主板可能使用不同的IRQ管理器而不是使用类似的设计。在2.6内核中,就引入了一个名为子框架的概念。在新的定义中,各组件被清晰地分开,并且可以独立进行更改或替换,而不会对其它的组件或软件包造成影响,或者影响非常小。8设备、总线和I/O现在Linux正在变成行业用户的第一选择。2.6内核包含了ALSA(Advanced Linux Sound Architecture),该体系结构可以安全地使用USB和MIDI设备。通过使用ALSA,系统可以同时播放和记录音频。用于支持视频的Video4Linux系统,在2.6中也焕然一新。虽然其不能向后兼容,但却可用于最新的广播、电视、数码相机和其它的多媒体。Linux 2.6使用的是USB 2.0,它要比一般的USB快40倍。可以预见,在不久的将来,高速设备将非常普及,而在对USB 2.0支持方面,Linux可以说是一个先行者。9支持64位处理器和微控制器使用2.6内核,对于那些需要大量内存的嵌入式Linux开发人员就可以选择64位的处理器。也提供了对微处理控制器的支持。3、linux内核源代码由于linux内核版本不断升级更新,所以最好下载新版本的内核源码。Linux官方发布的内核版本可以从以下网站获取:获取linux内核源码之后,就可以仔细分析内核源码了。Linux内核源代码非常庞大,随着版本的发展不断增加新的内容。初次接触linux内核,可以仔细阅读顶层目录的readme,它是linux内核的概述和编译命令说明。内核源码的顶层目录下有许多子目录,分别存放内核子系统的各个源文件。目录说明如下:Linux kernel 的目录 内容Arch 体系结构相关的代码Drivers 各种设备驱动程序Fs 文件系统Include 内核头文件Init Linux初始化代码Ipc 进程间通讯的代码Kernel Linux内核核心代码Lib 各种库子程序Mm 内存管理代码Net 网络支持代码,主要是网络协议Sound 声音驱动的支持Scripts 使用的脚本Usr 用户的代码4、交叉工具链介绍交叉编译就是在一个平台上生成可以在另一个平台上执行的代码。注意这里的平台,实际上包含两个概念:体系结构(Architecture)、操作系统(Operating System)。同一个体系结构可以运行不同的操作系统;同样,同一个操作系统也可以在不同的体系结构上运行。举例来说,我们常说的x86 Linux 平台实际上是Intel x86 体系结构和Linux for x86 操作系统的统称;而x86 WinNT 平台实际上是Intel x86 体系结构和Windows NT for x86 操作系统的简称。就本书所涉及到的目标硬件S3C2410 而言,之所以使用交叉编译是因为在该硬件上无法安装我们所需的编译器,只好借助于宿主机,在宿主机上对即将运行在目标机上的应用程序进行编译,生成可在目标机上运行的代码格式。在这里介绍在嵌入式系统开发中用得最多的GNU 开发工具。GNU交叉工具链,包括C编译器GCC,C+编译器G+,汇编器AS,链接器LD,二进制转换工具(OBJCOPY,OBJDUMP),调试工具(GDB,GDBSERVER,KGDB) 和基于不同硬件平台的开发库。在GNU GCC支持下用户可以使用流行的C/C+语言开发应用程序,满足生成高效率运行代码、易掌握的编程语言的用户需求。这些工具都是按GPL 版权声明发布,任何人可以从网上获取全部的源代码,无需使用任何费用。关于GNU 和公共许可证协议的详细资料,读者可以参看GNU 网站的介绍,/home.html。运行于Linux 操作系统下的自由软件GNU gcc 编译器,不仅可以编译Linux 操作系统下运行的应用程序,还可以编译Linux 内核本身,甚至可以作交叉编译,编译运行于其它CPU上的程序。在这里我们用的是arm-linux-工具链。GCC交叉工具链的版本匹配是个大麻烦,2.95.x版本的GCC工具链曾经统治过linux-2.4内核时代,它表现得极为稳定。现在GCC2.95.3版本已经过时了,linux-2.6内核要求更高的工具链版本支持。Linux-2.6内核最后使用gcc-3.3以上版本。5、步骤51、搭建嵌入式linux开发环境嵌入linux系统在开发阶段,一般采用的是开发机和目标板的开发模式,在开发机上安装交叉工具链,配置TFTP,NFS等的服务,在目标板上通过TFTP下载文件,通过NFS挂载跟文件系统。1配置开发机(PC)的环境。安装并启动TFTP服务:TFTP是简单的文件传输协议,适合目标板的bootloader使用。在配置TFTP服务之前必须安装TFTP软件包,我们完整安装suse Linux 10.1后系统会自动安装这些软件包。在这里我们把kernel/目录下的tftp-hpa-0.48.tar.bz2解压到当前目录。使用命令:hbuserhblinux:/yizhi/kernel tar -xjvf tftp-hpa-0.48.tar.bz2进入到解压后的目录:hbuserhblinux:/yizhi/kernel cd tftp-hpa-0.48/执行下列命令:hbuserhblinux:/yizhi/kernel/tftp-hpa-0.48 ./configurehbuserhblinux:/yizhi/kernel/tftp-hpa-0.48 makehbuserhblinux:/yizhi/kernel/tftp-hpa-0.48 make install即会安装tftp服务器创建tftp服务目录hbuserhblinux: mkdir /home/hbuser/tftp手动修改TFTP配置文件: sudo vi /etc/xinetd.d/tftp将“isable = yes”选项改为“disable = no”,如下: service tftp disable = no socket_type = dgram protocol = udp wait = yes user = root server = /usr/sbin/in.tftpd server_args = -s /home/hbuser/tftp 保存退出。打开suse的控制面板:yaST 到network services网络服务点选TFTP ServerContinue继续初始化tftpskip跳过初始化后启动tftp服务,是防火墙允许通过:如下图操作!然后finish完成!通过以下命令启动tftp服务:sudo /etc/init.d/xinetd restart因为tftp是xinet.d守护进程:所以不能用ps aux | grep R “tftp”组合命令来检查,只能在触发tftp服务后才能检查到!安装minicom串口工具(类似于windwos的超级终端)关掉虚拟机下的linux不是暂停!添加虚拟机的串口设备,注意添加的设备是com1, 打开windows设备管理器,把串口驱动删除,重新搜索硬件安装驱动!启动虚拟机下的linux即可!解压kernel目录下的minicom-21.2.tar.gzhbuserhblinux:/yizhi/kernel tar -zxvf minicom-21.2.tar.gz进入到解压目录:hbuserhblinux:/yizhi/kernel cd minicom-2.2/hbuserhblinux:/yizhi/kernel/minicom-2.2 ./configurehbuserhblinux:/yizhi/kernel/minicom-2.2 makehbuserhblinux:/yizhi/kernel/minicom-2.2 sudo make installroots password:输入密码安装!安装后插好串口线,打开开发板电源输入启动命令启动minicom:hbuserhblinux:/yizhi/kernel/minicom-2.2 sudo minicom s即可启动minicom ,配置minicom如下图:(上下键选择) lqqqqqconfigurationqqqqqqk x Filenames and paths x x File transfer protocols x x Serial port setup x x Modem and dialing x x Screen and keyboard x x Save setup as dfl x x Save setup as. x x Exit x x Exit from Minicom x mqqqqqqqqqqqqqqqqqqqqqqqqqqj回车:出现下图:lqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq x A - Serial Device : /dev/ttyS1 x x B - Lockfile Location : /var/lock x x C - Callin Program : x D - Callout Program : x E - Bps/Par/Bits : 115200 8N1 x F - Hardware Flow Control : Yes x G - Software Flow Control : No x Change which setting? Mqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq选A更改:设备为:/dev/ttyS0 回车选F把硬件加速流设置成“no” 回车设置之后的结果如下图:lqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq x A - Serial Device : /dev/ttyS0 x B - Lockfile Location : /var/lock x C - Callin Program : x D - Callout Program : x E - Bps/Par/Bits : 115200 8N1 x F - Hardware Flow Control : No x G - Software Flow Control : No x Change which setting? Mqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq回车!保存lqqqqqconfigurationqqqqqqk x Filenames and paths x x File transfer protocols x x Serial port setup x x Modem and dialing x x Screen and keyboard x x Save setup as dfl x x Save setup as. x x Exit x x Exit from Minicom x mqqqqqqqqqqqqqqqqqqqqqqqqqqj回车lqqqqqconfigurationqqqqqqk x Filenames and paths x x File transfer protocols x x Serial port setup x x Modem and dialing x x Screen and keyboard x x Save setup as dfl x x Save setup as. x x Exit x x Exit from Minicom x mqqqqqqqqqqqqqqqqqqqqqqqqqqj回车,便可退出设置!出现下图:(uboot的启动信息)安装ncurses库(支持图形编译):解压kernel目录下的:ncurses-5.6.tar.gzhbuserhblinux:/yizhi/kernel tar -zxvf ncurses-5.6.tar.gz进入到目录:buserhblinux:/yizhi/kernel cd ncurses-5.6/hbuserhblinux:/yizhi/kernel/ncurses-5.6 ./configurehbuserhblinux:/yizhi/kernel/ncurses-5.6 sudo make install即可安装:ncurses库。安装交叉编译工具链:如果没有安装交叉编译工具,可以按照如下步骤安装:安装GCC交叉工具链:一般我们在开发嵌入式linux过程中,会用到不同的交叉工具链,我们这里安装3.3.2版本的工具链,步骤如下:#mkdir /usr/local/arm ;如果目录存在,就不需要建立将kernel目录下的cross-3.3.2.tar.bz2工具链拷贝到该目录解压它:#tar jxvf cross-3.3.2.tar.bz2然后,在需要使用交叉编译是,只要在终端输入如下命令:#export PATH=/usr/local/arm/版本/bin:$PATH在需要更改不同版本的工具链时,重新启动一个终端,然后再一次输入上面的命令即可。2、移植linux-2.6到gec2410开发板linux-2.6 内核已经支持S3C24x0 处理器的多种硬件板,这里我们用开发板提供的内核为例,实现内核的移植。步骤:(1)准备工作(2)修改顶层Makefile(3)修改内核源码(4)配置编译内核(5)下载到开发板上运行21、准备工作建立工作目录,下载源码,安装交叉工具链,步骤如下。mkdir /home/hbuser/build_kernel将提供的kernel/gec2410-linux-2.6.8.tar.bz2拷贝到新建目录下 解压#tar jxvf gec2410-linux-2.6.8.tar.bz2#export PATH=/usr/local/arm/3.4.1/bin:$PATH22、修改顶层Makefile修改内核目录树根下的的Makefile,指明体系结构是arm,交叉编译工具是arm-linux-;cd /home/hbuser/build_kernel/gec2410-linux-#vi Makefile找到ARCH 和CROSS_COMPILE,修改ARCH := armCROSS_COMPILE := /usr/local/arm/3.4.1/bin/arm-linux-保存退出。23、修改内核源码这里注意,如果要用u-boot 来引导linux 内核,则需要修改内核源码;(1)修改include/asm-arm/arch-s3c2410/uncompress.h 文件,指定输入为串口0;#vi include/asm-arm/arch-s3c2410/uncompress.h将第30行的:“define uart_base (S3C2410_PA_UART + 0x4000)” 改成 “define uart_base (S3C2410_PA_UART)” (2)禁止内核的Flash ECC校验如果内核和根文件系统的烧写是通过u-boot的“nand write”命令来写到Nand Flash的, 那么就要在内核源码的nand驱动中禁止的Flash ECC校验。这是因为u-boot通过的软件ECC算法产生ECC校验码, 这与内核校验的ECC码不一样, 内核中的ECC码是由S3C2410中NandFlash控制器产生的. 所以, 我们要禁止内核ECC校验。(此步我们不需要做!)24、配置内核cp gec2410.cfg .config注意:gec2410.cfg 文件是开发板提供的默认内核配置文件,我们这里首先把内核配置成默认配置,在此基础上用make menuconfig 进一步配置;make menuconfig出现如下配置菜单在gec2410.cfg 基础上,我们可以选择自己的配置选项,定制内核;(我们可以看看它的一些选项,了解配置选项)为了保证配置的正确性暂时不要修改!保存退出,产生.config 文件.编译内核make编译结束后,生成arch/arm/boot/zImage 映象文件,这就是内核的映象文件。25 下载内核镜像到开发板运行(1)连接好PC机与开发板,连接好串口线,网线,电源线,lcd屏。(2)烧写u-boot到开发板中,配置好并启动minicom,如下: sudo minicom s选择 “Serial port setup”选项,进一步设置,如前面minicom设置保存设置,启动开发板,开发板会打印出u-boot的启动信息。(3)拷贝内核映象文件到/tftproot 目录,并启动TFTP 服务;cp /home/hbuser/build_kernel/linux/arch/arm/boot/zImage /tftproot/etc/init.d/xinetd restart(4)设置开发板u-boot 的环境变量;在minicom 中输入如下命令,设置uboot 的serverip,ipaddr 环境变量;#setenv serverip 5 /这里的serverip 是PC 机的ip 地址,就是提供/TFTP 服务主机的IP 地址#setenv ipaddr 4 /ipaddr 是开发板本身的ip 地址/设置启动命令行参数#setenv bootargs root=/dev/mtdblock2 load_ramdisk=0 init=/linuxrc console=ttyS0,115200 devfs=mount display=shp240#saveenv /保存(5)下载运行zImage在minicom中的u-boot命令行 输入如下命令:#tftp 30008000 zImage /下载内核,#go 30008000 /单下载完之后运行内核。打印出如下启动信息:# Starting application at 0x30008000 .Uncompressing Linux. done, booting the kernel.Linux version -ptx1 (rootlocalhost.localdomain) (gcc version 3.4.4) #5 Tue Sep 2515:00:04 CST 2007CPU: ARM920Tid(wb) 41129200 revision 0 (ARMv4T)CPU: D VIVT write-back cacheCPU: I cache: 16384 bytes, associativity 64,

温馨提示

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

评论

0/150

提交评论