嵌入式毕业论文

毕业设计(论文)

题 目:

系 别:

专 业:

年 级:

姓 名:

学 号:

指导教师:

摘 要

关键词:U-boot 、内核配置、 根文件系统(rootfs )

随着 ARM 芯片以及LINUX 操作系统的出现,为嵌入式的发展注入了强劲的活力。本设计实现LINUX 操作系统向ARM9平台的移植。U-boot 是系统的启动引导程序,要移植LIUNX 操作系统,U-boot 是必不可少的。LINUX 操作系移植成功后,系统还是不能正常启动的,还需要根文件系统(rootfs )支持,这样系统就可以正常启动。但是嵌入式系统往往是为某些特定的功能设计的,所以,系统要想完成某些功能,还需要顶层应用程序的支持。

Abstract

KEY WORDS :U-boot kernel rootfs

With the ARM chip, as well as the emergence of LINUX operating system for embedded development into a strong vitality. LINUX Operating System Design and Implementation of the ARM9 platform to transplantation. U-boot the system boot process, it is necessary to transplant LIUNX operating system, U-boot is a must. LINUX operating system after a successful transplant, the system still does not start, but also the need for root file system (rootfs) support, so the system can be a normal start. However, for embedded systems is often the function of specific design, so, the system in order to complete certain functions, but also the need for top-level application support.

目 录

第一章 绪论................................................................................................................... 4

第二章 课题任务............................................................................................................ 5

第三章 设计依据............................................................................................................ 6

一. 软件平台的选择.................................................................................................... 6

二. 硬件平台的选择.................................................................................................... 8

三. 应用程序的选择.................................................................................................... 9

第四章 系统规划 ........................................................................................................... 10

一. 系统分析流程 ..................................................................................................... 10

二.LINUX 内核的配置 . ............................................................................................ 12

三. 根文件系统选择.................................................................................................. 14

第五章 设计主体.......................................................................................................... 18

一.ARM-LINUX 交叉工具的制作及安装 .................................................................. 18

二.U-boot 的编译及移植 .......................................................................................... 18

三.LINUX 内核的配置编译及移植 ........................................................................... 20

四.rootfs 的制作及烧写工作 ..................................................................................... 24

五. 应用程序的移植.................................................................................................. 25

第六章 个人体会.......................................................................................................... 26

第七章 附录................................................................................................................. 27

一. 致谢 ................................................................................................................... 27

二. 参考文献 ............................................................................................................ 27

第一章 绪论

随着嵌入式技术的发展,嵌入式的应用领域也越来越广泛。随着IC 设计的发展,出现了工业化ARM 芯片,可以说ARM 是未来嵌入式开发的主宰。ARM 是Advanced RISC Machines 的首字母组合,是一类微型处理器的统称。LINUX 操作系统是目前嵌入式操作系统中主流的操作系统,它不同于WINDOWS,LINUX 操作系统是完全开源的,这就使嵌入式开发过程大大降低了成本。另外,LINUX 操作系统支持多种文件系统,如EXT2、EXT3、MINIX 、VFS 等等。在ARM 开发过程中LINUX 操作系统的开发极为重要, LINUX 下ARM 的BOOTLOAD 、内核、文件系统的裁剪、移植、烧录工作以及针对文件系统进行GUI 的编写任务,最终形成一成功的GUI 界面,成为ARM-LINUX 的开发重点。

本设计选用的bootloader 为U-boot ,经过编译后生成二进制文件,将其烧写到ARM 平台的NAND FLASH中。内核选用LINUX 操作系统LINUX 2.6.14.1版本的内核源码,将其进行修改之后移植到ARM9(S3C2410)的芯片上。文件系统采用busybox 软件包经过修改用cramfs 工具生成.img 映像文件,烧写到NAND FLASH 中。

ARM9系列处理器是英国ARM 公司设计的主流嵌入式处理器,主要包括 ARM9TDMI 和ARM9E-S 等系列。本设计采用韩国三星公司生产的ARM9TDMI ——s3c2410芯片。

以手机应用为例,2G 手机只需提供语音及简单的文字短信功能,而目前的

2.5G 和未来的3G 手机除了提供这两项功能外,还必须提供各种其他的应用功能。主要包括:(1)无线网络设备:手机上网、电子邮件及其他定位服务等功能;

(2)PDA功能:含有用户操作系统(Windows CE、Symbian OS、LINUX 等) 及其他功能;(3)高性能功能:音频播放器、视频电话、手机游戏等。在2.5G 和3G 的应用中ARM9已经全面替代了ARM7。因为ARM9的新特性能够满足各种新需求的同时减少产品研发时间并降低研发费用。

新一代的ARM9处理器,通过全新的设计,采用了更多的晶体管,能够达到两倍以上于ARM7处理器的处理能力。这种处理能力的提高是通过增加时钟频率和减少指令执行周期实现的。

第二章 课题任务

本设计完成LINUX 下ARM 的BOOTLOAD 、内核、文件系统的烧录工作,同时主要针对文件系统进行GUI 的编写任务,最终形成一成功的GUI 界面。

首先,是LINUX 操作系统的内移植。包括内核版本的选择,根文件系统的制作,应用程序的移植等等。在ARM 开发过程中LINUX 操作系统的开发极为重要,本设计完成LINUX 下ARM 的BOOTLOAD 、内核、文件系统的烧录工作,同时主要针对文件系统进行GUI 的编写任务,最终形成一成功的GUI 界面。本设计要求学生掌握S3C2410的基本中断知识,以及与外部液晶通信的相关知识。在设计过程中学生要先了解U-BOOT 、内核、文件系统的大体结构,利用所学知识熟悉对芯片的烧录工作。然后先从顶层对文件系统进行编辑,通过编辑文件系统形成对液晶屏幕的大体设计,本设计要求学生在液晶屏幕上制作一常用设备界面,并且通过挂载键盘驱动实现键盘对液晶的控制。

第三章 设计依据

一. 软件平台的选择

LINUX 系统属于开放源代码软件,由于LINUX 系统具有稳定、安全、网络负载力强、占用硬件资源少等技术特点,自问世以来得到了迅速推广和应用,并已 发展为当今世界的主流的嵌入式操作系统之一。

LINUX 在嵌入式的广泛应用不是偶然的,这就取决于LINUX 操作系统特点。

1、完全免费

LINUX 是一款免费的操作系统,用户可以通过网络或其他途径免费获得,并可以任意修改其源代码。这是其他的操作系统所做不到的。正是由于这一点,来自全世界的无数程序员参与了LINUX 的修改、编写工作,程序员可以根据自己的兴趣和灵感对其进行改变。这让LINUX 吸收了无数程序员的精华,不断壮大。

2、完全兼容POSIX 1.0标准

这使得可以在LINUX 下通过相应的模拟器运行常见的DOS 、Windows 的程序。这为用户从Windows 转到LINUX 奠定了基础。许多用户在考虑使用LINUX 时,就想到以前在Windows 下常见的程序是否能正常运行,这一点就消除了他们的疑虑。

3、多用户、多任务

LINUX 支持多用户,各个用户对于自己的文件设备有自己特殊的权利,保证了各用户之间互不影响。多任务则是现在电脑最主要的一个特点,LINUX 可以使多个程序同时并独立地运行。

4、良好的界面

LINUX 同时具有字符界面和图形界面。在字符界面用户可以通过键盘输入相应的指令来进行操作。它同时也提供了类似Windows 图形界面的X-Windows 系统,用户可以使用鼠标对其进行操作。在X-Windows 环境中就和在Windows 中相似,可以说是一个LINUX 版的Windows 。

5、丰富的网络功能

互联网是在Unix 的基础上繁荣起来的,LINUX 的网络功能当然不会逊色。它的网络功能和其内核紧密相连,在这方面LINUX 要优于其他操作系统。在LINUX 中,用户可以轻松实现网页浏览、文件传输、远程登陆等网络工作。并且可以作为服务器提供WWW 、FTP 、E-Mail 等服务。

6、可靠的安全、稳定性能

LINUX 采取了许多安全技术措施,其中有对读、写进行权限控制、审计跟踪、核心授权等技术,这些都为安全提供了保障。LINUX 由于需要应用到网络服务器,这对稳定性也有比较高的要求,实际上LINUX 在这方面也十分出色。

7、支持多种平台

LINUX 可以运行在多种硬件平台上,如具有x86、680x0、SPARC 、Alpha 等处理器的平台。此外LINUX 还是一种嵌入式操作系统,可以运行在掌上电脑、机顶盒或游戏机上。2001年1月份发布的LINUX 2.4版内核已经能够完全支持Intel 64位芯片架构。同时LINUX 也支持多处理器技术。多个处理器同时工作,使系统性能大大提高。

8、操作系统的低占用率

LINUX 是由内核(kernel )以及在其之上的实用程序构成的,内核负责管理计算机的各种资源,如处理器和内存,而且必须保证合理地分配资源。当 LINUX 启动时,内核被调入内存,并一直驻留在内存中直到关机断电。同大多数的Unix 或者类Unix 系统类似,LINUX 的内核在设计的时候被设计的尽量很小,把许多工作交给内核以外的实用程序执行。通过利用LINUX 这个特点,用户在安装LINUX 的时候可以定制安装的应用程序的多少,在某些情况下用户可以仅安装一个LINUX 的核心。

9、低移植成本低

LINUX 能够在几乎所有的计算机平台上运行,包括PC 、PC 服务器、UNIX 服务器、中型机、大型计算机上,给用户的应用软件在不同的平台之间的移植创造了极为便利的条件。

例如,企业级用户随着业务的不断增长,硬件平台从小型的PC 服务器升级到较高端的UNIX 服务器,甚至更高端的中型机或大型机的情况是极为常见的。过去,由于PC 服务器使用的是Windows 操作系统,而UNIX 服务器使用的操作系统,中型机和大型机使用的是厂商提供的专用系统,所以在不同的平台之间的软件移植,可能会发生中间件软件的版本更换,应用软件的重新编译,甚至是应用软件源代码的修改,很可能需要比较大的人力物力的投入,而如果采用了LINUX 操作系统,不同平台之间的移植就会容易的多。

综合LINUX 的以上优点,本设计的软件平台采用Ubuntu LINUX 8.10作为主机(host )的开发平台。

