《毕业设计(论文)-基于ARM9的Linux系统移植与驱动开发(43页).docx》由会员分享,可在线阅读,更多相关《毕业设计(论文)-基于ARM9的Linux系统移植与驱动开发(43页).docx(42页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、-毕业设计(论文)-基于ARM9的Linux系统移植与驱动开发-第 36 页本 科 毕 业 设 计 题目名称: 基于ARM9的Linux系统移植与驱动开发 学生姓名: 院 系: 专业年级: 指导教师: 职 称: 年 月 日目 录题目摘要及关键词I1 前 言11.1 嵌入式基本介绍11.2 嵌入式的发展方向11.3 课题意义11.4 内容简介12 开发环境12.1 Linux硬件平台12.2 linux软件开发环境12.2.1 交叉编译环境12.2.2 配置主机NFS服务12.2.3 安装交叉编译工具链13 系统引导过程13.1 Bootloader介绍13.2 Uboot编译13.3 移植ub
2、oot13.3.1 移植U-Boot的基本步骤13.3.2 NAND FLASH和NOR FLASH启动14 内核移植14.1 内核版本号命名规则14.2 Linux内核特点14.3 编译新版内核注意事项14.4 移植前的准备工作14.5 开发板内核移植14.6 Linux 内核启动过程14.6.1 内核自引导14.6.2 Linux系统初始化14.6.3 挂接根文件系统14.6.4 初始化设备驱动14.6.5 启动用户空间init进程14.7 文件系统14.7.1 文件存放规则14.7.2 制作JFFS2根文件系统15 Linux驱动程序15.1 Linux驱动程序简介15.2 Linux驱
3、动程序构成15.3 驱动程序调用过程15.4 Linux字符设备驱动程序15.4.1 驱动测试15.5 输入子系统驱动程序15.5.1 驱动测试16 结论与展望16.1 结论16.2 展望1参考文献1致 谢1附录1 Uboot NAND、NOR双启动代码1附录2 LED驱动程序1附录3 触摸屏驱动程序1基于ARM9的Linux系统移植与驱动开发姓 名: 专 业: 指导教师: 摘 要:十二届全国人大三次会议上首次提出“互联网+”行动计划。所谓“互联网+”,是指“互联网+各个传统行业”,也就是将互联网与传统行业相结合。嵌入式linux既继承了Internet上无限的开放源代码资源,又具有嵌入式操作
4、系统的特性。嵌入式Linux版权费免费;自由软件开发者提供了大量的应用软件支持,支持网络特性,而且性能优异,软件移植容易,代码开放,应用产品开发周期短,有许多公开的代码可以参考和移植,实时性强,稳定性、安全性好。本文主要阐述了将linux系统移植到搭载s3c2440芯片的开发板上,并针对其硬件开发和移植字符设备驱动程序的过程。文章列出了嵌入式linux的发展现状以及对未来发展方向的分析、嵌入式linux的驱动程序框架以及开发流程。关键词:S3C2440、内核移植、UBOOT、文件系统、触摸屏驱动程序。Transplantation and driver development of Linux
5、 system based on ARM9 Name: ShiChuan Liu Major: Electronic Information and Technology Tutor: Li JianAbstract: The three meeting of the twelve National Peoples Congress for the first time put forward the Internet plus action plan. The so-called Internet plus, refers to Internet plus various tradition
6、al industries, which is the combination of Internet and traditional industries. The embedded Linux inherits the Internet on infinite open source code resources, but also has the characteristics of embedded operating system the embedded Linux royalty free; provides a number of software applications s
7、upport free software developers, support network characteristics, and excellent performance, the software easy to transplant, open source, application of product development cycle is short, there are many open source code can reference and transplantation, real-time, stability, good safety. This pap
8、er mainly expounds the the Linux system will be transplanted to the development board is equipped with S3C2440 chips, the driver for the hardware development and transplantation and corresponding. This paper lists the development of embedded Linux is As well as the future direction of development of
9、 the analysis, embedded Linux Driver Framework and development process.Keywords:S3C2440、Transplantation of kernel、UBOOT、File System、Touch Screen Driver.1 前 言随着社会信息化的发展,嵌入式系统已经渗透到生活的各个领域。随着技术的发展和人们需求的增加,各类消费类电子产品的功能越加强大,使得系统越来越大,应用越来越多,使用操作系统很有必要。嵌入式linux 是将Linux操作系统进行修改、裁剪,使它能够在特定的硬件平台上运行的一种操作系统。嵌入式
10、linux开源免费的特性,使得它拥有海量用户,来自全世界的无数程序员参与了嵌入式Linux的修改、编写工作,使得它拥有大量的软件工具,自身也在不断完善。1.1 嵌入式基本介绍嵌入式系统的定义为:以应用为中心,以计算机技术为基础、软硬件可裁剪,适用于应用系统,对功能,可靠性,成本,体积,功耗严格要求的专用计算机系统。它的主要特点是嵌入、专用。嵌入式linux最核心的两个部分,一是处理器,二是操作系统。CPU作为中心计算单元,是嵌入式系统最核心的部件,是控制和辅助系统运行单元,嵌入式系统性能对CPU的依赖最大。从20世纪70年代起,微型机以小型、廉价、高速数值计算等特点迅速走向市场,它所具备的智能
11、化水平在工业控制领域发挥了很大作用,常以各种形态出现,嵌入到一个对象体系中。进行智能化控制。好似计算机失去原来的形态,与通用的功能,为了区别于通用计算机系统,将这类为了某个专用的目的,而嵌入到对象体系中的计算机系统,称为嵌入式计算机系统,简称嵌入式系统。目前嵌入式方面的处理器超过2000种,主要的嵌入式处理器类型有Am186/88、386EX、SC-400、Power PC、68000、MIPS、ARM/ StrongARM系列等。ARM处理器的具备耗电少功能强、16位/32位双指令集的优点。这使得在移动设备市场,ARM处理器的市场份额超过90%。ARM微处理器包含一系列可用于不同应用环境的i
12、p结构, 如ARM7、9、9E、10E等系列。1.2 嵌入式的发展方向嵌入式系统最初被用于控制机电、电话、交换机,如今被广泛应用于智能设备、电视机顶盒、交换机、服务器、银行自助客户端、通信、医疗器械、交通运输、工控、航空航天等。其应用的方向反映了其发展方向:A 目前的网络连接的装置不到20%,大量嵌入式设备需连接网络来提升其操作性和灵活性。Linux操作系统方面,linux的缺点在于实时性,虽然linux在实时性方面有所改进,但依然还有发展空间,有一些变种的linux如Rtlinux达到了硬实时。另外虽然有多种linux发行版本,为系统提供了图形化的界面,但用于开发的工具软件还大多是在命令行下
13、操作。未来的开发的工具软件向图形化界面还有很大的发展空间。Linux目前正在进一步将各个平台的差异化分离出来,需要用户自行配置的部分也就逐渐减少,Linux内核、bootloader的配置使用将越来越简便。B 在便携设备方面,省电节能将是嵌入式软硬件的一个共同发展方向,同时随着处理器技术突破,嵌入式设备处理速度更快、处理更加及时。1.3 课题意义随着智能化、信息化的社会发展趋势,嵌入式系统发展深入到很多领域。本文从嵌入式系统入手,移植最新linux4.4.8内核,构建开发板专用的嵌入式系统,在操作系统运行状态下实现应用程序及驱动程序的开发和测试,为嵌入式系统开发构建一个良好环境。1.4 内容简
14、介本文根据linux启动顺序,从linux内核的引导阶段开始,分析linux内核引导过程及使用uboot引导程序的移植,然后阐述了linux内核启动过程及linux内核移植,解释了linux内核启动完成后挂接文件系统及启动应用程序的过程,最后分析了linux驱动程序开发步骤。2 开发环境2.1 Linux硬件平台本文使用百问网http:/www.100ask.org/出品的JZ2440 v2开发板,其主要硬件特性如下:1:处理器:S3C2440A-40 400MHz主频,ARM 920T内核1。2:Hitachi 4.3寸触摸屏LCD 。3:256M NAND FLASH,8bit宽度。4:6
15、4M SDRAM,133MHz,32bit宽度(两片组成)。5:网卡:100Mbps DM9000C, RJ45接口。6:USB串口。7:USB HOST。8:USB DEVICE。2.2 linux软件开发环境嵌入式开发因为嵌入式设备本身的资源不足以用于软件开发,因此需要采用交叉编译的方式进行,PC上通过Vmware Workstation虚拟机软件安装linux发行版Ubuntu12.04(后文中如未特别说明,PC意为Ubuntu12.04)。在PC里面编辑、编译软件,在开发板上运行、测试程序。2.2.1 交叉编译环境嵌入式系统是用于某种特定环境下的计算机系统,它对系统某方面有严格要求。例
16、如:PDA需要通过电池供电,需要尽可能降低功耗;网络交换机,不需要键盘显示等外围设备;还有大部分嵌入式设备没有磁盘等大容量存储设备。智能手机属于嵌入式系统,尽管配置了显示屏、虚拟键盘等显示和输入设备,但它更加注重降低功耗及移动通信。出于嵌入式系统Flash 存储空间小,可用于安装的储存空间少,处理器也可能不满足发行版的Linux 系统的使用需求。所以需定制Linux 操作系统,这必然要与之对应的开发环境。由此便出现了交叉开发模式。交叉开发模型如图2-1所示。图 2-1 交叉编译模型Figure2-1 Cross-compilation model在PC上,可以安装开发工具,编辑、编译目标板的L
17、inux引导程序、内核和文件系统,然后在目标板上运行。通常这种在主机环境下开发,在目标板上运行的开发模式叫作交叉开发。在交叉开发环境下,开发主机也是工作站,可以给开发者提供开发工具;同时也是一台服务器,可以配置启动各种网络服务。在PC主机上,Linux已经成为优秀的计算机操作系统2。各种Linux 发行版本,可以直接在PC 上安装,功能十分强大。它支持的设备多,操作更方便,性能更加稳定。交叉开发方式使开发者可以在常用的主机环境下进行开发(应用程序、驱动等),又方便开发调试阶段的调试,目标板硬件限制也就降低了。这种开发方式贯穿嵌入式Linux系统开发的全过程。目标板和主机之间常用的连接方式有UA
18、RT、网线、USB口及JTAG等连接方式。2.2.2 配置主机NFS服务NFS(Network File System)即网络文件系统,是FreeBSD支持的文件系统中的一种,它允许网络中的计算机之间通过TCP/IP网络共享资源。在NFS的应用中,本地NFS的客户端应用可以透明地读写位于远端NFS服务器上的文件,就像访问本地文件一样3。为之后在开发板上更方便的进行的烧写、测试程序,需要安装、配置、启动网络文件系统,ubuntu12.04系统下,执行下列命令可以获取nfs服务: sudo apt-get updatesudo apt-get install nfs-kernel-server p
19、ortmapvi /etc/exports加入行 /work/nfs_root *(rw,sync,no_root_squash)sudo /etc/init.d/nfs-kernel-server restart2.2.3 安装交叉编译工具链交叉编译工具链可以使用crosstool制作,网络上也可以下载,这里使用广州友善之臂计算机科技有限公司提供下载的交叉编译工具链arm-linux-gcc 4.4.3,网址$ echo $PATH/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/loca
20、l/games:/usr/local/arm/4.3.2/bin/修改/etc/environment的内容,添加工具链路径/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games: /work/tools/4.4.3/bin重启PC,执行arm-linux-gcc v 查看当前交叉编译工具链版本信息。3 系统引导过程图3-1 Linux系统引导过程Figure3-1 Linux OS guide process如图3-1所示,在很多体系结构平台上,内核映像大都进行了压缩以缩
21、小体积。Linux系统启动过程通常划分为内核引导、内核启动和应用程序启动3 个阶段:1 引导内核开发板上电或复位后,首先执行Bootloader,初始化内存等硬件,为内核的启动创造合适条件,然后把压缩格式的内核映像文件拷贝进内存特定位置,再跳转到内核入口出执行,bootloader生命周期结束,事件处理完全由内核进行 4。2 启动内核内核继续执行,完成自动解压缩,跳转到解压后的内核代码入口地址。3 启动应用程序文件和应用程序需要文件系统来组织、管理和存储,所以Linux文件系统的重要性不言而喻。在内核启动完成使,须挂接文件系统。从文件系统目录下找到init程序,启动其进程。3.1 Bootlo
22、ader介绍U-Boot,全称 Universal Boot Loader,是遵循GPL条款的开放源码项目。从FADSROM、8xxROM、PPCBOOT逐步发展演化而来。其源码目录、编译形式正向着Linux内核看齐,uboot中的很多源码来源于linux内核源码树,如设备驱动等 5。3.2 Uboot编译顶层目录的Makefile负责U-Boot整体配置编译。在执行make smdk2410_defconfig 命令时,执行Makefile里面命令:%config: scripts_basic outputmakefile FORCE$(Q)$(MAKE) $(build)=scripts/
23、kconfig $然后通过依赖1(scripts_basic)最终将configs/smdk2410_defconfig文件内容读出,生成arch、cpu、board、soc的值,Makefile里面会调用他们来执行命令,然后根据这些信息确定平台相关目录和配置文件:board/smdk2410/cpu/arm920t/cpu/arm920t/s3c24x0/lib_arm/include/asm-arm/include/configs/smdk2410.h3.3 移植uboot最新版本的 U-Boot 可以从 DENX 官方网站http:/www.denx.de/wiki/U-Boot/Web
24、Home获取,本次设计采用的 U-Boot 版本号为 uboot-2016.01。如果U-Boot已经支持一块硬件相似的开发板,移植的过程将变得简单6。移植U-Boot工作就是添加开发板硬件相关的文件、配置选项,然后配置编译。开始移植之前,需要先分析一下U-Boot 已经支持的开发板,比较出硬件配置最接近的开发板。选择的原则是,首先处理器相同,其次处理器体系结构相同,然后是以太网接口等外围接口。还要验证一下这个参考开发板的U-Boot,至少能够配置编译通过。图3-2 uboot2016.01程序流程Figure3-2 program flow chart分析start.S(arch/arm/c
25、pu)可得uboot2016.01程序流程如图3.2所示,过程如下:1、 初始化硬件: 关看门狗、设置时钟、设置SDRAM、初始化NAND FLASH。2、 设置栈,调用c函数执行第一次初始化,主要对内存进行划分。3、 NOR FLASH、NAND FLASH不能像内存一样直接进行数据的读或写(NOR 可以像内存一样读),从而会增加代码执行所需时间7,因此需要把uboot映像文件从FLASH (NAND 或 NOR)拷贝到SDRAM。3、设置要传给内核的参数(内存分配信息等),并打印。4、跳转执行内核,内核启动。3.3.1 移植U-Boot的基本步骤(1) 为开发板添加新的配置选项,使用已有的
26、配置项为例。gedit ./configs/smdk2440_defconfig:CONFIG_ARM=yCONFIG_TARGET_SMDK2440=yCONFIG_SYS_PROMPT=SMDK2440 # gedit arch/arm/Kconfig +91:config TARGET_SMDK2440bool Support smdk2440select CPU_ARM920T(2)创建新开发板目录,存放相关的代码,添加文件。cprboard/samsung/smdk2410board/samsung/smdk2440gedit board/samsung/smdk2440/Kconf
27、ig:if TARGET_SMDK2440config SYS_BOARD default smdk2440config SYS_VENDOR default samsungconfig SYS_SOC default s3c24x0config SYS_CONFIG_NAME default smdk2440endif(3)为开发板添加新的配置文件。cpinclude/configs/smdk2410.hinclude/configs/smdk2440.h如果是为一颗新的CPU移植,还要创建一个新的目录存放CPU相关的代码。(4)配置开发板。make smdk2440_defconfig(5
28、)编译U-Boot。修改Makefile,指定交叉编译工具链:CROSS_COMPILE = arm-linux-执行make命令,生成u-boot.bin映像文件。(6)添加驱动及功能选项。在能够编译通过的基础上,还要实现U-Boot的以太网接口、Flash擦写等功能。jz2440开发板的网卡驱动和为dm9000c,uboot源码包含了dm9000驱动程序,可以直接使用8。dm9000驱动程序相关文件路径如下:dm9000x.c (driversnet)dm9000.h (include)dm9000x.h (driversnet)对于Flash,多数开发板大小、型号存在差异,还需移植Fla
29、sh 的驱动。(7)调试U-Boot,使得能够正常启动开发板。调试的过程往往最艰难,出现问题时需要调试(工具如eclipse、gdb、J-tag9、Open-jtag、OpenOcd,方法如点灯法、串口打印法、定义DEBUG宏等),并且有些问题可能困扰很长时间。图3-3 SDRAM内存分布Figure3-3 SDRAM memory division3.3.2 NAND FLASH和NOR FLASH启动对于jz2440开发板,使用64MByte的SDRAM,其虚拟映射的地址是0x30000000 0x34000000,为更好的实现NAND FLASH启动兼顾减小uboot映像文件大小,不使用
30、位置无关码(用于代码实现位置无关重定位),手动指定代码重定位目的地址为0x33f00000(到内存顶部间的空间大小为1MByte), 其内存划分如图3-310。出于成本考虑,uboot代码通常存放于NAND FLASH或NOR FLASH,这两种存储芯片特性不同。当从NAND FLASH启动的时候,对于S3C2440,CPU会自动拷贝NAND FLASH的前面4Kbyte大小的内容到SRAM,然后从SRAM的0地址执行,如果重定位结束时的地址范围不超过SRAM的大小时,就可以通过执行SRAM里面的拷贝函数来把NAND FLASH里面的整个uboot拷贝到64Mbyte大小的RAM里面,再跳转到
31、RAM执行代码,这样就可以实现从NAND FLASH上启动uboot。从代码可以看出,uboot2016.01只支持NOR FLASH启动:NAND FLASH不能用它们进行如内存一样的读取操作。NOR Flash具有XIP特点,用户可以直接运行装载在 NOR FLASH 里面的代码,这样可以减少或代替SRAM节约成本。 NAND Flash 没有采取内存的随机读取技术,它的读取是一次读取一块,目前的NAND FLASH通常是一次读取2048个字节,采用这种技术的 Flash价格低廉。用户不能直接运行 NAND Flash 上的代码,因此好多使用 NAND Flash 的开发板除了使用 NAN
32、D Flah 以外,还作上了 一块小的 NOR Flash 来运行启动代码。NOR flash的特点是芯片内执行(XIP, eXecute In Place),这样应用程序可以直接在flash 闪存内运行,不必再把代码读到系统RAM中。NOR的传输效率很高,在14MB图3-4 NAND启动过程Figure3-4 NAND booting procedure的小容量时具有很高的成本效益,但是很低的写入和擦除 速度大大影响了它的性能。NAND FLASH不能像内存一样读,也不能像内存一样写,要实现NAND FLASH启动,则至少需要在重定位时可以读取NAND FLASH上的uboot映像文件到了内
33、存,NAND FLASH的具体操作方式需要参考其芯片手册11。jz2440 v2使用的NAND FLASH为三星的K9F2G08U0M,其芯片手册P32读操作时序图说明了其实现读操作的过程。先向NAND芯片发00h命令,然后按照一定规范发送操作的地址(有的NAND芯片厂家为了兼容后期更大存储空间的芯片,将地址位分为多次发送,这样保证预留了足够的地址范围,K9F2G08U0M的地址需要分5次发送)12,发送完地址之后发送30h命令告知NAND地址发送完毕,延时一段时间即可通过S3C2440的NFDATA寄存器读取数据。假想一下,如果产品实现NAND和NOR双启动。比如手机,在进行系统升级时,NO
34、R 启动作为一个不向普通用户公开的恢复手段,而默认把NAND启动给用户使用。一旦用户进行错误的操作(如刷机、或者升级出错等)时,可以通过NOR 启动来进行手机的恢复,因为NAND启动和NOR启动不可同时进行(S3C2440是如此),NOR启动时可以操作NAND,而NAND启动时并不能对NOR进行操作,这也就保证了NOR FLASH 内数据的安全性。实现NAND、NOR图3-5 NAND、NOR双启动流程Figure3-5 NAND or NOR booting flow双启动流程如图3-5所示13,其实现代码见附录1(Uboot实现NAND、NOR双启动代码)。uboot官方源码里对于S3C2
35、440只支持NOR启动,如何修改代码以实现对NAND启动的支持呢?从前面对NAND和NOR的比较中可以发现,NAND启动时自动将cpu内部的4K SRAM映射到0地址,SRAM是内存,可以直接进行读写,而从NOR启动是NOR的起始地址映射到0地址,NOR可以像内存一般读,但不能像内存一样写。那么就可以通过向0地址写数据,然后读出数据与所写数据进行比较,若相同,则说明写数据成功,为NAND启动,否则为NOR启动14。也可以通过S3C2440芯片手册中内存控制器中的总线位宽控制寄存器BWSCON的DW02:1两位来判断启动方式,DW02:1Indicate data bus width for b
36、ank 0 (read only).01 = 16-bit, 10 = 32-bitThe states are selected by OM1:0 pinsOM1:0为00bin时为Nand Flash Mode,即NAND启动。4 内核移植4.1 内核版本号命名规则到目前为止,Linux内核使用了三种不同的版本编号方式。第一种方式用于1.0版本之前(包括1.0)。第一个版本是0.01,紧接着是0.02、0.03、0.10、0.11、0.12、0.95、0.96、0.97、0.98、0.99和之后的1.0。第二种方式用于1.0之后到2.6,数字由三部分“A.B.C”,A代表主版本号,B代表次
37、主版本号,C代表较小的末版本号。只有在内核发生很大变化时A才变化。通过数字B来判断Linux是否稳定,偶数的B代表稳定版,奇数的B代表开发版。C代表一些bug修复,安全更新,新特性和驱动的次数。第三种方式从2.6.0版本开始,使用“time-based”方式15。3.0版本之前,是一种“A.B.C.D”的格式。七年里,前两个数字A.B即“2.6”保持不变,C随着新版本的发布而增加,D代表一些bug修复,安全更新,添加新特性和驱动的次数。3.0版本之后是“A.B.C”格式,B随着新版本的发布而增加,C代表一些bug修复,安全更新,新特性和驱动的次数。不再使用偶数代表稳定版,奇数代表开发版的命名方
38、式。4.2 Linux内核特点(1) 可移植性强,支持大量硬件平台,支持多种体系架构。可量测性,即可以运行在超级计算机上,也可以运行在很小的设备上(4MBRAM就能满足)。标准化和互用性(Interoperability),遵守标准化和互用性规范。完善的网络支持。安全性,开放源码使缺陷暴露无疑,它的代码也接受了许多专家的审查。稳定性(Stability)和可靠性(Reliability)。模块化(Modularity),运行时可以根据系统的需要加载程序。编程容易,可以学习现有的代码,还可以从网络上找到很多有用的资源16。(2) Linux 内核源码遵守GPL 软件许可,免费开放源码。(3) 基
39、于庞大的Linux 社区和内核源码工程,有各种各样的驱动程序和应用程序可以利用,而没有必要从头写程序。开发者可以免费得到社区的贡献、支持、检查代码和测试。(4) Linux是一个动态内核,支持动态添加或删除软件组件。被称为动态可加载内核模块,它们可以在引导时根据需要(当前特定设备需要这个模块)或在任何时候由用户插入。4.3 编译新版内核注意事项通常,新的内核会支持更多的硬件,具备更好的进程管理能力,运行速度更快、更稳定,并且一般会修复老版本中发现的许多漏洞等,经常性地选择升级更新的系统内核是Linux 使用者的必要操作内容。为正确、合理地设置内核编译配置选项,从而只编译系统需要的功能的代码,一
40、般主要有下面4个考虑:(1)减小内核体积。裁剪定制内核可以减少代码量,运行更快。(2)节省存储空间。内核部分代码存于存储体,定制内核可以使系统拥有更多可用物理内存。(3)减少漏洞。不需要的功能编译进入内核可能会增加被系统攻击者利用的机会。(4)动态加载模块。根据需要动态地加载或者卸载模块,可以节省系统内存。但将某功能编译为模块方式会比编译到内核的方式速度慢。4.4 移植前的准备工作对于嵌入式Linux 系统来说,有各种体系结构的处理器和硬件平台,并且用户需要根据需求自己定制硬件板。只要是硬件平台有些变化,即使非常小,可能也需要做一些移植工作。内核移植是嵌入式Linux系统中最常见的一项工作。内
41、核移植工作主要是修改跟硬件平台相关的代码,一般不涉及Linux 内核通用的程序。移植的难度也取决于两种硬件平台的差异。Linux 对于特定的硬件平台的软件就叫作BSP(Board Support Package)。由于Linux 内核具备可移植性的特点,并且已经支持了各种体系结构的很多种目标板,我们很容易从中找到跟自己硬件类似的目标板。参考内核已经支持的目标板来移植BSP,就如同使用模板开发程序。在开始移植开发板的BSP之前,需要做充分的准备工作。(1)选择参考板选择参考板的原则如下。 参考板与开发板具有相同的处理器,至少类似的处理器; 参考板和开发板具有相同的外围接口电路,至少基本接口相同;
42、 Linux内核已经支持参考板,至少有非官方的补丁或者BSP; 参考板Linux 设备驱动工作正常,至少已经驱动基本接口。通常都可以找到相同处理器的参考板,并且可以获取到Linux 内核源代码。因为半导体商在发布一块新的处理器的时候,一般会为它提供参考设计板和Linux BSP17。即使是一款新的处理器,也可以找到体系结构相同、功能相似的处理器作为参考。还要仔细分析内核代码,弄清楚哪些设备有驱动程序,哪些还没有。如果某个驱动程序还没有支持,就需要我们自己动手写驱动了。(2)编译测试参考板的Linux内核为了确信Linux 对参考板的支持情况,最好验证一下。配置编译Linux 内核,在目标板上运
43、行测试一下。也许最新的Linux 内核版本支持的最好,但是也可能需要在老内核版本上打补丁。可以都测试一下,总之要选择硬件平台支持最好、版本最新的内核。对于交叉开发来说,首先要在顶层Makefile中设置ARCH、CROSS_COMPILE变量,然后选择配置指定的体系结构平台。ARM平台的例子如下。ARCH := armCROSS_COMPILE := arm-linux-EXTRA_VERSION :=可以使用参考板的缺省内核配置,这可以在arch/$(ARCH)/configs目录下找到。以smdk2410为例,arch/arm/configs/smdk2410_defconfig就是缺省文
44、件。执行下列命令使缺省配置生效。$ make smdk2410_defconfig然后打开配置菜单,重新调整配置选项。确认保存配置以后,执行make编译内核。编译完成后,得到的内核映像文件18。内核模块都可以安装到目标板文件系统中,以便加载测试。例如:目标板根文件系统目录是,执行下列命令后,模块都安装到/lib/modules/目录树中。$ make INSTALL_MOD_PATH= modules_install(3)分析参考板的BSP代码如果Linux 内核基本支持这个参考板,那么还要进一步熟悉这部分程序,因为它将是下一步移植的基础和模板。分析平台相关的部分代码实现;分析内核编译组织方式
45、;分析内核启动的初始化程序;分析驱动程序的实现。4.5 开发板内核移植对于内核移植工作来说,主要是添加开发板初始化和驱动程序的代码。1 添加开发板平台支持选项Linux 4.4.8 内核对S3C2440 平台已经支持。平台相关的选项都是在arch/arm目录下实现。也可以通过修改相似平台的相关文件来支持自己的平台。2移植开发板驱动程序S3C2440为SOC,处理器内部包含了串口、显示接口的控制器。这样,参考板上的设备驱动程序多数可以直接使用。不同的开发板使用的内存芯片、闪存、以太网芯片等可能有差异。这就需要阅读芯片手册修改或开发驱动程序。串口驱动程序是最简单的设备驱动程序之一,经过很小改动就能
46、使用。3. Linux内核裁剪linux内核集成了很多功能模块,嵌入式系统本身用于特定环境下,应当去除某些不会使用的功能,既可以减小内核体积亦可以节省存储空间,提高内核处理、运行速度。通过内核配置图形化界面“makemenuconfig”或者修改顶层目录得配置文件.config,保存裁剪后配置信息供内核编译使用19。4. 制作补丁最后使用下面的格式制作成补丁:$diff urN 使用方式为,顶层目录,打补丁:patch -p1 4.6 Linux 内核启动过程Linux 内核启动就是引导内核映像启动的过程。典型的内核映像有zImage、uImage,包含自引导程序和压缩的vmlinux 两部分。启动过程也就是解压和启动vmlinux的过程。启动过程从内核映像入口开始执行,解压vmlinux 并且转换到虚拟地址空间,再调用统一的内核启动函数start_kernel(),从而启动整个Linux 系统。4.6.1 内核自引导uImage映像的入口代码是自引导程序。自引导程序包含一些初始化代码,所以