LINUX 系统内核选用2.6版本的内核LINUX-2.6.14.1。因为LINUX 系统2.6版本的内核自2003推出至今,一直在不断升级,小版本号一直在变化,选用这款2.6.14.1的内核是因为其移植较最新版本的内核移植过程更为复杂,使我在一直过程中更能深一步了解移植的过程,学到更多的经验,故而选择这款内核。

文件系统的选择是具有通用性质的,我在这里选用busybox 工具集。熟悉LINUX 的人对busybox 一定不陌生,它被非常形象地成为嵌入式LINUX 系统的“瑞士军刀”,因为它将许多常用的UNIX(LINUX的前身) 命令和工具集合到了一个单独的可执行程序当中,这样就为文件系统的移植提供了很大的方便。这些常用的命令对于嵌入式系统而言已经足够了,所以选用busybox 软件包制作文系统。

二. 硬件平台的选择

硬件平台选用韩国三星公司的ARM9处理器——S3C2410,S3C2410处理器是Samsung 公司基于ARM 公司的ARM920T 处理器核,采用0.18um 制造工艺的32位微控制器。该处理器拥有:独立的16KB 指令Cache 和16KB 数据Cache ,MMU ,支持TFT 的LCD 控制器,NAND 闪存控制器,3路UART ,4路DMA ,4路带PWM 的Timer ,I/O口,RTC ,8路10位ADC ,Touch Screen接口,IIC-BUS 接口,IIS-BUS 接口,2个USB 主机,1个USB 设备,SD 主机和MMC 接口,2路SPI 。S3C2410处理器最高可运行在203MHz 。而且s3c2410的价格比较便宜,在实十几美元左右,可以说是物美价廉。

核心板的尺寸仅相当于名片的2/3大小,尺寸如此小巧的嵌入式核心板是国内首创。开发商可以充分发挥想象力,设计制造出小体积,高性能的嵌入式应用产品。

(1)S3C2410芯片集成了大量的功能单元,包括:

◆ 内部1.8V ,存储器3.3V ,外部I/O3.3V,16KB 数据Cache ,16KB

指令Cache ,MMU 。

◆ 内置外部存储器控制器(SDRAM 控制和芯片选择逻辑)。

◆ LCD 控制器,一个LCD 专业DMA 。

◆ 4个带外部请求线的DMA 。

◆ 3个通用异步串行端口(IrDA1.0,16-Byte Tx FIFO and 16-Byte Rx

FIFO ),2通道SPI

◆ 一个多主I2C 总线,一个I2S 总线控制器。

◆ SD 主接口版本1.0和多媒体卡协议版本2.11兼容。

◆ 两个USB HOST,一个USB DEVICE(VER1.1)。

◆ 4个PWM 定时器和一个内部定时器。

◆ 看门狗定时器。

◆ 117个通用I/O。

◆ 56个中断源。

◆ 24个外部中断。

◆ 电源控制模式:标准、慢速、休眠、掉电。

◆ 8通道10位ADC 和触摸屏接口。

◆ 带日历功能的实时时钟。

◆ 芯片内置PLL 。

◆ 设计用于手持设备和通用嵌入式系统。

◆ 16/32位RISC 体系结构,使用ARM920T CPU核的强大指令集。 ◆ 带MMU 的先进的体系结构支持WinCE 、EPOC32、LINUX 。

◆ 指令缓存(Cache )、数据缓存、写缓存和物理地址TAG RAM ,减

小了对主存储器带宽和性能的影响。

◆ ARM920T CPU核支持ARM 调试的体系结构。

◆ 内部先进的位控制器总线(AMBA )(AMBA2.0,AHB/APB)。

(2)系统管理

◆ 小端/大端支持

◆ 地址空间:每个BANK128MB (全部为1GB )。

由于ARM9芯片的功能强大,管脚丰富,开发资源丰富,在综合其价位,决定选用三星公司的这款s3c2410芯片作为硬件平台。

三. 应用程序的选择

应用程序是简单的MP3播放器移植,这里做的工作主要是系统的搭建,应用程序只是作为检测系统而作的辅助工作。以此证明系统的可靠、安全、稳定的性质。

第四章 系统规划

一. 系统分析流程

图4-1

从系统的流程图可以看出,U-Boot 是系统构建的第一步。

U-Boot ,全称Universal Boot Loader,是遵循GPL 条款的开放源码项目。从FADSROM 、8xxROM 、PPCBOOT 逐步发展演化而来。其源码目录、编译形式与LINUX 内 核很相似,事实上,不少U-Boot 源码就是相应的LINUX 内核源程序的简化,尤其是一些设备的驱动程序,这从U-Boot 源码的注释中能体现这一点。 但是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 的一层含义。另外一层含义则是U-Boot 除了支持PowerPC 系列的处理器外,还能支持MIPS 、 x86、ARM 、NIOS 、XScale 等诸多常用系列的处理器。

以上两个特点正是U-Boot 项目的开发目标,即支持尽可能多的嵌入式处理器和嵌入式操作 系统。就目前来看,U-Boot 对PowerPC 系列处理器支持最为丰富,对LINUX 的支持最完善。其它系列的处理器和操作系统基本是在2002年11 月PPCBOOT 改名为U-Boot 后逐步扩充的。从PPCBOOT 向U-Boot 的顺利过渡,很大程度上归功于U-Boot 的维护人德国DENX 软件工 程中心Wolfgang Denk[以下简称W.D]本人精湛专业水平和持着不懈的努力。当前,U-Boot 项目正在他的领军之下,众多有志于开放源码BOOT LOADER 移植工作的嵌入式开

发人员正如火如荼地将各个不同系列嵌入式处理器的移植工作不断展开和深入,以支持更多的嵌入式操作系统的装载与引导。

选择U-Boot 的理由:

1. 开放源码;

2. 支持多种嵌入式操作系统内核,如LINUX 、NetBSD, VxWorks, QNX, RTEMS, ARTOS, LynxOS;

3. 支持多个处理器系列,如PowerPC 、ARM 、x86、MIPS 、XScale ;④ 较高的可靠性和稳定性;

4. 较高的可靠性和稳定性;

5. 高度灵活的功能设置,适合U-Boot 调试、操作系统不同引导要求、产品发布等;

6. 丰富的设备驱动源码,如串口、以太网、SDRAM 、FLASH 、LCD 、NVRAM 、EEPROM 、RTC 、键盘等;

7. 较为丰富的开发调试文档与强大的网络技术支持;

U-Boot 主要目录结构

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

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

测;- cpu 与处理器相关的文件。如mpc8xx 子目录下含串口、网口、

LCD 驱动及中断初始化等文件;

- driver 通用设备驱动,如CFI FLASH驱动(目前对INTEL FLASH支持较

好)- doc U-Boot的说明文档;

- examples可在U-Boot 下运行的示例程序;如hello_world.c,timer.c;- 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 镜像文件的工具;

U-Boot 支持的主要功能

U-Boot 可支持的主要功能列表系统引导 支持NFS 挂载、RAMDISK (压缩或非压缩)形式的根文件系统支持NFS 挂载、从FLASH 中引导压缩或非压缩系统内核;基本辅助功能 强大的操作系统接口功能;可灵活设置、传递多个关键

参数给操作系统,适合系统在不同开发阶段的调试要求与产品发布,尤对LINUX 支持最为强劲;支持目标板环境参数多种存储方式,如FLASH 、NVRAM 、EEPROM ;CRC32校验,可校验FLASH 中内核、RAMDISK 镜像文件是否完好;设备驱动 串口、SDRAM 、FLASH 、以太网、LCD 、NVRAM 、EEPROM 、键盘、USB 、PCMCIA 、PCI 、RTC 等驱动支持;上电自检功能 SDRAM 、FLASH 大小自动检测;SDRAM 故障检测;CPU 型号;特殊功能 XIP 内核引导;

因为我们的目标板是arm 体系的平台,所以不能只单纯的用主机(host )上的编译工具直接编译,那样就会造成程序无法运行,最终导致移植工程失败。所以我们将要GCC 编译工具进行改装,生成交叉工具。

下面就是交叉编译工具(arm-LINUX-gcc)的制作流程

二.LINUX 内核的配置

有了U-boot 和交叉编译工具,接下来就要对内核进行配置。

今天的LINUX 是全球被最广泛移植的操作系统内核。从掌上电脑iPAQ 到IBM S/390(一种可以同时跑成千上百个LINUX 的大型电脑),甚至于有人成功的将LINUX 内核在新力出品的游戏机PS2及PS3和微软出品的游戏机Xbox 上4-2交叉编译工具的制作

使用。

LINUX 也是IBM "Blue Gene" Blue Gene的操作系统。直至2008年11月,全球前五百大超级电脑(TOP 500)有高达87.8%的比例采用LINUX 为它们的作业系统,最快的超级电脑IBM_Roadrunner正是采用LINUX 的。

LINUX 目前可以在以下结构上运行:

◆Acorn :Archimedes ,A5000和RiscPC 系列

◆ARC International的 Argonaut RISC Core (ARC)

◆ARM 系列:

◆Atmel AVR32

◆Axis Communications的 ETRAX CRIS

◆Fujitsu FR-V

◆Alpha 系列:

◆Hewlett-Packard 的 Integrity 家族 使用Intel Itanium CPU

◆Renesas Technology(日立的前身)H8 系列

◆Intel IA-64 Itanium, Itanium II

◆IBM 的 S/390(31-bit )

◆IBM 的 zSeries 与 System z9 大型主机(64-bit )

◆x86 系列:

◆三菱的M32R

◆MIPS 架构:

◆Freescale (Motorola 的前身)68K 架构(68020, 68030, 68040, 68060): ◆NEC v850e

◆Power Architecture:

◆PowerPC 系列:

◆SPARC :

◆日立 SuperH :SEGA Dreamcast

◆IBM 的AS/400

◆新力的 Playstation 2

从以上的数据不难看出,LINUX 能够在几乎所有的计算机平台上运行,包括ARM 、X86、PC 、PC 服务器、Atmel 、UNIX 服务器、MIPS 架构、中型机、大型计算机上,给应用软件在不同的平台之间的移植创造了极为便利的条件。而且LINUX 是一款免费的操作系统,用户可以通过网络或其他途径免费获得,并可以任意修改其源代码。这是其他的操作系统所做不到的。正是由于这一点,来自全世界的无数程序员参与了LINUX 的修改、编写工作,程序员可以根据自己

的兴趣和灵感对其进行改变。这让LINUX 吸收了无数程序员的精华,不断壮大。正是因为LINUX 系统支持多种平台,移植性强,而且内核可裁剪等特点,故而选用LINUX 内核。具体到本设计,则选用LINUX-2.6.14.1版本的内核。

以下是LINUX-2.6.14.1版本的内核的配置流程。

4-3 linux 内核配置流程图

三. 根文件系统选择

文件系统是LINUX 操作系统的重要组成部分,LINUX 文件具有强大的功能。文件系统中的文件是数据的集合,文件系统不仅包含着文件中的数据而且还有文件系统的结构,所有LINUX 用户和程序看到的文件、目录、软连接及文件保护信息等都存储在其中。

LINUX 最早的文件系统是Minix ,但是专门为LINUX 设计的文件系统——扩展文件系统第二版或EXT2被设计出来并添加到LINUX 中,这对LINUX 产生了重大影响。EXT2文件系统功能强大、易扩充、性能上进行了全面优化优化,也是现在所以LINUX 发布和安装的标准文件系统类型。

每个实际文件系统从操作系统和系统服务中分离出来,它们之间通过一个接口层:虚拟文件系统或VFS 来通讯。VFS 使得LINUX 可以支持多个不同的文件

系统,每个表示一个VFS 的通用接口。由于软件将LINUX 文件系统的所有细节进行了转换, 所以LINUX 核心的其它部分及系统中运行的程序将看到统一的文件系统。LINUX 的虚拟文件系统允许用户同时能透明地安装许多不同的文件系统。

在LINUX 文件系统中,作为一种特殊类型/proc文件系统只存在内存当中,而不占用外存空间。它以文件系统的方式为访问系统内核数据的操作提供接口。/proc文件系统是一个伪文件系统,用户和应用程序可以通过/proc得到系统的信息,并可以改变内核的某些参数。

在LINUX 文件系统中,EXT2文件系统、虚拟文件系统、/proc文件系统是三个具有代表性的文件系统,本论文试图通过对他们的分析来研究LINUX 文件系统机制。并且在分析这三种文件系统的基础上对LINUX 文件系统操作进行了解、研究(本论文选取了open 和close 两种操作进行研究)。在第二部分中将介绍EXT2文件系统;第三部分论述虚拟文件系统的特点;第四部分简要介绍/proc文件系统;最后,介绍两种具体文件系统操作的实现。就本设计而言,选用LINUX 支持的只读文件系统——Cramfs 文件系统。

Cramfs 是 Compressed Rom File System 的英文缩写,它是LINUX Torvalds 在Transmeta 任职时,所参与开发的文件系统。它是针对LINUX 内核2.4之后的版本所设计的一种新型只读文件系统,采用了zlib 压缩,压缩比一般可以达到1:2,但仍可以作到高效的随机读取,LINUX 系统中,通常把不需要经常修改的目录压缩存放,并在系统引导的时候再将压缩文件解开。因为Cramfs 不会影响系统的读取文件的速度,而且是一个高度压缩的文件系统。因此非常广泛应用于嵌入式系统中。

在嵌入式的环境之下,内存和外存资源都需要节约使用。如果使用RAMDISK 方式来使用文件系统,那么在系统运行之后,首先要把Flash 上的映像文件解压缩到内存中,构造起RAMDISK 环境,才可以开始运行程序。但是它也有很致命的弱点。在正常情况下,同样的代码不仅在Flash 中占据了空间(以压缩后的形式存在) ,而且还在内存中占用了更大的空间(以解压缩之后的形式存在) ,这违背了嵌入式环境下尽量节省资源的要求。

使用CramFS 文件系统就是一种解决这个问题的方式。CramFS 是一个压缩格式的文件系统,它并不需要一次性地将文件系统中的所有内容都解压缩到内存之中,而只是在系统需要访问某个位置的数据的时候,马上计算出该数据在CramFS 中的位置,将它实时地解压缩到内存之中,然后通过对内存的访问来获取文件系统中需要读取的数据。CramFS 中的解压缩以及解压缩之后的内存中数据存放位置都是由CramFS 文件系统本身进行维护的,用户并不需要了解具体的

实现过程,因此这种方式增强了透明度,对开发人员来说,既方便,又节省了存储空间。

一个完整的cramfs 文件系统通常包含以下几个目录:

/LINUXrc 启动脚本文件,由Boot Loader核心命令行确定init=/LINUXrc,

加载/etc目录为ramfs ,(cramfs为只读文件系统) ,拷贝/mnt/etc

到/etc,配置文件目录重新加载根文件系统和/etc文件系统, 执行

init 进程。

/bin 引导启动所需的命令或用户可能用的命令。

/sbin 系统管理员服务程序,其中最重要的是供内核初始化之后执行

/sbin/init进程,系统启动时由init 解释并运行/etc/inittab, inittab 将指

导int 去调用一个系统初始化程序/etc/init.d/rcS。

/etc 特定机器的配置文件以及用户数据存放目录,其中的所有内容是在内

核运行后,由LINUXrc 从/mnt/etc拷贝得到的。

/lib 文件系统上的程序所需的动态库。

/dev 驱动程序存放目录,可以在这里存放自己编写的驱动程序。

/usr 用于存放用户程序和配置文件的目录,可以根据需要进行设置。目录

下的/usr/etc/rc.local执行本地所需要的初始化,如安装核心模块,进行

网络,运行应用程序,启动图形界面等。/etc/modules.conf在系统运行

期间自动加载模块。

/mnt 用于设备安装的目录。/mnt/etc/init.d/rcS完成各个文件系统的Mount,

执行/usr/etc/rc.local;通过rcS 可以调动dhcp 程序配置网络。rcS 执行

完以后,就会打开Shell 。

/proc 系统状态文件目录, 目录中的文件可以用于访问有关内核的状态、

计算机的属性、正在运行的进程的状态等信息。尽管 /proc 中的文件

是虚拟的,但它们仍可以使用任何文件编辑器或像'more', 'less' 或 'cat'

这样的程序来查看。

以下是cramfs 文件系统的制作流程:

4-4 根文件系统的制作流程图

第五章 设计主体

一.ARM-LINUX 交叉工具的制作及安装

1. 下载得到crosstools.tar .gz.

2. 把源码包拷贝到一指定目录下,解压:

$ sudo mkdir /usr/local/arm

$ sudo tar jxvf crosstools.tar.gz –C /usr/local/arm

3. 切换到超级用户,进入解压目录,修改demo-arm9tdmi.sh 脚本文件:

(1) 修改软件包下载路径到用户根目录的downloads:

TARBALLS_DIR = $HOME/downloads

(2) 修改生成的交叉工具存放目录:

RESULT_DIR = $HOME/crosstools

将 #eval `cat arm9tdmi.dat gcc-4.1.0-glibc-2.3.2-tls,dat`的“#”去掉。

4. 修改 arm9tdmi.dat 文件

将生成的目标文件名改为 arm-LINUX-, 即: TARGET = arm-LINUX- (3) 修改编译依赖工具为:

5. 执行demo-arm9tdmi.sh 脚本,即:

./ demo-arm9tdmi.sh 这样就生成了交叉工具cross-3.3.2.tar.bz2

6. 将生成的cross-3.3.2.tar .bz2拷贝到/home/fang/local目录下并解压缩:

cp –a /fang/crosstools/cross-3.3.2.tar.bz2 /home/fang/local

cd /home/fang/local

tar jxvf cross-3.3.2.tar.bz2

7. 添加环境变量

sudo vim /etc/profile 在文件的末尾添加如下代码:

export PATH=/home/fang/local/bin/:$PATH 并保存退出。

source /etc/profile 这样交叉编译工具就可以正常使用了。

二.U-boot 的编译及移植

U-boot 是通过GCC 和Makefile 组织编译的,顶层的Makefile 首先可

以定置开发平台的定义,然后递归调用各级子目录下的Makefile ,最终把在终端中输入

编译过的程序链接成U-boot.img 映像。

1.U-boot 的编译

在U-boot 顶层目录中执行 ./make smdk2410_config , make

这两条命令执行后就会生成System.map ,u-boot ,u-boot.bin ,u-boot.srec 四个映像文件,System.map :是u-boot 映像的符号表,u-boot 是u-boot 映像的ELF 格式,u-boot.bin 是u-boot 映像的原始二进制格式,u-boot.srec 是u-boot 映像的S-Record 格式,因为目标板中没有任何系统,所以这里选用u-boot 映像的原始二进制格式文件u-boot.bin 。

2.U-boot 的加载

使用烧写工具将u-boot.bin 烧写到nandflash 中。

(1) 将SJF2410_BIOS.BAT文件中的内容替换成u-boot.bin ,如

sjf2410 /f:u-boot.bin,运行SJF2410_BIOS.BAT ,在窗口中输入 0,回车;

0,回车;

0,回车;如下图:

图5-1 U-boot烧写

这样就将生成的u-boot.bin 烧写到了nandflash 中了。

三.LINUX 内核的配置编译及移植

1. 下载LINUX 内核:LINUX-2.6.14.1.tar .bz2并解压

2. 修改Makefile

找到ARCH 和CROSS_COMPILE,修改 ARCH ?= ARM

CROSS_COMPILE ?= arm-LINUX-

3. 设置nandflash 分区

(1) 修改arch/arm/mach-s3c2410/devc.s

在其中添加

#include

#include

#include

在文件尾添加

/* 为nandflash 划分分区( nand Controller) Static struct mtd_partition partition_info[] ={ {

name : ―boot ’’,

size: 0x00100000,

offset :0x0,

},{

name : ―kernel ’’,

size: 0x00300000,

offset :0x00100000,

},{

name : ―root ’’,

size: 0x02800000,

offset :0x00400000,

},{

name : ―user ’’,

size: 0x01400000,

offset :0x02c00000,

}

};

*/

/*加入nandflash 分区*/

struct s3c2410_platform_nand superlpplatform={ };

注:sets :支持的分区集 nr_set:分区个数

tacls :0, twrph0:30, twrph1:0 sets: &nandset, nr_sets:1,

/*加入nandflash 芯片支持到nandflash 驱动*/

struct_platform_device s3c_device_nand = { };

.name = ―s3c2410-nand ‖, .id = 1,

.num_resources = ARRAY_SIZE(s3c_nand_resource), .resource = s3c_nand_resource, /*添加 nand flash 设备*/ .dev = {

}

.platform_data = &superlpplatform

将文件中与“加入nandflash 芯片支持到nandflash 驱动”相同的部分注释掉,并保存退出。 4. 指定启动时初始化

系统启动时会根据对分区的设置进行初始化配置,所以要对初始化配置进行设置。

vim arch/arm/mach-s3c2410/mach-smdk2410.c

在 static struct platform_device *smdk2410_device[] _initdata 中添加:

&s3c_device-nand, 保存退出。

5. 注释掉 arch/arm/kernel/setup.c 中的prase_tag_cmdline() 中的strcpy()函数。保存退出。 6. 禁止flash ECC 校验

修改drivers/mtd/nand/s3c2410.c

找到s3c2410_nand_init_chip()函数,在该函数的最后一行添加

chip->二次沉默的= NAND_ECC_NONE;

注:因为内核是要通过U-boot 写到nandflash 中,U-boot 通过软件的ECC

算法产生ECC 的校验码与内核校验的ECC 码不同,内核的ECC 码是由s3c2410中的nandflash 控制器产生的,所以禁止ECC 校验。

7. 支持启动时挂载devfs

为了我们的内核支持devfs 以及在启动时并在/bin/init运行之前能自动挂载/dev为devfs 文件系统,需要修改fs/Kconfig文件

vim fs/Kconfig,找到‖menu Pseudo filesystems‖ 添加如下语句:

config DEVFS_FS

bool "/dev file system support (OBSOLETE)" default y

bool "Automatically mount at boot" default y

depends on DEVFS_FS

config DEVFS_MOUNT

保存并退出。 为 .config

执行 cp

arm/arch/configs/smsk2410_defconfig

.config

8. 将arm/arch/configs/smsk2410_defconfig配置文件 拷贝到根目录,重命名

9.执行 make menuconfig,等待弹出界面进行配置。

进入配置界面

Loadable module support--→

Enable loadable module support

Automatic kernel module loading

System Type--→

S3C2410 DMA support

Boot options--→

将“Ddefault kernel command string”配置为: noinitrd

root=/dev/mtdblock2

init=/LINUXrc

console=ttySAC0,115200 rootfstype=jffs2

Root 是根文件系统的分区,console=tt SAC0,115200是将输出终端配置为串口。

rootfstype=jffs2:是所使用的根文件系统类型。

Floating point emulation--→

NWFPE math emulation

支持浮点运算,这是运行二进制文件所必需的。 Memory Technology Devices(MTD)--→

MTD partitioning support

/*支持 mtd 分区,使前面devs.c 里设置的分区有效。*/ /*支持命令行设置 flash 分信息*/

Device Drivers--→

Command line partition table parsing

RAM/ROM/FLASH chip--→

Interface(CFI)probe

Detect flash chips by Common Flash

Detect nonCIF

Support for Intel/Sharp flash chips

Support for AMD/Fujitsu flash chips Support ROM chips in bus mapping NAND Flash Device Drivers--→ NAND Device Support

NAND Flash support for S3C2410/s3c2440 SoC Character devices--→

Nandstandard serial port support S3C2410 RTC Driver

File systems--→

Second extended fs support/*去掉ext2的支持*/ Pseudo file systems--→ /proc file system support

Virtual memory file system support(form shm fs) /dev file system support(OBSOLETE) Automatically mount at boot (NEW) Miscellaneous filesystems--→

JournallingFlash File System v2 (JFFS2) support

[*]JFFS2write-bufferingsupport

Compressed ROM file syetem support(cramfs)

Network Flie System support- NFS file system support

保存退出,会自动生成 .config 文件。

10. 修改arch/arm/kernel/vimLINUX.lsd.S文件,避免编译时出现错误。

将vimLINUX.lsd.S 文件的最后两行注释掉就可以了。如:

/*ASSERT((__proc_info__end __proc_info_begin),‖miss CPU support‖)*/ /*ASSERT((__arch_info_end __arch_info_begin),‖no machine record defined ‖)*/

11. 编译生成内核映像文件zImage

执行make zImage,会自动生成zImage 文件,放在arch/arm/boot目录下。 12.zImage 的烧写

使用windows 下的超级终端或者串口工具DNW 启动uboot ,执行

#tftp 30008000 zImage #nand erase 100000 300000

#nand write 30008000 100000 300000 #saveenv

四.rootfs 的制作及烧写工作

1. 下载busybox —1.00,tar .gz, 并解压。 2. 修改Makefile

找到ARCH 和CROSS_COMPILE,修改

ARCH ?= ARM

CROSS_COMPILE ?= arm-LINUX-

3. make menuconfig进行配置

因为是做实验用,所以尽量支持更多的命令,所以默认配置就可以了。

4. make install进行安装

5. 进入安装目录“_install/bin”, 创建文件系统的目录,查看所依赖的库文

件,

Arm-LINUX-readelf –d busybox Mkdir lib

将所有依赖的库文件拷贝到lib 下。注意,拷贝的时候一定要加“-a ”,这样会保留库的原有依赖关系,避免编译出错。还要注意的是要将ld —2.3.2.so 和

Ld —LINUX.so.2, 因为链接文件必须通过这两个库找到源文件。

6. 建立设备文件目录及文件

Mkdir etc

将 /etc 下的原有设备文件直接考到这个自己创建的etc 下,删除硬盘的设备文件,因为目标板是NAND FLASH , 不需要硬盘文件。创建nandflash 文件:

Mknod mtdblock0 b 31 0 Mknod mtdblock1 b 31 1 Mknod mtdblock2 b 31 2 Mknod mtdblock3 b 31 3

7.image 制作及烧写

使用cramfs 镜像生成工具生成rootfs.cramfs ,如果所使用的文件系统目录为roofs ,方法如下: #mkcramfs _install rootfs.cramfs 后设置bootargs,

#setenv #saveenv

#tftp 30008000 rootfs.jffs2 #nand erase 400000 2800000

#nand write.jffs2 30008000 400000 2800000

五. 应用程序的移植

1. 拿到源码后解压。

2. 执行 ./configure 生成makefile 文件

3. 修改makefile 文件,将编译器改为arm-LINUX-gcc 。 4. 加载到nand flash。

bootargs

noinitrd

root=/dev/mtdblock2

init=/linuxrc

console=ttySAC0,115200

经过以上五大步,一个完整的系统就做好了。

第六章 个人体会

在指导老师耐心指导下,我经过近四个月的努力,顺利地完成了此次的毕业设计。从这个毕业设计的制作过程中,我学到了不少知识,经历了很多,也体会到了很多,有人说过结果不是最重要的,最重要的过程。

这个设计是完成LINUX 下arm 的交互开发工作。从硬件平台的选择、操作系统内核版本的选择、操作系统的内核移植、文件系统的制作,一直到应用程序的移植,都在老师的精心指导下完成,是我对嵌入式操作系统的开发有了更为深刻的认识。多动手,多用心,在过程中学习,在错误中进取,才能有收获,这是我这近四个月来总结出的学习方法,我坚信,在今后的学习和工作中,这种积极的学习方法会是我受用一生。

第七章 附录

一. 致谢

在毕业设计的过程中,老师给了我很大的支持,张艳存老师,李宝栋老师,在这里由衷的感谢他们。还有和我一起的同学们, 也由衷的感谢他们的支持。 二. 参考文献

【1】《ARM 体系结构与编程》-北京 清华大学出版社-杜春雷 编著 2003.2。 【2】《C 、C++程序设计教程》(第二版)-北京 清华大学出版社-陈雷 雷宏

洲 张莉 编著 2007.2

【3】《C 程序设计语言》(第2版·新版)-机械工业出版社 徐宝文 李志 译

2004.1

【4】The C Programming Language Second Edition Brian W.Kernighan

Dennis M.Ritchie

【5】《s3c2410xUser's Manial》-microprocessor Revision 1.0 Samsung 【6】《嵌入式Linux 驱动程序设计从入门到精通》-北京 清华大学出版社 冯

国进 2880.3

【7】《嵌入式设计及Linux 开发指南-基于Arm9处理器》(第二版)-电子工

业出版社 袁文菊 孙天泽 2006.1

【8】《C 语言程序设计第二版》-机械工程出版社 【9】《LINUX 内核移植》

【10】《LINUX 下的C 语言程序设计》-清华大学出版社

毕业设计(论文)

题 目:

系 别:

专 业:

年 级:

姓 名:

学 号:

指导教师:

摘 要

关键词:U-boot 、内核配置、 根文件系统(rootfs )

随着 ARM 芯片以及LINUX 操作系统的出现,为嵌入式的发展注入了强劲的活力。本设计实现LINUX 操作系统向ARM9平台的移植。U-boot 是系统的启动引导程序,要移植LIUNX 操作系统,U-boot 是必不可少的。LINUX 操作系移植成功后,系统还是不能正常启动的,还需要根文件系统(rootfs )支持,这样系统就可以正常启动。但是嵌入式系统往往是为某些特定的功能设计的,所以,系统要想完成某些功能,还需要顶层应用程序的支持。

Abstract

KEY WORDS :U-boot kernel rootfs

With the ARM chip, as well as the emergence of LINUX operating system for embedded development into a strong vitality. LINUX Operating System Design and Implementation of the ARM9 platform to transplantation. U-boot the system boot process, it is necessary to transplant LIUNX operating system, U-boot is a must. LINUX operating system after a successful transplant, the system still does not start, but also the need for root file system (rootfs) support, so the system can be a normal start. However, for embedded systems is often the function of specific design, so, the system in order to complete certain functions, but also the need for top-level application support.

目 录

第一章 绪论................................................................................................................... 4

第二章 课题任务............................................................................................................ 5

第三章 设计依据............................................................................................................ 6

一. 软件平台的选择.................................................................................................... 6

二. 硬件平台的选择.................................................................................................... 8

三. 应用程序的选择.................................................................................................... 9

第四章 系统规划 ........................................................................................................... 10

一. 系统分析流程 ..................................................................................................... 10

二.LINUX 内核的配置 . ............................................................................................ 12

三. 根文件系统选择.................................................................................................. 14

第五章 设计主体.......................................................................................................... 18

一.ARM-LINUX 交叉工具的制作及安装 .................................................................. 18

二.U-boot 的编译及移植 .......................................................................................... 18

三.LINUX 内核的配置编译及移植 ........................................................................... 20

四.rootfs 的制作及烧写工作 ..................................................................................... 24

五. 应用程序的移植.................................................................................................. 25

第六章 个人体会.......................................................................................................... 26

第七章 附录................................................................................................................. 27

一. 致谢 ................................................................................................................... 27

二. 参考文献 ............................................................................................................ 27

第一章 绪论

随着嵌入式技术的发展,嵌入式的应用领域也越来越广泛。随着IC 设计的发展,出现了工业化ARM 芯片,可以说ARM 是未来嵌入式开发的主宰。ARM 是Advanced RISC Machines 的首字母组合,是一类微型处理器的统称。LINUX 操作系统是目前嵌入式操作系统中主流的操作系统,它不同于WINDOWS,LINUX 操作系统是完全开源的,这就使嵌入式开发过程大大降低了成本。另外,LINUX 操作系统支持多种文件系统,如EXT2、EXT3、MINIX 、VFS 等等。在ARM 开发过程中LINUX 操作系统的开发极为重要, LINUX 下ARM 的BOOTLOAD 、内核、文件系统的裁剪、移植、烧录工作以及针对文件系统进行GUI 的编写任务,最终形成一成功的GUI 界面,成为ARM-LINUX 的开发重点。

本设计选用的bootloader 为U-boot ,经过编译后生成二进制文件,将其烧写到ARM 平台的NAND FLASH中。内核选用LINUX 操作系统LINUX 2.6.14.1版本的内核源码,将其进行修改之后移植到ARM9(S3C2410)的芯片上。文件系统采用busybox 软件包经过修改用cramfs 工具生成.img 映像文件,烧写到NAND FLASH 中。

ARM9系列处理器是英国ARM 公司设计的主流嵌入式处理器,主要包括 ARM9TDMI 和ARM9E-S 等系列。本设计采用韩国三星公司生产的ARM9TDMI ——s3c2410芯片。

以手机应用为例,2G 手机只需提供语音及简单的文字短信功能,而目前的

2.5G 和未来的3G 手机除了提供这两项功能外,还必须提供各种其他的应用功能。主要包括:(1)无线网络设备:手机上网、电子邮件及其他定位服务等功能;

(2)PDA功能:含有用户操作系统(Windows CE、Symbian OS、LINUX 等) 及其他功能;(3)高性能功能:音频播放器、视频电话、手机游戏等。在2.5G 和3G 的应用中ARM9已经全面替代了ARM7。因为ARM9的新特性能够满足各种新需求的同时减少产品研发时间并降低研发费用。

新一代的ARM9处理器,通过全新的设计,采用了更多的晶体管,能够达到两倍以上于ARM7处理器的处理能力。这种处理能力的提高是通过增加时钟频率和减少指令执行周期实现的。

第二章 课题任务

本设计完成LINUX 下ARM 的BOOTLOAD 、内核、文件系统的烧录工作,同时主要针对文件系统进行GUI 的编写任务,最终形成一成功的GUI 界面。

首先,是LINUX 操作系统的内移植。包括内核版本的选择,根文件系统的制作,应用程序的移植等等。在ARM 开发过程中LINUX 操作系统的开发极为重要,本设计完成LINUX 下ARM 的BOOTLOAD 、内核、文件系统的烧录工作,同时主要针对文件系统进行GUI 的编写任务,最终形成一成功的GUI 界面。本设计要求学生掌握S3C2410的基本中断知识,以及与外部液晶通信的相关知识。在设计过程中学生要先了解U-BOOT 、内核、文件系统的大体结构,利用所学知识熟悉对芯片的烧录工作。然后先从顶层对文件系统进行编辑,通过编辑文件系统形成对液晶屏幕的大体设计,本设计要求学生在液晶屏幕上制作一常用设备界面,并且通过挂载键盘驱动实现键盘对液晶的控制。

第三章 设计依据

一. 软件平台的选择

LINUX 系统属于开放源代码软件,由于LINUX 系统具有稳定、安全、网络负载力强、占用硬件资源少等技术特点,自问世以来得到了迅速推广和应用,并已 发展为当今世界的主流的嵌入式操作系统之一。

LINUX 在嵌入式的广泛应用不是偶然的,这就取决于LINUX 操作系统特点。

1、完全免费

LINUX 是一款免费的操作系统,用户可以通过网络或其他途径免费获得,并可以任意修改其源代码。这是其他的操作系统所做不到的。正是由于这一点,来自全世界的无数程序员参与了LINUX 的修改、编写工作,程序员可以根据自己的兴趣和灵感对其进行改变。这让LINUX 吸收了无数程序员的精华,不断壮大。

2、完全兼容POSIX 1.0标准

这使得可以在LINUX 下通过相应的模拟器运行常见的DOS 、Windows 的程序。这为用户从Windows 转到LINUX 奠定了基础。许多用户在考虑使用LINUX 时,就想到以前在Windows 下常见的程序是否能正常运行,这一点就消除了他们的疑虑。

3、多用户、多任务

LINUX 支持多用户,各个用户对于自己的文件设备有自己特殊的权利,保证了各用户之间互不影响。多任务则是现在电脑最主要的一个特点,LINUX 可以使多个程序同时并独立地运行。

4、良好的界面

LINUX 同时具有字符界面和图形界面。在字符界面用户可以通过键盘输入相应的指令来进行操作。它同时也提供了类似Windows 图形界面的X-Windows 系统,用户可以使用鼠标对其进行操作。在X-Windows 环境中就和在Windows 中相似,可以说是一个LINUX 版的Windows 。

5、丰富的网络功能

互联网是在Unix 的基础上繁荣起来的,LINUX 的网络功能当然不会逊色。它的网络功能和其内核紧密相连,在这方面LINUX 要优于其他操作系统。在LINUX 中,用户可以轻松实现网页浏览、文件传输、远程登陆等网络工作。并且可以作为服务器提供WWW 、FTP 、E-Mail 等服务。

6、可靠的安全、稳定性能

LINUX 采取了许多安全技术措施,其中有对读、写进行权限控制、审计跟踪、核心授权等技术,这些都为安全提供了保障。LINUX 由于需要应用到网络服务器,这对稳定性也有比较高的要求,实际上LINUX 在这方面也十分出色。

7、支持多种平台

LINUX 可以运行在多种硬件平台上,如具有x86、680x0、SPARC 、Alpha 等处理器的平台。此外LINUX 还是一种嵌入式操作系统,可以运行在掌上电脑、机顶盒或游戏机上。2001年1月份发布的LINUX 2.4版内核已经能够完全支持Intel 64位芯片架构。同时LINUX 也支持多处理器技术。多个处理器同时工作,使系统性能大大提高。

8、操作系统的低占用率

LINUX 是由内核(kernel )以及在其之上的实用程序构成的,内核负责管理计算机的各种资源,如处理器和内存,而且必须保证合理地分配资源。当 LINUX 启动时,内核被调入内存,并一直驻留在内存中直到关机断电。同大多数的Unix 或者类Unix 系统类似,LINUX 的内核在设计的时候被设计的尽量很小,把许多工作交给内核以外的实用程序执行。通过利用LINUX 这个特点,用户在安装LINUX 的时候可以定制安装的应用程序的多少,在某些情况下用户可以仅安装一个LINUX 的核心。

9、低移植成本低

LINUX 能够在几乎所有的计算机平台上运行,包括PC 、PC 服务器、UNIX 服务器、中型机、大型计算机上,给用户的应用软件在不同的平台之间的移植创造了极为便利的条件。

例如,企业级用户随着业务的不断增长,硬件平台从小型的PC 服务器升级到较高端的UNIX 服务器,甚至更高端的中型机或大型机的情况是极为常见的。过去,由于PC 服务器使用的是Windows 操作系统,而UNIX 服务器使用的操作系统,中型机和大型机使用的是厂商提供的专用系统,所以在不同的平台之间的软件移植,可能会发生中间件软件的版本更换,应用软件的重新编译,甚至是应用软件源代码的修改,很可能需要比较大的人力物力的投入,而如果采用了LINUX 操作系统,不同平台之间的移植就会容易的多。

综合LINUX 的以上优点,本设计的软件平台采用Ubuntu LINUX 8.10作为主机(host )的开发平台。

LINUX 系统内核选用2.6版本的内核LINUX-2.6.14.1。因为LINUX 系统2.6版本的内核自2003推出至今,一直在不断升级,小版本号一直在变化,选用这款2.6.14.1的内核是因为其移植较最新版本的内核移植过程更为复杂,使我在一直过程中更能深一步了解移植的过程,学到更多的经验,故而选择这款内核。

文件系统的选择是具有通用性质的,我在这里选用busybox 工具集。熟悉LINUX 的人对busybox 一定不陌生,它被非常形象地成为嵌入式LINUX 系统的“瑞士军刀”,因为它将许多常用的UNIX(LINUX的前身) 命令和工具集合到了一个单独的可执行程序当中,这样就为文件系统的移植提供了很大的方便。这些常用的命令对于嵌入式系统而言已经足够了,所以选用busybox 软件包制作文系统。

二. 硬件平台的选择

硬件平台选用韩国三星公司的ARM9处理器——S3C2410,S3C2410处理器是Samsung 公司基于ARM 公司的ARM920T 处理器核,采用0.18um 制造工艺的32位微控制器。该处理器拥有:独立的16KB 指令Cache 和16KB 数据Cache ,MMU ,支持TFT 的LCD 控制器,NAND 闪存控制器,3路UART ,4路DMA ,4路带PWM 的Timer ,I/O口,RTC ,8路10位ADC ,Touch Screen接口,IIC-BUS 接口,IIS-BUS 接口,2个USB 主机,1个USB 设备,SD 主机和MMC 接口,2路SPI 。S3C2410处理器最高可运行在203MHz 。而且s3c2410的价格比较便宜,在实十几美元左右,可以说是物美价廉。

核心板的尺寸仅相当于名片的2/3大小,尺寸如此小巧的嵌入式核心板是国内首创。开发商可以充分发挥想象力,设计制造出小体积,高性能的嵌入式应用产品。

(1)S3C2410芯片集成了大量的功能单元,包括:

◆ 内部1.8V ,存储器3.3V ,外部I/O3.3V,16KB 数据Cache ,16KB

指令Cache ,MMU 。

◆ 内置外部存储器控制器(SDRAM 控制和芯片选择逻辑)。

◆ LCD 控制器,一个LCD 专业DMA 。

◆ 4个带外部请求线的DMA 。

◆ 3个通用异步串行端口(IrDA1.0,16-Byte Tx FIFO and 16-Byte Rx

FIFO ),2通道SPI

◆ 一个多主I2C 总线,一个I2S 总线控制器。

◆ SD 主接口版本1.0和多媒体卡协议版本2.11兼容。

◆ 两个USB HOST,一个USB DEVICE(VER1.1)。

◆ 4个PWM 定时器和一个内部定时器。

◆ 看门狗定时器。

◆ 117个通用I/O。

◆ 56个中断源。

◆ 24个外部中断。

◆ 电源控制模式:标准、慢速、休眠、掉电。

◆ 8通道10位ADC 和触摸屏接口。

◆ 带日历功能的实时时钟。

◆ 芯片内置PLL 。

◆ 设计用于手持设备和通用嵌入式系统。

◆ 16/32位RISC 体系结构,使用ARM920T CPU核的强大指令集。 ◆ 带MMU 的先进的体系结构支持WinCE 、EPOC32、LINUX 。

◆ 指令缓存(Cache )、数据缓存、写缓存和物理地址TAG RAM ,减

小了对主存储器带宽和性能的影响。

◆ ARM920T CPU核支持ARM 调试的体系结构。

◆ 内部先进的位控制器总线(AMBA )(AMBA2.0,AHB/APB)。

(2)系统管理

◆ 小端/大端支持

◆ 地址空间:每个BANK128MB (全部为1GB )。

由于ARM9芯片的功能强大,管脚丰富,开发资源丰富,在综合其价位,决定选用三星公司的这款s3c2410芯片作为硬件平台。

三. 应用程序的选择

应用程序是简单的MP3播放器移植,这里做的工作主要是系统的搭建,应用程序只是作为检测系统而作的辅助工作。以此证明系统的可靠、安全、稳定的性质。

第四章 系统规划

一. 系统分析流程

图4-1

从系统的流程图可以看出,U-Boot 是系统构建的第一步。

U-Boot ,全称Universal Boot Loader,是遵循GPL 条款的开放源码项目。从FADSROM 、8xxROM 、PPCBOOT 逐步发展演化而来。其源码目录、编译形式与LINUX 内 核很相似,事实上,不少U-Boot 源码就是相应的LINUX 内核源程序的简化,尤其是一些设备的驱动程序,这从U-Boot 源码的注释中能体现这一点。 但是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 的一层含义。另外一层含义则是U-Boot 除了支持PowerPC 系列的处理器外,还能支持MIPS 、 x86、ARM 、NIOS 、XScale 等诸多常用系列的处理器。

以上两个特点正是U-Boot 项目的开发目标,即支持尽可能多的嵌入式处理器和嵌入式操作 系统。就目前来看,U-Boot 对PowerPC 系列处理器支持最为丰富,对LINUX 的支持最完善。其它系列的处理器和操作系统基本是在2002年11 月PPCBOOT 改名为U-Boot 后逐步扩充的。从PPCBOOT 向U-Boot 的顺利过渡,很大程度上归功于U-Boot 的维护人德国DENX 软件工 程中心Wolfgang Denk[以下简称W.D]本人精湛专业水平和持着不懈的努力。当前,U-Boot 项目正在他的领军之下,众多有志于开放源码BOOT LOADER 移植工作的嵌入式开

发人员正如火如荼地将各个不同系列嵌入式处理器的移植工作不断展开和深入,以支持更多的嵌入式操作系统的装载与引导。

选择U-Boot 的理由:

1. 开放源码;

2. 支持多种嵌入式操作系统内核,如LINUX 、NetBSD, VxWorks, QNX, RTEMS, ARTOS, LynxOS;

3. 支持多个处理器系列,如PowerPC 、ARM 、x86、MIPS 、XScale ;④ 较高的可靠性和稳定性;

4. 较高的可靠性和稳定性;

5. 高度灵活的功能设置,适合U-Boot 调试、操作系统不同引导要求、产品发布等;

6. 丰富的设备驱动源码,如串口、以太网、SDRAM 、FLASH 、LCD 、NVRAM 、EEPROM 、RTC 、键盘等;

7. 较为丰富的开发调试文档与强大的网络技术支持;

U-Boot 主要目录结构

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

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

测;- cpu 与处理器相关的文件。如mpc8xx 子目录下含串口、网口、

LCD 驱动及中断初始化等文件;

- driver 通用设备驱动,如CFI FLASH驱动(目前对INTEL FLASH支持较

好)- doc U-Boot的说明文档;

- examples可在U-Boot 下运行的示例程序;如hello_world.c,timer.c;- 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 镜像文件的工具;

U-Boot 支持的主要功能

U-Boot 可支持的主要功能列表系统引导 支持NFS 挂载、RAMDISK (压缩或非压缩)形式的根文件系统支持NFS 挂载、从FLASH 中引导压缩或非压缩系统内核;基本辅助功能 强大的操作系统接口功能;可灵活设置、传递多个关键

参数给操作系统,适合系统在不同开发阶段的调试要求与产品发布,尤对LINUX 支持最为强劲;支持目标板环境参数多种存储方式,如FLASH 、NVRAM 、EEPROM ;CRC32校验,可校验FLASH 中内核、RAMDISK 镜像文件是否完好;设备驱动 串口、SDRAM 、FLASH 、以太网、LCD 、NVRAM 、EEPROM 、键盘、USB 、PCMCIA 、PCI 、RTC 等驱动支持;上电自检功能 SDRAM 、FLASH 大小自动检测;SDRAM 故障检测;CPU 型号;特殊功能 XIP 内核引导;

因为我们的目标板是arm 体系的平台,所以不能只单纯的用主机(host )上的编译工具直接编译,那样就会造成程序无法运行,最终导致移植工程失败。所以我们将要GCC 编译工具进行改装,生成交叉工具。

下面就是交叉编译工具(arm-LINUX-gcc)的制作流程

二.LINUX 内核的配置

有了U-boot 和交叉编译工具,接下来就要对内核进行配置。

今天的LINUX 是全球被最广泛移植的操作系统内核。从掌上电脑iPAQ 到IBM S/390(一种可以同时跑成千上百个LINUX 的大型电脑),甚至于有人成功的将LINUX 内核在新力出品的游戏机PS2及PS3和微软出品的游戏机Xbox 上4-2交叉编译工具的制作

使用。

LINUX 也是IBM "Blue Gene" Blue Gene的操作系统。直至2008年11月,全球前五百大超级电脑(TOP 500)有高达87.8%的比例采用LINUX 为它们的作业系统,最快的超级电脑IBM_Roadrunner正是采用LINUX 的。

LINUX 目前可以在以下结构上运行:

◆Acorn :Archimedes ,A5000和RiscPC 系列

◆ARC International的 Argonaut RISC Core (ARC)

◆ARM 系列:

◆Atmel AVR32

◆Axis Communications的 ETRAX CRIS

◆Fujitsu FR-V

◆Alpha 系列:

◆Hewlett-Packard 的 Integrity 家族 使用Intel Itanium CPU

◆Renesas Technology(日立的前身)H8 系列

◆Intel IA-64 Itanium, Itanium II

◆IBM 的 S/390(31-bit )

◆IBM 的 zSeries 与 System z9 大型主机(64-bit )

◆x86 系列:

◆三菱的M32R

◆MIPS 架构:

◆Freescale (Motorola 的前身)68K 架构(68020, 68030, 68040, 68060): ◆NEC v850e

◆Power Architecture:

◆PowerPC 系列:

◆SPARC :

◆日立 SuperH :SEGA Dreamcast

◆IBM 的AS/400

◆新力的 Playstation 2

从以上的数据不难看出,LINUX 能够在几乎所有的计算机平台上运行,包括ARM 、X86、PC 、PC 服务器、Atmel 、UNIX 服务器、MIPS 架构、中型机、大型计算机上,给应用软件在不同的平台之间的移植创造了极为便利的条件。而且LINUX 是一款免费的操作系统,用户可以通过网络或其他途径免费获得,并可以任意修改其源代码。这是其他的操作系统所做不到的。正是由于这一点,来自全世界的无数程序员参与了LINUX 的修改、编写工作,程序员可以根据自己

的兴趣和灵感对其进行改变。这让LINUX 吸收了无数程序员的精华,不断壮大。正是因为LINUX 系统支持多种平台,移植性强,而且内核可裁剪等特点,故而选用LINUX 内核。具体到本设计,则选用LINUX-2.6.14.1版本的内核。

以下是LINUX-2.6.14.1版本的内核的配置流程。

4-3 linux 内核配置流程图

三. 根文件系统选择

文件系统是LINUX 操作系统的重要组成部分,LINUX 文件具有强大的功能。文件系统中的文件是数据的集合,文件系统不仅包含着文件中的数据而且还有文件系统的结构,所有LINUX 用户和程序看到的文件、目录、软连接及文件保护信息等都存储在其中。

LINUX 最早的文件系统是Minix ,但是专门为LINUX 设计的文件系统——扩展文件系统第二版或EXT2被设计出来并添加到LINUX 中,这对LINUX 产生了重大影响。EXT2文件系统功能强大、易扩充、性能上进行了全面优化优化,也是现在所以LINUX 发布和安装的标准文件系统类型。

每个实际文件系统从操作系统和系统服务中分离出来,它们之间通过一个接口层:虚拟文件系统或VFS 来通讯。VFS 使得LINUX 可以支持多个不同的文件

系统,每个表示一个VFS 的通用接口。由于软件将LINUX 文件系统的所有细节进行了转换, 所以LINUX 核心的其它部分及系统中运行的程序将看到统一的文件系统。LINUX 的虚拟文件系统允许用户同时能透明地安装许多不同的文件系统。

在LINUX 文件系统中,作为一种特殊类型/proc文件系统只存在内存当中,而不占用外存空间。它以文件系统的方式为访问系统内核数据的操作提供接口。/proc文件系统是一个伪文件系统,用户和应用程序可以通过/proc得到系统的信息,并可以改变内核的某些参数。

在LINUX 文件系统中,EXT2文件系统、虚拟文件系统、/proc文件系统是三个具有代表性的文件系统,本论文试图通过对他们的分析来研究LINUX 文件系统机制。并且在分析这三种文件系统的基础上对LINUX 文件系统操作进行了解、研究(本论文选取了open 和close 两种操作进行研究)。在第二部分中将介绍EXT2文件系统;第三部分论述虚拟文件系统的特点;第四部分简要介绍/proc文件系统;最后,介绍两种具体文件系统操作的实现。就本设计而言,选用LINUX 支持的只读文件系统——Cramfs 文件系统。

Cramfs 是 Compressed Rom File System 的英文缩写,它是LINUX Torvalds 在Transmeta 任职时,所参与开发的文件系统。它是针对LINUX 内核2.4之后的版本所设计的一种新型只读文件系统,采用了zlib 压缩,压缩比一般可以达到1:2,但仍可以作到高效的随机读取,LINUX 系统中,通常把不需要经常修改的目录压缩存放,并在系统引导的时候再将压缩文件解开。因为Cramfs 不会影响系统的读取文件的速度,而且是一个高度压缩的文件系统。因此非常广泛应用于嵌入式系统中。

在嵌入式的环境之下,内存和外存资源都需要节约使用。如果使用RAMDISK 方式来使用文件系统,那么在系统运行之后,首先要把Flash 上的映像文件解压缩到内存中,构造起RAMDISK 环境,才可以开始运行程序。但是它也有很致命的弱点。在正常情况下,同样的代码不仅在Flash 中占据了空间(以压缩后的形式存在) ,而且还在内存中占用了更大的空间(以解压缩之后的形式存在) ,这违背了嵌入式环境下尽量节省资源的要求。

使用CramFS 文件系统就是一种解决这个问题的方式。CramFS 是一个压缩格式的文件系统,它并不需要一次性地将文件系统中的所有内容都解压缩到内存之中,而只是在系统需要访问某个位置的数据的时候,马上计算出该数据在CramFS 中的位置,将它实时地解压缩到内存之中,然后通过对内存的访问来获取文件系统中需要读取的数据。CramFS 中的解压缩以及解压缩之后的内存中数据存放位置都是由CramFS 文件系统本身进行维护的,用户并不需要了解具体的

实现过程,因此这种方式增强了透明度,对开发人员来说,既方便,又节省了存储空间。

一个完整的cramfs 文件系统通常包含以下几个目录:

/LINUXrc 启动脚本文件,由Boot Loader核心命令行确定init=/LINUXrc,

加载/etc目录为ramfs ,(cramfs为只读文件系统) ,拷贝/mnt/etc

到/etc,配置文件目录重新加载根文件系统和/etc文件系统, 执行

init 进程。

/bin 引导启动所需的命令或用户可能用的命令。

/sbin 系统管理员服务程序,其中最重要的是供内核初始化之后执行

/sbin/init进程,系统启动时由init 解释并运行/etc/inittab, inittab 将指

导int 去调用一个系统初始化程序/etc/init.d/rcS。

/etc 特定机器的配置文件以及用户数据存放目录,其中的所有内容是在内

核运行后,由LINUXrc 从/mnt/etc拷贝得到的。

/lib 文件系统上的程序所需的动态库。

/dev 驱动程序存放目录,可以在这里存放自己编写的驱动程序。

/usr 用于存放用户程序和配置文件的目录,可以根据需要进行设置。目录

下的/usr/etc/rc.local执行本地所需要的初始化,如安装核心模块,进行

网络,运行应用程序,启动图形界面等。/etc/modules.conf在系统运行

期间自动加载模块。

/mnt 用于设备安装的目录。/mnt/etc/init.d/rcS完成各个文件系统的Mount,

执行/usr/etc/rc.local;通过rcS 可以调动dhcp 程序配置网络。rcS 执行

完以后,就会打开Shell 。

/proc 系统状态文件目录, 目录中的文件可以用于访问有关内核的状态、

计算机的属性、正在运行的进程的状态等信息。尽管 /proc 中的文件

是虚拟的,但它们仍可以使用任何文件编辑器或像'more', 'less' 或 'cat'

这样的程序来查看。

以下是cramfs 文件系统的制作流程:

4-4 根文件系统的制作流程图

第五章 设计主体

一.ARM-LINUX 交叉工具的制作及安装

1. 下载得到crosstools.tar .gz.

2. 把源码包拷贝到一指定目录下,解压:

$ sudo mkdir /usr/local/arm

$ sudo tar jxvf crosstools.tar.gz –C /usr/local/arm

3. 切换到超级用户,进入解压目录,修改demo-arm9tdmi.sh 脚本文件:

(1) 修改软件包下载路径到用户根目录的downloads:

TARBALLS_DIR = $HOME/downloads

(2) 修改生成的交叉工具存放目录:

RESULT_DIR = $HOME/crosstools

将 #eval `cat arm9tdmi.dat gcc-4.1.0-glibc-2.3.2-tls,dat`的“#”去掉。

4. 修改 arm9tdmi.dat 文件

将生成的目标文件名改为 arm-LINUX-, 即: TARGET = arm-LINUX- (3) 修改编译依赖工具为:

5. 执行demo-arm9tdmi.sh 脚本,即:

./ demo-arm9tdmi.sh 这样就生成了交叉工具cross-3.3.2.tar.bz2

6. 将生成的cross-3.3.2.tar .bz2拷贝到/home/fang/local目录下并解压缩:

cp –a /fang/crosstools/cross-3.3.2.tar.bz2 /home/fang/local

cd /home/fang/local

tar jxvf cross-3.3.2.tar.bz2

7. 添加环境变量

sudo vim /etc/profile 在文件的末尾添加如下代码:

export PATH=/home/fang/local/bin/:$PATH 并保存退出。

source /etc/profile 这样交叉编译工具就可以正常使用了。

二.U-boot 的编译及移植

U-boot 是通过GCC 和Makefile 组织编译的,顶层的Makefile 首先可

以定置开发平台的定义,然后递归调用各级子目录下的Makefile ,最终把在终端中输入

编译过的程序链接成U-boot.img 映像。

1.U-boot 的编译

在U-boot 顶层目录中执行 ./make smdk2410_config , make

这两条命令执行后就会生成System.map ,u-boot ,u-boot.bin ,u-boot.srec 四个映像文件,System.map :是u-boot 映像的符号表,u-boot 是u-boot 映像的ELF 格式,u-boot.bin 是u-boot 映像的原始二进制格式,u-boot.srec 是u-boot 映像的S-Record 格式,因为目标板中没有任何系统,所以这里选用u-boot 映像的原始二进制格式文件u-boot.bin 。

2.U-boot 的加载

使用烧写工具将u-boot.bin 烧写到nandflash 中。

(1) 将SJF2410_BIOS.BAT文件中的内容替换成u-boot.bin ,如

sjf2410 /f:u-boot.bin,运行SJF2410_BIOS.BAT ,在窗口中输入 0,回车;

0,回车;

0,回车;如下图:

图5-1 U-boot烧写

这样就将生成的u-boot.bin 烧写到了nandflash 中了。

三.LINUX 内核的配置编译及移植

1. 下载LINUX 内核:LINUX-2.6.14.1.tar .bz2并解压

2. 修改Makefile

找到ARCH 和CROSS_COMPILE,修改 ARCH ?= ARM

CROSS_COMPILE ?= arm-LINUX-

3. 设置nandflash 分区

(1) 修改arch/arm/mach-s3c2410/devc.s

在其中添加

#include

#include

#include

在文件尾添加

/* 为nandflash 划分分区( nand Controller) Static struct mtd_partition partition_info[] ={ {

name : ―boot ’’,

size: 0x00100000,

offset :0x0,

},{

name : ―kernel ’’,

size: 0x00300000,

offset :0x00100000,

},{

name : ―root ’’,

size: 0x02800000,

offset :0x00400000,

},{

name : ―user ’’,

size: 0x01400000,

offset :0x02c00000,

}

};

*/

/*加入nandflash 分区*/

struct s3c2410_platform_nand superlpplatform={ };

注:sets :支持的分区集 nr_set:分区个数

tacls :0, twrph0:30, twrph1:0 sets: &nandset, nr_sets:1,

/*加入nandflash 芯片支持到nandflash 驱动*/

struct_platform_device s3c_device_nand = { };

.name = ―s3c2410-nand ‖, .id = 1,

.num_resources = ARRAY_SIZE(s3c_nand_resource), .resource = s3c_nand_resource, /*添加 nand flash 设备*/ .dev = {

}

.platform_data = &superlpplatform

将文件中与“加入nandflash 芯片支持到nandflash 驱动”相同的部分注释掉,并保存退出。 4. 指定启动时初始化

系统启动时会根据对分区的设置进行初始化配置,所以要对初始化配置进行设置。

vim arch/arm/mach-s3c2410/mach-smdk2410.c

在 static struct platform_device *smdk2410_device[] _initdata 中添加:

&s3c_device-nand, 保存退出。

5. 注释掉 arch/arm/kernel/setup.c 中的prase_tag_cmdline() 中的strcpy()函数。保存退出。 6. 禁止flash ECC 校验

修改drivers/mtd/nand/s3c2410.c

找到s3c2410_nand_init_chip()函数,在该函数的最后一行添加

chip->二次沉默的= NAND_ECC_NONE;

注:因为内核是要通过U-boot 写到nandflash 中,U-boot 通过软件的ECC

算法产生ECC 的校验码与内核校验的ECC 码不同,内核的ECC 码是由s3c2410中的nandflash 控制器产生的,所以禁止ECC 校验。

7. 支持启动时挂载devfs

为了我们的内核支持devfs 以及在启动时并在/bin/init运行之前能自动挂载/dev为devfs 文件系统,需要修改fs/Kconfig文件

vim fs/Kconfig,找到‖menu Pseudo filesystems‖ 添加如下语句:

config DEVFS_FS

bool "/dev file system support (OBSOLETE)" default y

bool "Automatically mount at boot" default y

depends on DEVFS_FS

config DEVFS_MOUNT

保存并退出。 为 .config

执行 cp

arm/arch/configs/smsk2410_defconfig

.config

8. 将arm/arch/configs/smsk2410_defconfig配置文件 拷贝到根目录,重命名

9.执行 make menuconfig,等待弹出界面进行配置。

进入配置界面

Loadable module support--→

Enable loadable module support

Automatic kernel module loading

System Type--→

S3C2410 DMA support

Boot options--→

将“Ddefault kernel command string”配置为: noinitrd

root=/dev/mtdblock2

init=/LINUXrc

console=ttySAC0,115200 rootfstype=jffs2

Root 是根文件系统的分区,console=tt SAC0,115200是将输出终端配置为串口。

rootfstype=jffs2:是所使用的根文件系统类型。

Floating point emulation--→

NWFPE math emulation

支持浮点运算,这是运行二进制文件所必需的。 Memory Technology Devices(MTD)--→

MTD partitioning support

/*支持 mtd 分区,使前面devs.c 里设置的分区有效。*/ /*支持命令行设置 flash 分信息*/

Device Drivers--→

Command line partition table parsing

RAM/ROM/FLASH chip--→

Interface(CFI)probe

Detect flash chips by Common Flash

Detect nonCIF

Support for Intel/Sharp flash chips

Support for AMD/Fujitsu flash chips Support ROM chips in bus mapping NAND Flash Device Drivers--→ NAND Device Support

NAND Flash support for S3C2410/s3c2440 SoC Character devices--→

Nandstandard serial port support S3C2410 RTC Driver

File systems--→

Second extended fs support/*去掉ext2的支持*/ Pseudo file systems--→ /proc file system support

Virtual memory file system support(form shm fs) /dev file system support(OBSOLETE) Automatically mount at boot (NEW) Miscellaneous filesystems--→

JournallingFlash File System v2 (JFFS2) support

[*]JFFS2write-bufferingsupport

Compressed ROM file syetem support(cramfs)

Network Flie System support- NFS file system support

保存退出,会自动生成 .config 文件。

10. 修改arch/arm/kernel/vimLINUX.lsd.S文件,避免编译时出现错误。

将vimLINUX.lsd.S 文件的最后两行注释掉就可以了。如:

/*ASSERT((__proc_info__end __proc_info_begin),‖miss CPU support‖)*/ /*ASSERT((__arch_info_end __arch_info_begin),‖no machine record defined ‖)*/

11. 编译生成内核映像文件zImage

执行make zImage,会自动生成zImage 文件,放在arch/arm/boot目录下。 12.zImage 的烧写

使用windows 下的超级终端或者串口工具DNW 启动uboot ,执行

#tftp 30008000 zImage #nand erase 100000 300000

#nand write 30008000 100000 300000 #saveenv

四.rootfs 的制作及烧写工作

1. 下载busybox —1.00,tar .gz, 并解压。 2. 修改Makefile

找到ARCH 和CROSS_COMPILE,修改

ARCH ?= ARM

CROSS_COMPILE ?= arm-LINUX-

3. make menuconfig进行配置

因为是做实验用,所以尽量支持更多的命令,所以默认配置就可以了。

4. make install进行安装

5. 进入安装目录“_install/bin”, 创建文件系统的目录,查看所依赖的库文

件,

Arm-LINUX-readelf –d busybox Mkdir lib

将所有依赖的库文件拷贝到lib 下。注意,拷贝的时候一定要加“-a ”,这样会保留库的原有依赖关系,避免编译出错。还要注意的是要将ld —2.3.2.so 和

Ld —LINUX.so.2, 因为链接文件必须通过这两个库找到源文件。

6. 建立设备文件目录及文件

Mkdir etc

将 /etc 下的原有设备文件直接考到这个自己创建的etc 下,删除硬盘的设备文件,因为目标板是NAND FLASH , 不需要硬盘文件。创建nandflash 文件:

Mknod mtdblock0 b 31 0 Mknod mtdblock1 b 31 1 Mknod mtdblock2 b 31 2 Mknod mtdblock3 b 31 3

7.image 制作及烧写

使用cramfs 镜像生成工具生成rootfs.cramfs ,如果所使用的文件系统目录为roofs ,方法如下: #mkcramfs _install rootfs.cramfs 后设置bootargs,

#setenv #saveenv

#tftp 30008000 rootfs.jffs2 #nand erase 400000 2800000

#nand write.jffs2 30008000 400000 2800000

五. 应用程序的移植

1. 拿到源码后解压。

2. 执行 ./configure 生成makefile 文件

3. 修改makefile 文件,将编译器改为arm-LINUX-gcc 。 4. 加载到nand flash。

bootargs

noinitrd

root=/dev/mtdblock2

init=/linuxrc

console=ttySAC0,115200

经过以上五大步,一个完整的系统就做好了。

第六章 个人体会

在指导老师耐心指导下,我经过近四个月的努力,顺利地完成了此次的毕业设计。从这个毕业设计的制作过程中,我学到了不少知识,经历了很多,也体会到了很多,有人说过结果不是最重要的,最重要的过程。

这个设计是完成LINUX 下arm 的交互开发工作。从硬件平台的选择、操作系统内核版本的选择、操作系统的内核移植、文件系统的制作,一直到应用程序的移植,都在老师的精心指导下完成,是我对嵌入式操作系统的开发有了更为深刻的认识。多动手,多用心,在过程中学习,在错误中进取,才能有收获,这是我这近四个月来总结出的学习方法,我坚信,在今后的学习和工作中,这种积极的学习方法会是我受用一生。

第七章 附录

一. 致谢

在毕业设计的过程中,老师给了我很大的支持,张艳存老师,李宝栋老师,在这里由衷的感谢他们。还有和我一起的同学们, 也由衷的感谢他们的支持。 二. 参考文献

【1】《ARM 体系结构与编程》-北京 清华大学出版社-杜春雷 编著 2003.2。 【2】《C 、C++程序设计教程》(第二版)-北京 清华大学出版社-陈雷 雷宏

洲 张莉 编著 2007.2

【3】《C 程序设计语言》(第2版·新版)-机械工业出版社 徐宝文 李志 译

2004.1

【4】The C Programming Language Second Edition Brian W.Kernighan

Dennis M.Ritchie

【5】《s3c2410xUser's Manial》-microprocessor Revision 1.0 Samsung 【6】《嵌入式Linux 驱动程序设计从入门到精通》-北京 清华大学出版社 冯

国进 2880.3

【7】《嵌入式设计及Linux 开发指南-基于Arm9处理器》(第二版)-电子工

业出版社 袁文菊 孙天泽 2006.1

【8】《C 语言程序设计第二版》-机械工程出版社 【9】《LINUX 内核移植》

【10】《LINUX 下的C 语言程序设计》-清华大学出版社


相关文章

  • 嵌入式技术毕业论文
  • 嵌入式技术毕业论文 嵌入式技术毕业论文 题 目 基于ARM嵌入式系统的Socket通信设计 所在学院专业/领域 计算机技术 研究方向 嵌入式技术 嵌入式技术毕业论文 摘 要 嵌入式系统是计算机技术.半导体技术和电子技术的综合体,已经广泛应用 ...查看


  • "嵌入式系统分析"课程论文
  • 2003年度"嵌入式系统分析"课程论文 IC卡公民身份证系统设计方案 基本需求 (1) 每位公民持有一张IC卡公民身份证,电子信息记录公 民姓名.性别.民族.出身年月日.籍贯.出生地.血型.公民 身份证号码.彩色照片等个 ...查看


  • 空间的折叠--嵌入式家具设计研究
  • 学位论文独创性声明 学位论文独创性声明 本人声明所呈交的学位论文是本人在导师指导下进行的研究工作及取得的研究成果.据我所知,除了文中特另tlDi:i以标注和致谢的地方外,论文中不包含其他人已经发表或撰写过的研究成果,也不包含为获得直昌太堂或 ...查看


  • (毕设-4)毕业设计(论文)完成情况登记表
  • 江西理工大学应用科学学院本科毕业设计(论文) 完成情况登记表 姓名 聂建城 专业班级 电信 101 学号 14 指导教师 曾璐 设计(论文)题目 完成 情况 完成开题报告时间 完成第二稿时间 基于 S3C2410 的火灾报警系统设计 201 ...查看


  • 电子信息工程专业人才培养方案
  • 电子信息工程专业人才培养方案 发布时间:2015-06-24 浏览次数: 1.培养目标 培养能为社会主义现代化建设服务,德智体美全面发展.具有较高的文化素养.敬业精神和社会责任感,有团队协作精神.有良好的社会道德和职业道德,有良好的身体素质 ...查看


  • 基于FPGA的乒乓球游戏参考毕业论文设计
  • 基于 XILINX-FPGA 的乒乓球游戏参考设计 一.背景: Xilinx 大学计划(xilinx university plan 简称 XUP)一直致力于为工程课程 提供新一代软件和硬件设计流程.全球数千所使用 Xilinx 系统进行教 ...查看


  • 电子信息类毕业设计课题
  • 电子信息类毕业设计课题 [电子通讯] 出租车计价系统 [过程控制] 基于单片机实现单回路智能调节.. [电子通讯] 脉冲数字频率计 [机床仪表] 仪表机床数控系统的设计(论文.. 磁流体发电论文 [电子通讯] 基于VC++6.0的PC 机与 ...查看


  • 软件工程师论文
  • 本科学年论文 论文题目: 软件工程师 学生姓名: 学 专 班 号: 业: 级: XXX XXXXX 软件工程 软件 1202 班 XXX 指导教师: 完成日期: 2013 年 11 月 20 日 软件工程专业本科学年论文 软件工程师 目录 ...查看


  • 东北大学全日制工程硕士研究生培养方案
  • 全日制工程硕士研究生培养方案 研究生院 二OO 九年七月 前言 为更好地适应国家经济建设和社会发展对高层次应用型人才的迫切需要,积极发展具有中国特色的专业学位教育,教育部自2009年起,扩大招收以应届本科毕业生为主的全日制硕士专业学位范围, ...查看


  • 智能家居单片机控制系统毕业设计.
  • 设 计(论文) (说 明 书) 题 目: 姓 名: 编 号: 平顶山工业职业技术学院 年 月 日 毕 业 毕 业 设 计 (论文) 任 务 书 姓名 专业 任 务 下 达 日 期 年 月 日 设计(论文)开始日期 年 月 日 设计(论文)完 ...查看


热门内容