**************************************
本科毕业设计
题 目 基于S3C2440的Linux操作系统移植 姓 名 专 业 电子科学与技术 学 号 指导老师
******电气工程学院
二○一四年四月
目 录
摘要 ....................................................................................................................... I Abstract ............................................................................................................... II 前言 .................................................................................................................... III 1 嵌入式linux简介 ........................................................................................... 1
1.1 linux发展概述 ..................................................................................... 1 1.2 linux的优点 ......................................................................................... 1 1.3 Linux 应用领域 ................................................................................... 2 1.4 Linux系统安装 .................................................................................... 3
1.4.1 虚拟机安装 ............................................................................. 3 1.4 .2 Linux安装 .............................................................................. 6 1.5 Linux常用工具 .................................................................................... 7
1.5.1 文本编辑器 ............................................................................. 7 1.5.2 软件包管理 ............................................................................. 8 1.6 Linux的常用命令 ................................................................................ 8 2 ARM体系结构介绍 ....................................................................................... 14
2.1 ARM体系结构的发展 ...................................................................... 14 2.2 ARM处理器简介 .............................................................................. 15
2.2.1 ARM7处理器系列 ................................................................ 15 2.2.2 ARM9处理器系列 ................................................................ 15 2.2.3 ARM9E处理器系列 ............................................................. 15 2.2.4 ARM11处理器 ................................................................... 16 2.2.5 Cortex处理器 ........................................................................ 16
2.3 s3c2440主要特性 .............................................................................. 16 2.4 s3c2440存储器控制器 ...................................................................... 17
2.4.1 S3C2440存储控制器特性 .................................................... 17 2.4.2 SDRAM原理分析 ................................................................. 19 2.4.3 FLASH ................................................................................... 19
3 Bootloader原理分析和移植 .......................................................................... 21
3.1 Bootloader概述 .................................................................................. 21 3.2 Bootloader功能 .................................................................................. 21 3.3 常用Bootloader ................................................................................. 22 3.4.Uboot移植实现 ................................................................................. 22
3.4.1 建立交叉编译环境 ............................................................... 22 3.4.2 分析U-boot目录结构 .......................................................... 24 3.4.3 uboot编译方法 ...................................................................... 25
4 操作系统内核的的移植 ................................................................................ 26
4.1 Linux内核的作用 .............................................................................. 26 4.2 Linux内核的目录结构 ...................................................................... 27 4.3 内核文件类型 ................................................................................... 28
4.3.1 Makefile .................................................................................. 28 4.3.2 .config ..................................................................................... 29 4.3.3 kconfig .................................................................................... 29 4.4 配置工具 ........................................................................................... 29 4.5 Linux内核启动过程 .......................................................................... 31
4.5.1 汇编代码执行阶段 ............................................................... 31 4.5.2 c 语言代码阶段 .................................................................... 31
4.6移植最小内核 .................................................................................... 33 5文件系统分析与制作 ..................................................................................... 38
5.1 文件系统概述 ................................................................................... 38
5.1.1嵌入式文件系统介绍 ............................................................ 38 5.1.2
基于FLASH的文件系统 ............................................... 38
5.2 文件系统目录结构 ........................................................................... 40 5.3 配置编译busy-box............................................................................ 42
5.3.1 busybox简介 ......................................................................... 42 5.3.2 安装busybox ........................................................................ 42 5.4 制作yaffs根文件系统 ..................................................................... 43
5.4.1 构建框架 ............................................................................... 43 5.4.2 添加内容 ............................................................................... 44
6 内核驱动 ........................................................................................................ 45
6.1 设备驱动程序的概述 ....................................................................... 45 6.2设备驱动程序的功能 ........................................................................ 45 6.3设备驱动程序的结构 ........................................................................ 45 6.4 设备驱动程序开发过程 ................................................................... 46
6.4.1设备驱动程序的开发流程 .................................................... 46 6.4.2 模块化驱动程序设计 ........................................................... 47 6.5 串口驱动移植 ................................................................................... 48 6.6 LCD驱动移植 ................................................................................... 49 结 论 .................................................................................................................. 致谢 .................................................................................................................... 55 参考文献 ............................................................................................................ 56
基于S3C2440的Linux操作系统移植
基于S3C2440的Linux操作系统移植
摘要
随着电子产业的发展和智能时代的到来,嵌入式产品以其个性化定制的特点已经深入发展到各个领域。操作系统嵌入式设计流程的重要环节,在安装操作系统后,电子产品就能像电脑一样运行各种软件,完成复杂的功能。
本课题研究的是将Linux系统移植到S3C2440的TQ2440开发板上,本文前两章介绍Linux操作系统、ARM体系结构的基础知识,以及系统开发工具,操作命令,交叉编译器,并且建立开发环境。之后几章分别介绍嵌入式开发的几个主要流程,包括Bootloader、内核、文件系统、驱动。将Uboot移植到tq2440上,然后移植最小系统,使开发板能够正常启动,最后是构建根文件系统、在内核中加入串口、LCD驱动,这样就可以建立一个完整的嵌入式系统,本文除了理论基础知识的讲解还有具体的操作,系统的完成了嵌入式设计的开发流程。
关键词:S3C2440; Linux; 内核移植; 驱动
I
基于S3C2440的Linux操作系统移植
THE LINUX OPERATING SYSTEM BASED
ON S3C2440 RASPLANTATION
Abstract
With the development of electronic industry and intelligent era, embedded products with the characteristics of personalized customization has been developed into various areas. An important part of embedded operating system design process, in the installation of the operating system, electronic products can be like a computer running software, complete the complex function.
This research is the TQ2440 development board Linux system porting to S3C2440, basic knowledge of the first two chapters introduced the Linux operating system, ARM system structure, as well as the system development tool, operation command, compiler, and the establishment of the development environment. After a few chapter introduces several main process of embedded software, including Bootloader, kernel, file system, drive. Porting Uboot to TQ2440, and then transplanted the minimum system, make the development board can be a normal start, finally Gou Jiangen file system, adding serial, LCD is in the kernel driver, so you can build up a complete embedded system, in addition to this theory to explain the basic knowledge and specific operation, the system completed the embedded design development process.
Keywords: S3C2440; Linux; kernel porting; driver.
II
基于S3C2440的Linux操作系统移植
前 言
通信网络技术和集成电路设计的高速发展使嵌入式系统已成为了IT业的一个焦点。回顾嵌入式技术的发展过程,早期的嵌入式系统被认为是人们熟知的单片机。通常,这种系统以8位或6位MCU为核心,适合一些简单的传感器,伺服控制,显示设备等,实现一定的测量,信息处理,自动控制和显示功能。系统的组网通常利用CAN、RS-232等总线方式,通信协议比较单一,一般孤立于Internet之外。随着嵌入式与网络技术的结合,手机、PDA、路由器、Modem等复杂的高端嵌入式应用不断涌现,这使得人们需要设计更加复杂的嵌入式系统。这种需求推动了微电子技术地发展,使得32位处理器被广泛使用,这种处理器可以方便的运行嵌入式操作系统;而基于嵌入式操作系统,人们又可以开发复杂度更高的嵌入式软件,嵌入式技术的发展趋势包括行业标准化、SOC成为应用主流、嵌入式开发工具更加强大、嵌入式软件的复杂度越来越高、面向网络的嵌入式系统成为必然、建立嵌入式计算的新型模型等若干方面。
嵌入式Linux在嵌入式领域发展迅速、需求旺盛,但是嵌入式Linux的人门很难,相对于嵌入式常识的匮乏更大的困难是缺乏完善的知识结构:只了解硬件或者是只了解软件,对于有志于从事底层系统开发需要,应该改造Bootloader、专研内核、为新硬件编写驱动程序的,对于想从上层软件转到底层软件开发的人,应该看懂电路原理图,看得芯片数据手册,清楚的知道软件是怎样和硬件发生作用。总之嵌入式是一门实践性很强的学科,学习不应该局限书本,书本只是辅助资料,只有不断地检测硬件调试程序才能掌握这门技术。由于Linux的开源和可移植性高的特性,以及ARM处理器,性能好价格低廉的特点,本文将会在S3C2440的tq2440上进行系统移植,主要包括:嵌入式系统Linux介绍、Bootloader原理分析和移植、操作系统内核的移植、文件系统的分析和制作、内核驱动。
III
基于S3C2440的Linux操作系统移植
1 嵌入式linux简介
本课题移植的是Linux操作系统内核,这里简单介绍Linux的特点,以及开发平台的建立使用。
1.1 linux发展概述
20世纪60年代时,大部分计算机都是采用批处理的方式。为了改变这种现状,美国电报及电话公司(AT&T),通用电器公司(GE)及麻省理工学院(MIT)计划合作开发一个多用途,及时及多用户的操作系统,也就是MUTICS.但是由于项目太过复杂,几年下来几乎没有取得任何成果,1969年贝尔实验室退出这个项目。
但是贝尔实验室的有个工程师Ken Thompson为了让他的游戏运行快一点。找来一位天才工程师Dennis Ritchie,他们用汇编语言写了一个简单的操作系统Unics。1973年两人发现用汇编语言移植过于困难,先后用B,C语言重写了UNIX,1978年伯克利大学,在UNIX上进行改进,推出了自己的UNIX.同时AT&T公司成立了USG将UNIX变成商品化的产品。
这种商业态度,让当时许多UNIX爱好者和软件开发者感到痛心疾首和忧虑,他们觉得这种不利于产品的长期发展,于是一个叫做Richard Stallman的领军人物站了出来,他倡导开源概念,认为如果大家能将自己所学贡献出来,这个系统会更加优秀,之后他创立GUN,开发了一套与UNIX兼容的软件,然后又创立自由软件基金会(FSF)为GUN计划提供技术,法律以及财政支持。
自20世纪90年代以来,GUN计划开始大量生产或收集各种系统所必备的主件,比如函数库,变压器,调试工具,文本编辑器,网站服务器,以及一个UNIX的使用者接口。由于种种原因,GUN一直没有开发出内核,直到1991年linux内核才真正出现。之后越来越多的计算机爱好者,程序员通过网络,社区,邮件,论坛参与到linux系统的不断完善中。
1.2 linux的优点
(1) 低成本开发系统
因为linux的代码是开源的,任何人都可以免费使用和修改。这样不仅降
1
基于S3C2440的Linux操作系统移植
低了成本而且提高产品开发的效率。
(2) 可用于多种处理器平台
Linux可支持X86、 PowerPC、 ARM XSCALE、 MIPS 、DSP、FGPA等多种体系结构,并且已经被移植到多种硬件平台。这对于受时间,经费的研究与项目开发是很有帮助的、Linux采用统一的标准对硬件进行管理,应用层屏蔽系统层,系统层的改动与平台改动有关,于应用无关。
(3) 可定制内核
Linux具有独特的内核模块动态裁剪机制,它可以根据用户的需求,实时的将某些模块插入或者删除内核,实现动态的的改变。裁剪后的内核最小可达到150KB以下,适合嵌入式项目中对系统资源有要求的情况。在2.6内核中加入了许多嵌入式个性化选项,如构建用于不需要用户界面的设备的小占板面积内核选项。
(4) 性能优异
Linux系统内核精简,用于网站服务器高效而且稳定稳定,能够充分发挥硬件的功能,用于个人计算机,功能丰富,界面友好易操作,因此它比其它操作系统的运行效率更高。
(5) 良好的网络支持
Linux是第一个实现TCP/IP协议栈的操作系统,它有完整支持网络的内核结构,并提供了包括10GB,100GB以及1000GB的以太网,还有Token Ring,无线网络和光纤甚至卫星的支持。大大满足了如今嵌入式设备对网络功能的需求。
1.3 Linux 应用领域
(1) Internet/Intranet:这是目前Linux用得最多的一项,它可提供包括Web服务器、Gopher服务器、FTP服务器、SMTP/POP3邮件服务器、DNS服务器、Proxy/Cache服务器等全部Internet服务。Linux内核支持IPalias、PPP和IPtunneling,这些功能可用于建立虚拟服务、VPN(虚拟专用网) 、虚拟主机等。主要运行于Linux之上的ApacheWeb服务器。
(2) 由于Linux拥有优秀的网络功能,因此它可用于大型分布式服务,如动
画制作、数据库及文件服务器科学计算等。
2
基于S3C2440的Linux操作系统移植
(3) 作为可在低平台下运行的Unix的完整(且免费)的实现,广泛应用于各
级院校的教学和科研工作,如墨西哥已经宣布在全国的所有中小学配置Linux并为学生提供Internet服务。
(4) 桌面和办公应用。目前这方面的应用微软Windows使用人数很多,其原因一方面在于Linux桌面应用软件的数量远不如Windows应用,另一方面也因为自由软件的特性使得其几乎没有广告支持(虽然StarOffice的功能并不亚于MS Office,但知道的人并不多)。如今,通常可以通过两个途径获得Linux的发行版:①直接从Internet下载,例如RedHat站点:http://www.redhat.com;②更为方便的方法是购买Linux发行商推出的CD-ROM,这样不仅可以节省下载的时间和费用,还可以使用CD-ROM直接启动快速安装,并且CD-ROM上往往还包括非常庞大的应用软件集(多达数百兆),包括各种服务器软件、X-Window、桌面应用、数据库、编程语言、文档等,安装和使用都非常方便。
1.4 Linux系统安装
1.4.1 虚拟机安装
虚拟机指通过软件模拟的具有硬件系统功能的,运行在一个完全隔离环境中的完整计算机系统。目前流行的虚拟机软件是VMware,VirtualBox和VirualPC,他们都能在Wondows系统上虚拟个计算机。本课程安装的是VMware Workstatian6.5,安装步骤如下:
(1) 双击下载好的VMware Workstatian6.5软件打开安装程序,如 图1.1:
3
基于S3C2440的Linux操作系统移植
图1.1 虚拟机安装界面
(2) 进入图1.2所示界面。
图1.2 选择典型安装
(3) 选择next,进入安装界面,如图图1.3:
4
基于S3C2440的Linux操作系统移植
图1.3 安装进度
(4) 安装完成后,输入序列号。 (5) 选择“重新启动计算机按钮”。
(6) 到这里虚拟机安装完成,工作界面如图1.4:
5
基于S3C2440的Linux操作系统移植
图1.4 安装完成界面
1.4 .2 Linux安装
启动虚拟机后接着就是安装Linux系统,本课题选择的是安装Fedora10。 (1) 打开虚拟机选择要安装的系统文件如图1.5:
图1.5 Fedora安装文件
(2) 设置虚拟机内存和网络。 (3) 进入分区设置界面,挂载硬盘。
(4) 进入系统安装软件界面,将系统自带的软件安装齐全,如图1.6:
6
基于S3C2440的Linux操作系统移植
图1.6 系统自带软件安装
(5) 软件安装之后经过一段时间的等待系统会自动安装完成。如图1.7:
图1.7系统自动安装进度
(6) 安装完成后,登陆配置网络。并安装虚拟机工具。 (7) 在windows中新建两个文件,设置与Linux交互目录。
1.5 Linux常用工具
1.5.1 文本编辑器
(1) gedit图形化文本编辑器
7
基于S3C2440的Linux操作系统移植
Gedit是一个图形化文本编辑器,像Windows中的记事本文件一样可以打开、编写并保存文本文件。还可以将其他图形化桌面程序中的文本剪切和粘贴到编辑器中。Gedit有一个清晰而又通俗易懂的界面,使用活页标签,因此可以不必同时打开多个文件打开多个gedit窗口。
(2) 文本编辑器vi
在Linux操作系统中,如果不使用图形化的桌面,读取并修改某个文件或配置文件,可以使用vi编辑器来创建文本文档、书写脚本、编辑文本;另外,vi编辑器的文本模式查找功能比gedit命令更加强大,它可以在日志文件中以精确的方式查找信息,并且Linux安装程序会自动安装附带的vi编辑器。几乎所有的Linux用户和系统管理员都使用vi编辑器完成自己的而工作。因为vi编辑器不是图形化的软件,所以一定程度上受到了其他文本编辑器的挑战。但是vi编辑器出色的灵活性和强大的功能使它得以广泛应用。
1.5.2 软件包管理
Linux 系统上的所有软件部分成可安装、升级或删除的RPM软件包。这部分描述了如何使用图形化和命令行工具来管理Red Hat Linux系统上的RPM软件包。RPM软件包管理器是开放打包系统,任何人都可以使用。它在Linux和UNIX系统上运行。RedHat,Inc.鼓励其他销售商在他们自己的产品上使用RPM技术。 对于终端用户来说,RPM简化了系统更新。安装、删除安装、升级RPM软件包使用简短的命令就可完成。RPM维护一个已安装软件包和它们文件的数据库,因此,可以在系统上使用功能强大的查询和校验。如果喜欢图形化界面,可以使用软件包括管理工具来执行许多RPM命令。 在升级中,RPM处理配置文件时非常谨慎,因此绝对不会丢失原先定制的配置。这是使用普通的.Tar.gz文件所无法达到的。 对于开发者来说,RPM允许用户把软件编码和程序打包,然后提供给终端用户。
1.6 Linux的常用命令
cd 命令: 改变工作目录。
mkdir命令:
8
基于S3C2440的Linux操作系统移植
创建一个目录(类似DOS下的md命令)。
rmdir 命令: 删除空目录。 rm命令:
在linux中创建文件很容易,系统中随时会有文件变得过时且毫无用处。用户可以用rm命令将其删除。该命令的功能为删除一个目录中的一个或多个文件或目录,它也可以将某个目录及其下的所有文件及子目录均删除。对于链接文件,只是删除了链接,原有文件均保持不变。
pwd 命令:
在Linux层次目录结构中,用户可以在被授权的任意目录下利用mkdir命令创建新目录,也可以利用cd命令从一个目录转换到另一个目录。然而,没有提示符来告知用户目前处于哪一个目录中。要想知道当前所处的目录,可以使用。
pwd命令:
该命令显示整个路径名。
ls 命令:
ls是英文单词list的简写,其功能为列出目录的内容。这是用户使用频率最多的命令 ,因为用户需要不时地查看某个目录的内容。该命令类似于DOS下的dir命令。
cp命令:
该命令的功能是将给出的文件或目录拷贝到另一文件或目录中,就如同DOS下的copy命令一样,功能非常强大。
mv命令:
用户可以使用mv命令来为文件或目录改名或将文件由一个目录移入另一个目录中。该命令如同DOS下的ren和move的组合。
ln命令:
该命令在文件之间创建链接。这种操作实际上是给系统中已有的某个文件指定另外一个可用于访问它的名称。对于这个新的文件名,我们可以为之指定不同的访问权限,以控制对信息的共享和安全性的问题。
Find命令:
9
基于S3C2440的Linux操作系统移植
在目录结构中搜索文件,并执行指定的操作。此命令提供了相当多的查找条件,功能很强大。
cat命令:
在标准输出上显示文件;连接两个或多个文件 。
more命令:
在终端屏幕按屏显示文本文件。
Passwd命令:
用来更改使用者的密码 wh命令:
该命令主要用于查看当前在线上的用户情况。这个命令非常有用。如果用户想和其他用户建立即时通讯,比如使用talk命令,那么首先要确定的就是该用户确实在线上不然talk进程就无法建立起来。又如,系统管理员希望监视每个登录的用户此时此刻的所作所为,也要使用who命令。
W命令:
该命令也用于显示登录到系统的用户情况,但是与who不同的是w命令功能更加强大,它不但可以显示有谁登录到系统,还可以显示出这些用户当前正在进行的工作,并且统计数据相对who命令来说更加详细和科学,可以认为w命令就是who命令的一个增强版。
chmod 命令:
chmod命令是非常重要的,用于改变文件或目录的访问权限。用户用它控制文件或目录的访问权限。该命令有两种用法。一种是包含字母和操作符表达式的文字设定法;另一种是包含数字的数字设定法。 hgrp命令:功能:改变文件或目录所属的组。
chown 命令:
更改某个文件或目录的属主和属组。这个命令也很常用。例如root用户把自己的一个文件拷贝给用户xu,为了让用户xu能够存取这个文件,root用户应该把这个文件的属主设为xu,否则,用户xu无法存取这个文件。
Login命令:
login的作用是登录系统,它的使用权限是所有用户。
Shutdown命令:
10
基于S3C2440的Linux操作系统移植
shutdown命令的作用是关闭计算机,它的使用权限是超级用户。
Halt命令:
halt命令的作用是关闭系统,它的使用权限是超级用户。
Reboot命令:
reboot命令的作用是重新启动计算机,它的使用权限是系统管理者。
Mount命令:
mount命令的作用是加载文件系统,它的用权限是超级用户或/etc/fstab中允许的使用者。
Umount命令:
umount命令的作用是卸载一个文件系统,它的使用权限是超级用户或/etc/fstab中允许的使用者。
Exit命令:exit命令的作用是退出系统,它的使用权限是所有用户。 Last命令:
last命令的作用是显示近期用户或终端的登录情况,它的使用权限是所有用户。通过last命令查看该程序的log,管理员可以获知谁曾经或企图连接系统。
df命令:
显示磁盘文件系统与使用状况。
top命令:
实时显示 process 的动态。
crontab命令:
crontab 是用来让使用者在固定时间或固定间隔执行程式之用,换句话说,也就是类似使用者的时程表。-u user 是指设定指定 user 的时程表,这个前提是你必须要有其权限(比如说是 root)才能够指定他人的时程表。如果不使用 -u user 的话,就是表示设定自己的时程表。
kill命令: 杀死僵死的进程。
Ifconfig命令: 用于配置网卡。
Netstat命令:
11
基于S3C2440的Linux操作系统移植
显示网络连接、路由表和网络接口信息,可以让用户得知目前都有哪些网络连接正在运作。
nslookup命令:
查询一台机器的IP地址和其对应的域名。它通常需要一台域名服务器来提供域名服务。如果用户已经设置好域名服务器,就可以用这个命令查看不同主机的IP地址对应的域名。
ping命令:
ping命令用于查看网络上的主机是否在工作,它向该主机发送ICMP ECHO_REQUEST包。有时我们想从网络上的某台主机上下载文件,可是又不知道那台主机是否开着,就需要使用ping命令查看。
mail功能: 读取及发邮件。
finger命令:
finger命令的功能是查询用户的信息,通常会显示系统中某个用户的用户名、主目录、停滞时间、登录时间、登录shell等信息。tar命令:tar可以为文件和目录创建档案。利用tar,用户可以为某一特定文件创建档案(备份文件),也可以在档案中改变文件,或者向档案中加入新的文件。
gzip命令:
gzip是在Linux系统中经常使用的一个对文件进行压缩和解压缩的命令,既方便又好用。
unzip命令:
该命令用于解扩展名为.zip的压缩文件。
12
基于S3C2440的Linux操作系统移植
13
基于S3C2440的Linux操作系统移植
2 ARM体系结构介绍
本课题针对的是操作系统移植侧重于软件,因此关于硬件,只是简单地介绍一下ARM体系结构和和s3c2440的主要硬件。
2.1 ARM体系结构的发展
体系结构,定义了指令集和基于这一体系结构下处理器的编程模型。基于同种体系结构可以有多种处理器,所面向的应用领域不同,每个处理器性能也就不同,但每个的实现都要遵守这一体系结构。ARM体系结构为嵌入式项目开发提供低功耗高性能的系统性能。目前ARM体系结构一共定义了8个版本,从版本1到版本8,ARM体系的指令功能不断扩大。不同系列的ARM处理器,性能差别很大,应用范围对象也不尽相同,但是,如果是相同的ARM提醒结构,那么基于它们的应用软件是兼容的。
V1版本的处理器并没有实现商品化,采用是26位,寻址空间是MB,在目前的版本中已不再是用这种结构。
与V1结构的ARM处理器相比,V2结构的ARM处理器的治理结构有所完善,比如增加了乘法指令并且支持协处理器指令
从V3结构开始,ARM处理器的体系结构有了很大的改变,实现了32位的地址空间,指令结构相对前面两种结构有所完善。
V4结构的ARM处理器增加了半字指令的读写和写入操作,增加了处理器模式,并且有了T变种—V4T,在Thumb状态下支持的是16位的Thumb指令集。
V5结构的ARM处理器提升了ARM和Thumb两种指令的交互能力,同时有了DSP指令—V5E结构,JAVA指令—V5结构的支持。
V6体系结构包含ARM体系结构中所有的4种特殊指令集:Thumb指令(T),DSP指令(E),Java指令(J)和Media指令。
V7架构采用了Thumb-2技术,它是在ARM的Thumb代码压缩技术的基础上发展起来的,并且保持了在代码对现存ARM解决方案的完整的兼容性。Thumb-2技术的代码量比纯32位代码少占用31%的内存,减少了系统资源开销,同时能提高出38%的性能。ARMv7架构还采用了NEON技术,将媒体处
14
基于S3C2440的Linux操作系统移植
理能力和DSP提高了近4倍。并支持改良的浮点运算,满足下一代3D图形、游戏物理应用以及传统嵌入式控制因为的需求。
ARMv8架构是基于32位的ARMv7而来,保留了TrustZone安全执行环境、NEON、虚拟化等关键技术特征ARMv8架构包括AArch和AArch32两种执行状态,前者引入了一套新的一套指令集“A”专门用于位处理器,而后者用来兼容现有32位ARM指令集。
2.2 ARM处理器简介
2.2.1 ARM7处理器系列
ARM7内核采用冯.诺伊曼体系结构,数据和指令使用同一条总线。内核有一条3级流水线,执行ARMv4指令集。ARM7系列处理器主要用于对功耗要求比较苛刻的消费类产品。其主频可达130MIPS。包括ARM7TDMI、ARM7TDMI-S、ARM7EJ-S和ARM720T四种类型。
2.2.2 ARM9处理器系列
采用了5级指令流水线,ARM9处理器能够运行在比ARM7更高的时钟频率上,改善了处理器的整体性能;储存器系统根据哈佛结构体系区分数据总线和指令总线。ARM9系列的第一个处理器是ARM920T,它包括的数据指令Cache和MMU。此处理器能够被用在要求有虚拟处理器支持的操作系统上。ARM940T包含一个更小的数据指令Cache和一个MPU.它是针对不要求运行操作系统的应用而设计的。
2.2.3 ARM9E处理器系列
ARM9E系列的处理器基于ARM9E-S架构,这个内核是ARM9内核带有E扩展的一个可综合版本,包括ARM946E-S和ARM966E-S两个变种。两者都执行V5TE架构指令。他们也支持嵌入式跟踪宏单元,开发者可以实时跟踪处理器上指令和数据的执行。当调试对时间敏感的程序段时,这种方法很重要。
ARM946E-S包括TCM、Ca车和一个MPC。TCM和Cache的大小可配置。该处理器是针对要求有确定的实时响应的嵌入式控制而设计的。
ARM9E系列的ARM926EJ-S内核为可综合的处理器。他针对小型便携式
15
基于S3C2440的Linux操作系统移植
Java是设备,如3G手机和PDA应用而。ARM926EJ-S是第一个包含Jazelle技术,可加速Java字节码执行的ARM处理器内核。它还有一个MMU、可配置的TCM及具有零或非零等待存储器的数据/指令Cache。
2.2.4 ARM11处理器
ARM1136J-S是第一个执行ARMv6结构指令的处理器。它集成了一条具有
的Load/Store和算数流水线的8级流水线。ARMv6指令包含了对媒体处理的单指令流多数据流扩展,采用特殊的设计改善视频处理能力。
2.2.5 Cortex处理器
基于ARMv7架构以后的ARM处理器冠以Cortex的代称。基于v7-A架构的称为“Cortex-A系列”,基于v7-R架构的称为“Cortex-R系列”,基于v7-M架构的称为“Cortex-M系列”。
Cortex-M系列的处理器有Cortex-M3、Cortex-M1、Cortex-M0和最新的Cortex-M4架构。Cortex-M3处理器结合了执行Thumb-2指令的32位哈佛微体系结构和系统外设。Cortex-M0处理器能耗低、门数量少、代码占用空间小,使得MCU开发人员能够以8位处理器的价位,获得32位处理器的性能。超低门数还使其能够用于模拟信号设备和混合信号设备及MCU应用中,可望节约成本。
Cortex-R4处理器针对Thumb-2指令进行最佳优化设计此项特性带来很多的好处包括:更低的时钟速度所带来的省电效益;更高的性能将各种多功能特色带入移动电话与汽车产品的设计;更复杂的算法支持更高性能的数码影像和内建磁盘的系统。
Cortex-A8是有史以来ARM开发的性能最高、最具功率的处理器。Cortex-A8处理器的速率可以在600MHz到超过1GHz的范围内调节,能满足哪些需要工作在300Mw以下的功耗的移动设备的要求;以及满足哪些2000DhrystoneMIPS的性能优化的消费类应用的要求。
2.3 s3c2440主要特性
S3C2440是韩国三星公司推出的16/32位RISC微控制器,其处理器采用的是ARM920T内核,可以接丰富的片内外设,为PDA和其它智能应用,提供了低
16
基于S3C2440的Linux操作系统移植
功耗、低价格、高性能微控制器的解决方案。主要特点有一下几点:
具有16KB指令高速缓冲储存器、16KB数据高速缓冲储存器和内存管理
单元MMU。
外部储存器控制器、可扩展8组,每组128MB,总容量达1GB;支持从Nand
flash存储器启动。
4通道的DMA,并且有外部请求引脚。
3个通道的UART,带有16字节的TX/RX FIFO,支持IrDA1.0功能。 具有2通道的SPI,1个通道的IIC串行总线和1个通道的IIS音频总
线接口 。
1个USB设备总线的端口,2个USB主机总线的端口。 1个16位内部定时器和有4个具有PWM功能的16位定时器。 8通道的10位A/D转换器,提供触摸屏接口。 具有130个通用I/O口和24通道的外部中断源。 兼容MMC的SD卡接口。 WhathDog。
具有日历功能的RTC。
有LCD控制器,支持4K色的STN和256K的TFT,配置有DMA通道 具有PLL功能的时钟发生器,时钟频率高达533MHz。
具有电源功能:可以使系统以慢速方式,普通方式,空闲方式和空闲
方式、掉电方式和掉电方式工作。
电源系统:1.2V供电电压,1.8V/2.5V/3.3V存储器供电,3.3VI/0供
电。
AC97编街码器接口。 CMOS摄像头接口。
2.4 s3c2440存储器控制器
2.4.1 S3C2440存储控制器特性
在以后的章节中需要移植uboot,分析启动代码会涉及存储器的配置,所以需要了解存储空间的布局,掌握SDRAM的配置方法以及Nand Flash的操作。
17
基于S3C2440的Linux操作系统移植
S3C2440的存储器提供了访问外部存储器的所有控制信号,27位的地址信号、32位数据信号、8个片选信号、以及读写控制信号等。总共有八个存储器bank(bank0-bank7)bank0-bank5为固定128MB,bank6和bank7的容量可编程改变,可以是2、4、8、16、32、、128MB最大共1GB。如图2.1:
图2.1 内存分布图
(1) bank0可以作为引导ROM,其数据线宽只能是16位和32位,其它存储器的数据线宽可以是8位、16位和32位,一般将Nor Flash接在bank0上。
(2) 7个固定存储器bank(bank0-bank6)起始地址,bank7的开始地址与bank6的结束地址相连接,但二者的容量必须相等。
(3) 所有存储器bank的访问周期都是可编程的。 (4) 支持SDRAM的自刷新和掉电模式。 (5) 支持大小端(软件选择)。
18
基于S3C2440的Linux操作系统移植
2.4.2 SDRAM原理分析
ARM中的SDRAMJ相当于目前电脑中使用的DDR内存,它是程序运行的地方。TQ2440开发板使用的是型号:K4S561632的SDRAM,连接在BANK6,片选信号nGCS6,地址范围是:0x30000000-0x33FFFFFF。如图2.2:
0x30000000-0x31000000 程序代码区,文字常量区 0x33ff0000-0x33ff4800 堆区
图2.2 SDRAM存储区域分配图
2.4.3 FLASH
FLASH(闪存)是ARM上重要的存储设备,由于其具有非易失性,电可擦除性、可重复编程以及高密度。低功耗等特点,被广泛应用于手机、MP3、数码相机,笔记本电脑等数据存储设备中。它包括NAND FLASH和NOR FLASH。
(1) NOR FLASH大小:2M,数据长度:16bit,连接在nGCS6上,它的特点是:
线性寻址
可按地址直接进行读写操作。 写操作之前需要进行擦除操作。
写入、擦除速度慢,读取速度较快,单位密度低、成本较高。
(2) NAND FLASH 大小:256M,数据宽度:8bit。地址范围:
19
基于S3C2440的Linux操作系统移植
有专门的时序控制总线,不占用系统总线资源。 非线性寻址。
读操作,一次读一个扇区(512字节)。 写操作,可直接擦除指定地址。 写之前必须进行擦除操作。 成本低,单位密度高,擦除速度快。
20
基于S3C2440的Linux操作系统移植
3 Bootloader原理分析和移植
前面介绍了有关软件硬件方面的基础知识,下面几章将进行正式的移植,Bootloader是操作系统运行前首先运行的一段代码,本章将介绍Bootloader的原理、启动过程以及移植过程。
3.1 Bootloader概述
一个嵌入式系统从软件上分析一般分为四个层次,它们分别是分别是:Bootloader、Linux内核、文件系统、应用程序。
简单的说Bootloader就是操作系统运行之前运行的一段小程序。通过这段程序,可以初始化硬件设备,建立系统的内存空间映射图、从而将系统的软件硬件环境带到一个合适的状态,以便为调用操作系统内核准备好正确的环境。最终Bootloader把操作系统内核影响加载到RAM中并将控制权交给它。不同的处理器上电或复位后的第一条指令地址并不相同,对于ARM处理器来说,改地址为0x00000000.对于一般的嵌入式系统通常把Flash等非易失存储器映射到这个地址,而Bootloader就位于该存储器的最前端。所以系统上电或复位后执行的第一段程序便是Bootloader。因为储存Bootloader的存储器不同,Bootloader的执行过程也不同。嵌入式系统中广泛采取的非易失存储器通常是Flash,而Flash又分为Nor Flash和Nand Flash两种。它们不同之处在于:Nor Flash支持片内执行代码,这样可以在Flash上直接执行而不必拷贝到RAM中去执行。而Nand Flash并不支持XIP,所以想执行Nand Flash上的代码必须先拷贝到RAM中去,然后跳到RAM中执行。
3.2 Bootloader功能
Bootloader的启动过程可以分为两个阶段,第一阶段使用汇编来实现,它完成一些依赖于CPU体系结构的初始化,并调用第二阶段的代码;第二阶段则通常使用C语言来实现,这样可以实现更复杂的功能,并且代码会有更好的可读性和可移植性。一般而言,这两个阶段完成的功能可以如下分类。
(1)Bootloader第一阶段的功能。 硬件设备初始化。
为加载Bootloader的第二阶段代码准备RAM空间。
21
基于S3C2440的Linux操作系统移植
复制Bootloader的第二阶段代码到RAM空间。 设置好栈。
跳转到第二阶段代码C入口点。
在第一阶段进行的硬件初始化一般包括:关闭WATCHDOG、关中断、设置CPU的速度和时钟频率、RAM初始化等。这些并不都是必须的,比如S3C2410/S3C2440的开发板所使用的U-Boot中,就将CPU的速度和时钟的设置放在第二阶段。
甚至,将第二阶段的代码复制到RAM空间中也不是必须的,对于NOR Flash等储存设备,完全可以在上面直接执行代码,只不过相比在RAM中执行效率大为降低。
(2)Bootloader第二阶段的功能。 初始化本阶段使用的硬件设备。 检查系统的内存映射(menmory map)。
将内核映像和根文件系统映像从Flash上读到RAM空间中。 为内核设置启动参数。
3.3 常用Bootloader
(1) U-Boot:是德国DENX小组开发的用于多种嵌入式CPU的Bootloader程序,它可以运行在ARM,MIPS,PowerPC等多种嵌入式平台中。
(2) VIVI:由韩国MIZI公司开发的专门用于SAMSUNG ARM架构开发的一种Bootloader。
(3) Ret Boot:RedHat开发针对eCos操作系统。
(4) BLOB:基于LART硬件平台的,目前只支持INTEL的Strong ARM和XScale结构的ARM芯片。
3.4.Uboot移植实现
3.4.1 建立交叉编译环境
因为我们是使用通用计算机X86来编译Uboot,但是运行是在ARM开发板上,这就需要建立一个交叉编译环境。本课题使用EABI-4.3.3_EmbedSky_20100610.tar.bz2的交叉编译器,使用的U-boot的版本
22
基于S3C2440的Linux操作系统移植
为u-boot-1.1.6_20120828.tar.bz2,开发板使用S3C2440中的TQ2440.具体操作如下:
(1) 命令:cd /opt 使用解压命令:tar xvfj
/mnt/hgfs/Linux/EABI-4.3.3_EmbedSKky_20100610.tar.bz2 –C / 如图3.1:
图3.1 解压后
总共解压出来EABI-4.3.3的编译器,3.4.5的编译器和制作文件系统的mkyaffsimage等工具。其中3.4.5的编译器用于编译uboot,4.3.3的编译器用于编译内核。
(2) 添加交叉编译器的环境变量。命令:gedit/etc/profile。 (3) 使环境变量生效。命令:source /etc/profile。
(4) 查看交叉编译器版本。命令:arm-linux-gcc –v。如图3.2:
23
基于S3C2440的Linux操作系统移植
图3.2 显示版本信息
(5) 如图所示安装成功。
3.4.2 分析U-boot目录结构
命令:tar xvfj u-boot-1.1.6_20120828.tar.bz2–C / 解压后如图3.3:
图3.3 目录结构
U-boot源码下有几千个文件,代码非常复杂,在这里只是了解整体结构,而不是分析具体代码。
board:开发板相关的目录,每种处理器都有对应的子目录。
24
基于S3C2440的Linux操作系统移植
common:通用命令函数。 cpu:特定cpu架构的相关目录。 doc:uboot开发和使用文档。
drivers:uboot所支持的相关硬件的驱动程序。 fs:uboot 所支持的文件系统。 include:系统的头文件。 lib:与体系结构相关的库文件。 net:各种网络协议。 post:上电后自检程序。
tools:用于创建uboot bin文件的工具。
3.4.3 uboot编译方法
Uboot中有成千上个文件。我们通过修改部分文件的内容,来配置符合自己开发板的uboot。因为修改的文件很多,大致介绍一下操作流程。
(1) 在board下新建一个目录embedsky,将sansung/smdk2410目录复制到embedsky目录下,并将文件夹改成smdk2440。
(2) 将smdk2440/smdk2410.c改名为smdk2440.c。
(3) 在include/configs目录下,将smdk2410.h复制为smdk2440.h。 (4) 修改顶层的makefile文件在在1880行加入自己的处理器信息。 (5) 修改board/embedsky/smdk2440下的Makefile文件,将COBJS:=smdk2410.o flash.o改为smdk2440.olash.o。
(6) 修改/cpu/arm920t/start.S文件,使u-boot可以从NandFlash启动。 (7) 在board/smdk2440/目录下加入NandFlash读取函数。 (8) 修改board/smdk2440/lowlevel-init.S文件。 (9) 修改include/configs/smdk2440.h如下。
上述修改完后,就直接make,得到u-boot.bin烧到Nand Flash即可。
25
基于S3C2440的Linux操作系统移植
4 操作系统内核的的移植
前几章我们介绍了Llinux系统和s3c2440的处理器架构,对于软硬件有了基本了解,并且在上一章介绍了引导操作系统的uboot,这一章主要工作是linux内核的移植:包括制作最小的系统内核以及介绍yaffs文件系统并且进行简单的移植。
4.1 Linux内核的作用
操作系统是一个用来管理硬件并为用户程序提供一个接口的低级支撑软件。一个计算机系统是一个软件和硬件的结合体,它们相互依赖,不可分割。包括外围设备、内存、处理器、硬盘和其他的电子设备组成的发动机。但是没有软件来控制或操作它,自身是不能工作的。操作系统就是完成这个控制的软件,在linux系统术语中称之为“内核”。Linux内核的主要模块分为以下几个部分:储存管理、文件系统、设备管理和驱动、网络通信、以及系统的初始化、系统的调用。
(1) 进程管理:进程是在计算机系统中资源分配的最小单位。内核负责创
建和销毁进程,而且由调度程序采取合适的调度策略,实现进程间的合理且实时的处理器资源的共享。从而内核的进程管理活动实现了多个进程在一个或多个处理器上的抽象。内核还负责实现不通信同进程间和其它部件间的。
(2) 内存管理:内存是计算机系统最主要的资源。内核使得多个进程安全
而合理的共享内存资源,为每个进程在有限的物理资源上建立一个虚拟地址空间。内存管理部分代码可分为硬件无关部分和硬件有关部分:硬件无关部分实现进程和内存之间的地址映射等功能;硬件有关部分实现不同体系结构的内存管理相关功能并为内存管理提供与硬件无关的虚拟接口。
(3) 文件管理:在Linux系统中的任何一个概念几乎都可以看做一个文件。内核在非结构化的硬件上建立了一个结构化的虚拟文件系统,隐藏了各种硬件的具体细节,从而在整个系统的几乎所有机制中使用文件的抽象。Linux在不同物理介质或虚拟结构上支持数十种文件系统。例如,Linux支持磁盘的标准文件系统ext3和虚拟的特殊文件系统。
(4) 设备管理:Linux系统中几乎每个操作系统最终都映射到一个或多个物
26
基于S3C2440的Linux操作系统移植
理设备上。除了处理器、内存等少数的硬件资源之外任何一种设备控制操作都由设备特定的驱动代码来进行。内核中必须提供系统中可能要操作的每一种外设的驱动。
(5) 网络管理:内核支持各种网络标准协议和网络设备。网络管理部分可分为网络协议栈和网络设备驱动程序。网络协议栈负责实现每种可能的网络传输协议(TCP/IP协议等);网络设备驱动程序负责与各种网络硬件设备或虚拟设备进行通信。
4.2 Linux内核的目录结构
Linux内核版本:Linux-2.6.30.4 解压后,如图4.1所示:
图4.1目录结构
(1) arch目录:
内核中与CPU架构相关的代码放在arch,而相应的头文件则分别放在include/asm目录下。在每个cpu的子目录下,进一步又包含boot,mm,kernel等子目录,分别包含与系统引导,内存管理,系统调用的进入与返回,中断处理以及其它内核代码依赖cpu和系统结构的底层代码。
(2) kernel 目录:
27
基于S3C2440的Linux操作系统移植
Linux大多数关键核心的功能都是在这个目录实现。包括调度程序,进程控制,模块化,其它操作。
(3) mm目录:
mm目录中的文件为核心实现内存管理体系结构无关的部分。这个目录包含换页及内存的分配和释放的函数,还有允许用户进程将内存区间映射到它们的地址空间的各种技术。
(4) fs目录:
所有的文件系统实现的代码。每个目录分别对应一种文件系统的实现,公用的用于源程序则用于“虚拟文件系统”vfs。
(5) ipc和lib目录:
进程间通信和库函数各有一个小的专用目录。 (6) include目录:
包含了所有的.h文件。同时依据arch的目录结构做相应的组织。 (7) driver:
包括各种块设备与字符设备的驱动程序。 (8) net目录:
包含各种不同网卡雨网络规划的设备驱动程序。
4.3 内核文件类型
4.3.1 Makefile
Makefile的作用是根据配置的情况,构造出需要编译的源文件列表,然后分别编译,并把目标代码链接在一起,最终形成Linux内核可执行的二进制文件。由于Linux内核代码是按照树形结构组织的,所以Makefile也被分布在目录树中。顶层Makefile,是整个内核代码编译整个内核配置,编译的总体文件,各个目录下的Makefile:比如driver/Makefile,负责所在子目录下源代码的管理
用户通过make menuconfig配置后,产生了.config。顶层Makefile读入.config中的配置选择。顶层Makefile有两个主要的任务:产生vmlinux文件和内核模块(module)。这样顶层Makefile递归的进入到内核的各个子目录中,分别掉用于这些子目录中的Makefile。至于到底进入哪些子目录,取决于内核
28
基于S3C2440的Linux操作系统移植
的配置。
4.3.2 .config
.config:在配置内核后生成。根据.config来决定使用哪些Makefile。例如文件中的
CONFIG_ARCH_MAY_HAVE_PC_FDC=y
#CONFIG_RWSEM_GENERIC_SPINLOCK is not set
在这里如果选项等于y, CONFIG_ARCH_MAY_HAVE_PC_FDC这个宏在Makefile中对应的选项就会连接相应的文件进行编译,如果是被#注释掉的选项表示不参加编译。编译从顶层开始递归到底层。
4.3.3 kconfig
在执行命令 make menuconfig时会显示如图4.2:
图4.2 配置菜单
当执行make menuconfig时就会查找kconfig文件显示相应的信息。Kconfig中使用三种变量y、n、m分别表示编译,被编译,编译成模块。
4.4 配置工具
字符工具。执行命令make conig 如图4.3:
29
基于S3C2440的Linux操作系统移植
图4.3 字符配置界面
Xwindows图形界面,执行命令make xconfig,图4.4:
30
基于S3C2440的Linux操作系统移植
图4.4 Xwindows界面配置单
Ncurses图形配置界面,执行命令make menuconfig,如图4.5:
图4.5 Ncurses配置界面
4.5 Linux内核启动过程
4.5.1 汇编代码执行阶段
Linux内核启动后首先执行三个汇编代码:
arch/arm/kernel/head.S
arch/arm/kernel/head-commom.S arch /arm/mm/proc-arm920.S
主要功能是检查内核是否支持当前处理器架构和开发板、禁止Cache,使能MMU、设置栈指针、调用start-kernel。
4.5.2 c 语言代码阶段
执行init/main.c,以完成内核初始化全部工作、最后调用rest-init函数启动
31
基于S3C2440的Linux操作系统移植
init进程。
第一部分:在主函数中start-kernel()中调用了一些列的初始化函数,以完成kernel本身的设置。这些初始化有的是公共的,有的需要配置才会执行的。
输出Linux版本信息(printk(linux_banner))设置与体系结构相关的环境(setup_arch())页表结构初始化(paging_init())。
提取并分析核心启动参数(从环境变量中读取参数,设置相应标志位
等待处理,(paese_options())。 设置系统自陷入口(rrap_init())。 初始化系统中断IRQ(int_IRQ())。
核心进程调度器初始化(包括初始化几个缺省的Botton-half,sched_int
())。
软中断初始化(softirq_init())。
时间、定时器初始化(包括读取CMOS时钟、估测主频,初始化定时
器中断等time_init())。
控制台初始化(prof_buffer和prof_len变量)。
核心Cache初始化(描述Cache信息的Cache,kmem_cache_init())。 延迟校准(获得时钟jiffoes与CPU主频ticks的延迟,calibrate_delay
())。
内存初始化(设置内存上下页和页表项初始值,mem_init())。 创建和设置内部及通用cache(“slab_cache”,kmem_cache_sizes_init
())。
相关cache初始化()。
SMP机器其余cpu(除当前引导cpu)初始化(对于没有配置SMP的
内核,此函数为空,smp_init())。
启动init过程(创建第一个核心线程,调用init()函数,元执行序列
调用cpu_idle()等待调度init())。至此start_kernel()结束,基本的核心环境已经建立起来了。
第二部分:init()函数作为核心线程,首先锁定内核,然后调用do_basic_setup()完成外设及其驱动程序的加载和初始化。过程如下:
网络初始化(sock_init())
32
基于S3C2440的Linux操作系统移植
创建时间管理核心线程初始化(start_context_thread())
其他所需要的初始化使用_initcall()宏包含,在do_initcalls()函数
中启动执行。
第三部分:最小系统需要关注的部分 控制台初始化(console_init())。
4.6移植最小内核
Linux最小内核只是管理进程调度,内存管理等等最基本的内核功能模块不包括驱动和文件系统,移植后仍然不能启动开发板板,只能通过串口打印信息。下面讲诉配置最小内核的流程。
开发板:S3C2440之TQ2440
开发环境:VMware Workstation6.5之Fedora10 交叉编译器版本:EABI-4.3.3.
(1) 解压内核源码到PC中,使用解压命令:#tar xvfj linux-2.6.30.4.tar.bz2 –C /opt/EmbedSky/,然后解压到PC的“/opt/EmbedSky/”目录下。
(2) 进入到内核源码,修改“Makefile”文件,在193行“ARCH ?=(SUBARCH)”和194”CROSS_COMPILEM ? =”,将其修改为“ARCH=arm”和“CROSS_COMPILE=arm_linux_”然后保存。
(3) 修改平台的时钟频率,以满足TQ2440的工作频率。修改内核源码“arch/arm/mach-s3c2440/mach-smdk2440.c”文件162行把16.9344MHz改为12M,因为TQ2440使用的就是12MHz的外部时钟输入,即把16934400改为1200000。
(4) 然后保存刚刚设置好的参数,然后就可以开始尝试编译出镜像使其运行到开发板中。输入:#make menuconfig,然后进入配置单界面。
(5) 调用一个默认配置单,该配置单在内核源码“arch/arm/configs/”目录下面,名为“s3C2440”,该配置文件里面选择了几乎所有和时s3c24xx系列的CPU相关配置选项。在配置单选项:“Load an Alternate Configuration File”,然后调用刚才的配置文件,如图4.6:
33
基于S3C2440的Linux操作系统移植
图4.6 调用配置文件
然后进入到如下界面,输入刚刚提到得路径和配置文件,如图4.7:
图4.7 配置文件路径
然后进入配置界面,如图4.8:
34
基于S3C2440的Linux操作系统移植
图4.8配置选项
(6) 选择支持EABI,Y因为使用的4.3.3的编译器支持EABI所以需要配置 ,如图4.9:
35
基于S3C2440的Linux操作系统移植
图4.9 支持EABI选项
(7) 保存配置单为.Config,然后修改机器码,因为在uboot中设定了机器码,所以内核也需要修改不然无法启动,机器码保存在“arch/arm/tools/mach-types”中将原来的362改为168。如图4.10:
图4.10修改机器码
(8) 编译镜像文件,输入:#make zImage,就可以编译了,会在“arch/arm/boot”生成zImage镜像,然后烧写到开发板中,启动情况如图4.11:
36
基于S3C2440的Linux操作系统移植
图4.11 串口打印的内核信息
37
基于S3C2440的Linux操作系统移植
5文件系统分析与制作
上一章移植了操作系统内核,虽然能运行起来,但无法进行操作。因为在计算机中用到的大量数据和程序是以文件的形式存放在存储设备中的,这就需要文件系统管理设备中的文件,本章将讲解文件系统以及构建根文件系统。
5.1 文件系统概述
5.1.1嵌入式文件系统介绍
Linux支持多种文件系统,包括ext2、ext3、vfat、ntfs、iso9660、jffs、romfs和nfs等,为了对各类文件系统进行统一管理,Linux引入了虚拟文件系统VFS(Virtual File System),为各类文件系统提供一个统一的操作界面和应用编程接口。
VFS是一种软件机制,它是文件系统的管理者,与它相关的数据结构只存在于物理内存中。所以在每次的系统初始化期间,Linux都首先要在内存中构造一颗VFS的目录树,实际上便是在内存中建立相应的数据结构。VFS中各目录的主要用途是提供实际文件系统的挂载点。
5.1.2 基于FLASH的文件系统
(1) Jffs2文件系统
Jffs2: 日志闪存文件系统版本2 (Journalling Flash FileSystem v2)
Jffs2将文件系统的数据和原数据以节点的形式储存在闪存上,主要用于NOR FLASH闪存,基于MTD驱动层,特点是:可读写的、支持数据压缩的、基于哈表的日志型文件系统,并提供了崩溃/掉电安全保护,提供“写平衡”支持等。缺点主要是挂载时间长需要对闪存从头到尾的扫描
(2) yaffs
yaffs/yaffs2是专门针对NAND闪存设计的嵌入式文件系统。目前有Yaffs和Yaffs2两个版本,两个版本的主要区别之一在于Yaffs2能够更好地支持大容量的NAND Flash芯片。
Yaffs/Yaffs2有一下特点:
Yaffs/Yaffs2与Jffs2相比,它减少了一些功能(例如不支持数据压缩)
38
基于S3C2440的Linux操作系统移植
,所以速度更快,挂载时间更短,对内存的占用较小。另外它是夸平台的文件系统,除了Linux和eCos,还支持WinCE,pSOS和ThreadX等。
Yaffs/Yaffs2自带NAND芯片的驱动,并且为嵌入式系统了直接访问文件系统的API,用户可以不使用Linux中的MTD与VFS,直接对文件系统操作。
Yaffs/Yaffs2的主要区别是,前者支持小页NAND闪存,后者则可以支持大页(2KB)NAND闪存。同时,yaffs2在内存空间占用、垃圾回收速度、读\\写速度等方面均有大幅度提升。
Yaffs对文件系统上的所有内容(比如正常文件、目录、链接、设备文件等)都统一当做文件处理,每个文件都有一个页面专门存放头文件,头文件保存了文件的模式、所有者id、组id、长度、文件名等信息。因需要在一页内放下这些内容,所以对文件名长度,符号链接对象的路径名长度都有。
(3) Cramfs
Cramfs是Linux的创始人 Linus Torvalds参与开发的一种只读的压缩文件系统。是针对Linux内核2.4之后的版本所设计的一种新型只读文件系统。采用了zlib压缩,在Linux系统中通常把不需要经常修改的目录压缩存放,并在系统引导的时候再讲压缩文件解开,因为不会影响系统读取文件文件系统中,,而且是一个高压缩的文件系统,因此广泛用于嵌入式中,Cramfs每一页(4KB)被单独压缩,可以随机访问,为嵌入式系统节省了大量的Flash存储空间,并且Cramfs的速度快、效率高、其只读的特点有利于保护文件系统免受破坏,但是只读又是一大缺陷,使得用户无法对其内容进行扩充。
(4) Ext2fs
Ext2fs是第一个专门Linux设计的文件系统,叫做扩展文件系统。它可以
管理在很大分区上建立的文件系统。虽然原始内核代码将最大文件系统容量在2GB,但最近在VFS方面的工作已经把这个放宽到了4TB。因而,现在可以直接使用大硬盘而无需建立很多分区。Ext2fs提供长文件名支持。它使用可变长度目录项,文件名的最大长度是255个字符,如果需要还可扩展为1024个字符长度。Ext2fs为超级用户保留了一些磁盘数据块。这使得管理员很容易从用户进程塞满文件系统的状态中恢复过来。并且允许管理员在创建文件系统时选择逻辑块的大小。
(5) Ext3fs
39
基于S3C2440的Linux操作系统移植
Ext文件系统是直接从ext2文件系统发展而来。目前ext3文件系统已经非常稳定可靠,它完全兼容ext2文件系统,用户可以平滑地过度到一个日志功能健全的文件系统,ext3日志文件系统的思想就是对文件系统的任何高级都分为两步进行。首先把块的一个副本存放在日志中;其次,当发往日志的I/O数据传送完成(即数据提交给文件系统),块就写入文件。当发往文件系统的I/O数据传送终止时(即数据提交给文件系统),日志中的块副本就被丢弃。ext3即可以只对元数据做日志,也可以同时对文件数据块做日志。
5.2 文件系统目录结构
进行嵌入式开发,采用Linux作为嵌入式操作系统必须要对Linux文件系统结构有一定的了解。每个操作系统都有一种把数据保存为文件盒目录的方法,因此它才能得到添加,修改之类的改变,在DOS操作系统之下,每个磁盘或不同的磁盘分区中,目录结构中的根目录是的。而Linux的文件系统组织和DOS操作系统不同,它的文件系统是一个整体,所有的文件系统结合成一个完整的统一体,组织到一个树形目录结构中,目录是树的枝干,这些目录可能会包括其他目录,目录树的顶端是一个单独的根目录,用/表示,一个Linux的根文件目录结构如图5.1:
图5.1 Linux下的文件目录
(1) /dev
在dev目录下是一些称为设备文件打的特殊文件,用于访问系统资源或设备,如软盘,硬盘,系统内存等。设备文件的概念是DOS和Windows操作系统中没有的,在Linux下,所有设备都被抽象成了文件,有了这些文件,用户
40
基于S3C2440的Linux操作系统移植
可以像访问普通文件一样方便的访问系统中的物理设备。/dev/console:系统控制台,也就是直接和系统连接的监视器;/dev/hd:存储硬盘的分区信息;dev/hd:软驱设备文件;dev/sd:SCSI接口磁盘驱动器。目前,Linux下驱动USB存储设备的方法采用模拟SCSI设备,所以USBC存储设备的表示方法与SCSI接口硬盘的表示方法相同;dev/tty:设备虚拟台;dev/ttyS*串口设备文件。
(2) /root
root目录中的内容包括:引导系统文件的必备文件、系统文件的挂在信息、设备特殊文件、以及系统修复工具盒备份工具等。由于是系统管理员的主目录,普通用户没有访问权限。
(3) /usr
/usr是最庞大的目录,该目录包含了一般不需要修改的命令程序文件、程序库、手册和其它文档。Linux内核的源代码就放在/usr/src/linux里
(4) /var
该目录包含经常变化的文件,例如打印机、邮件、新闻的脱机目录、日志文件以及临时文件等。因为该文件系统的内容经常变化,因此如果和其它文件系统放在同一硬盘分区,文件系统的频繁变化将会提高整个文件系统的碎片化程度。
(5) /home
用户主目录的默认位置。例如一个名为LY的用户主目录将是/home/LY,所有用户的数据保存在其主目录下。
(6) /proc
需要注意的是,/prco文件系统并不是保存在系统的硬盘里,操作系统在内存中创建这一文件系统目录,是虚拟的目录,即系统内存的映射,其中包含一些和系统相关的信息,例如CPU的信息。
(7) /bin
该目录包含bin文件,许多Linux命令就是放在该目录下的可执行程序,例如ls,mkdir,tar等命令。
(8) /sbin
与bin目录类似,存放系统编译后的可执行文件、命令,如常用到的fsck、lsusb等指令,通常只有root用户才有运行的权限。
41
基于S3C2440的Linux操作系统移植
(9) /etc
该目录是linux很重要的一个目录,系统很多配置文件就在该目录下。 (10) /boot
该目录存放系统启动时所需的各种文件,如内核的镜像文件,引导加载器使用的LILO和和GRUB。
5.3 配置编译busy-box
5.3.1 busybox简介
busybox是嵌入式系统中常用的一个软件包,它把许多常用的Linux命令都集成在一个单一的可执行程序中,这样的的可执行程序加上Linux内核就可以构建一个基本的Linux系统。busybox将许多不常用的功能忽略,因此非常精巧,并且是完全模块化的,可以在编译时动态的增加或删除其中包含的命令。
busybox最初是为Debian GNU/LinuxDebian GNU/Linux安安装盘编写的。其目标是在一张软盘上创建一个可以引导的个可以引导的Linux系统,用来制作安装盘。系统,用来制作安装盘。一张软盘的容量大约为一张软盘的容量大约为1.4MB, ,所以并没有多少空间留给Linux内核以及文件系统。为此BusyBox提出了合并命令程序文件的思想。通过这个方法可以把3.5MB大小的命令程序大小包(也就是bin目录)压缩到只有200KB大小。为此,BusyBox获得了“瑞士军刀”的美誉。
5.3.2 安装busybox
(1) 首先对BusyBox解压包解压缩后进入BusyBox的根目录,然后进行功
能配置。运行命令“make menuconfig”启动BusyBox的配置工具,如图5.2:
42
基于S3C2440的Linux操作系统移植
图5.2 Busybox配置工具
1
(2) 输入命令“make”对BusyBox的源代码进行编译。编译完成后会在BusyBox的根目录下生成一个可执行文件。
(3) 接着运行命令“make install”进行安装。安装完毕后会在BusyBox的根目录下生成一个_install目录。在_install目录下有目录下有bin、、sbin和和usr目录以及一个目录以及一个linuxrc链接文件。bin和sbin目录中全是指向BusyBox命令文件的链接文件。如下所示。符号链接的意思。符号链接的意思。linuxrclinuxrc也是一个指向也是一个指向busyboxbusybox命令文件的链接命令文件的链接文件,自此安装完成。
5.4 制作yaffs根文件系统
5.4.1 构建框架
在“/opt/EmbedSky”目录下面建立“root_2.6.30.4”的目录,复制刚刚编译生成的_install下的文“dev”、件到“root_2.6.30.4”目录中,然后新建“dev”、“etc”、“home”、“lib”、“mnt”、“opt”、“proc”、“root”、“sddisk”、“sys”、“tmp”、“udisk”、“var”、“web”、同时在原有“usr”目录下新建一个“lib”和“share”目录。
43
基于S3C2440的Linux操作系统移植
5.4.2 添加内容
(1) “dev”目录
下面的内容在内核挂载完毕文件系统,系统会使用mdev自动建立。,不过mdev是调用init进程来启动的,在使用mdev构建“dev”目录前,init需要用到“/dev/console”和“/dev/null”这两个文件,所以,需要在制作文件系统的系统时静态创建这两个设备文件,方法:#cd /opt/EmbedSky/root_2.6.30.4/dev
#mknod console c 5 1 #mknod null c 1 3
(2) “etc”目录
用来存放系统的配置文件,在“etc”目录下需要新建以下几个目录: fstal:指明需要挂载的文件系统。 group:用户组。
Inittab:init进程配置文件。
shadow:使用passwd命令创建时需要该文件的参与。 passwd:密码文件。 profile:用户环境配置文件。
resolv.conf:存放DNS信息文件,访问时需要DNS的信息。 init.d:启动文件目录,下面有个“rcS”文件,里面存放了系统启动时配置以及启动加载的进程等。
rc.d:启动时所需要的脚本。 (3) “lib”目录
用来存放常用的库文件,可以从4.3.3编译器中获取库 #cd opt/EmbedSky/root_2.6.30.4
#cp–f/opt/EmbedSky/4.3.3/arm-none-linux-gnueabi/libc/armv4t/usr/lib/*.so* lib –a
其它的目录暂时可以空着,到这里文件系统的框架基本好了,然后使用mkyaffsimage_2命令制作镜像文件。
44
基于S3C2440的Linux操作系统移植
6 内核驱动
在第四章中移植的是最小操作系统,并不是完整的系统,因为内核中并没有加入驱动,在这一章将详细介绍驱动,并向内核添加几个必备驱动。
6.1 设备驱动程序的概述
使用任何外部设备都需要有相应驱动程序的支持。驱动程序为上层提供设备的操作接口。对于上层软件,只需要调用驱动程序接口,而不用理会设备具体的内部操作。对于驱动程序而言,不仅要实现设备的基本功能,如初始化、中断响应、发送、接受等、时设备的基本功能得以实现,而且针对设备使用中可能的各种差错、还提供完备的错误处理函数。
6.2设备驱动程序的功能
对设备的初始化和释放。
把数据从内核传送到硬件和从硬件读取数据到内核。
读取应用程序传送给设备文件的数据和回送应用程序请求的数据。这
需要在用户空间
内核空间
总线以及外设之间传输数据。
检测和处理设备出现的错误。
6.3设备驱动程序的结构
(1) Linux的设备驱动程序与外界的接口可以分成三部分
A驱动程序与系统引导程序的接口。 B驱动程序与操作系统内核的接口。 C 驱动程序与设备的接口。
(2) 驱动程序的注册与注销
向系统增加一个驱动程序意味着要赋予它一个主设备号
,可以通过在驱
动程序的初始化过程中调用定义在fs/devices.c中的register_chrdev()
数或者fs/block_dev.c中的register_blkdev()函数来完成。而在关闭字符设备或者块设备时,则需要通过调用unregister_chrdev()或unregister_blkdev()函数从内核中注销设备,同时释放占用的主设备号。
(3) 设备的打开与释放
45
基于S3C2440的Linux操作系统移植
A 打开设备是通过调用定义在include/linux/fs.h中的file_operations结构中
的函数open()来完成。
B 释放设备是通过调用file_operations结构中的函数release()来完成。 (4) 设备的读写操作
A字符设备的读写操作一般比较简单,直接使用函数write()和read()就可以
了。
B对于块设备,则直接调用函数block_read()和block_write()对数据进行读
写。
(5) 设备的控制操作
通过设备驱动程序中的函数ioctl()来完成 (6) 设备的轮询和中断处理
A 设备执行某个命令时,如“将读取磁头移动到软盘的第42扇区上”
设备驱动可以从轮询方式和中断方式中选择一种以判断设备是否已经完成 此命令。
B不支持中断的硬件设备
读写时需要轮流查询设备状态。
6.4 设备驱动程序开发过程
6.4.1设备驱动程序的开发流程
(1) 自动配置和初始化子程序,负责检测所要驱动的硬件设备是否存在和是否能正常工作。如果该设备正常,则对这个设备及其相关的设备驱动程序需要的软件状态进行初始化。这部分驱动程序仅在初始化的时候被调用一次。
(2) 服务于I/O请求的子程序,又称为驱动程序的上半部分。调用这部分是由于系统调用的结果。这部分程序在执行的时候,系统仍认为是和进行调用的进程属于同一进程,只是由用户态成了核心态,具有进行此系统调用的用户程序的运行环境,因此可以在其中调用sleep()等与进程运行环境有关的函数。
(3) 中断服务程序,又称为驱动程序的下半部。在Linux系统中,并不是直接从中断向量表调用设备驱动程序的中断服务子程序,而是由Linux系统来接受硬件中断,再由系统调用中断服务子程序。中断可以产生在任何一个进程运行的时候,因此在中断服务程序被调用的时候,不能依赖于任何进程的状态,
46
基于S3C2440的Linux操作系统移植
也就不能调用任何与进程运行环境有关的函数。因此设备驱动程序一般支持同一类型的若干产品,所以在系统调用中断服务子程序的时候,都带有一个或多个参数,以标识请求服务的设备。
在系统内部,I/O设备的存取通过一组固定的入口点来进行,这组入口点是由每个设备的设备驱动程序提供。一般来说,块字符设备驱动程序能够提供如下几个入口点。
open:打开设备准备进行I/O操作。对字符设备文件进行打开操作,都会调用设备的open入口点。open子程序程序必须对将要进行的I/O操作做好必要的准备工作,如清除缓冲区等。如果设备室独占的,即同一时刻只能有一个程序访问此设备,则open子程序必须设置一些标志以标志以表示设备处于忙状态。
close:关闭一个设备。当最后一次使用设备总结后,调用close子程序。独占设备必须标记设备可再次使用。
read:从设备上读数据。对于有缓冲区的I/O操作,一般是从缓冲区里读数据。对字符设备文件进行读操作将调用read子程序。
read:从设备上写数据。对于有缓冲区的I/O操作,一般是把数据缓冲区里。对字符设备文件进行写操作将调用write子程序。
ioctl:执行读、写之外的操作。
select;检查设备,看数据是否可读或设备是否用于写数据。select系统调用在检查与设备文件相关的文件描述符时使用select入口点。如果设备驱动程序没有提供上述入口点中的某一个,系统会用默认的子程序来代替。对于不同的系统,也还有一些其他的人口点。
6.4.2 模块化驱动程序设计
Linux的内核是一个有机的整体内核,即所有的内核功能链接在一起,在同一个地址空间执行。但这样的做法会带来很多的不便,如果添加一个新硬件,就重新编译内核;如果去掉一个硬件,已经编译到内核的驱动程序占用系统资源,产生浪费。通过模块化驱动程序就可以解决这个问题,根据需要,在不需要编译重新内核的情况下,把模块插入内核或者从内核中卸载。为了保证系统能够正常运行,会将驻留内存留给内核空间,但是大部分的驱动程序都是在内
47
基于S3C2440的Linux操作系统移植
核需要时才加载,而在其他情况下,则无需占用内存。因此,模块化驱动程序设计可以根据用户的需要在不需要对内核进行重新编译的情况下,在内核中被动态的加载和卸载。
内核模块的动态加载,优点是将内核镜像尺寸保持在最小,并具有最大的灵活性。便于检测新的内核代码,而不需要重新编译内核。缺点是装入的内核模块与其它内核部分一样,具有相同的访问权限,因此,不完善的内核模块会导致系统奔溃。
6.5 串口驱动移植
前面讲述了驱动程序的功能和结构,这里介绍一下怎样向内核中增加驱动,首先需要一致的是串口驱动,串口是一个字符设备。应用程序可以利用它提供给文件系统的接口对它进行操作。包括设备的打开、读写和关闭。字符设备对数据的操作以字节为单位。它可以发送和接受一个字符流。移植的操作如下:
(1) 修改驱动源码“arch/arm/mach-s3c2440/mach-smdk010.c”文件的100行
ulcon= 0x03
修改内核的“driver/serial/Samsung.c”文件的53行添加如下内容。 #include s3c2410_gpio_cfgpin(S3C2410_GPH6, S3C2410_GPH6_TXD2); s3c2410_gpio_pullup(S3C2410_GPH6, 1); s3c2410_gpio_cfgpin(S3C2410_GPH7, S3C2410_GPH7_RXD2); s3c2410_gpio_pullup(S3C2410_GPH7, 1); } 之后修改888行: .dev_name = “tq440_serial”, (2)打开配置界面,进行如下配置,如图6.1: 48 if (port->line == 2) 基于S3C2440的Linux操作系统移植 图6.1串口配置选项 最后重新编译内核。制作新的内核镜像烧到开发板中。 6.6 LCD驱动移植 LCD作为人机交互的界面是嵌入式系统最重要的基本外设。LCD是基于液晶光电效应的显示器件。液晶显示器的工作原理利用的是液晶的物理特性。在通电时,液晶排序变得有秩序,使光线可以通过;而在不通电时时,液晶排列则变得混乱,组止光线通过。下面讲诉LCD的移植流程。 (1) 修改LCD的参数配置,该配置参数在 “arch/arm/mach-s3c2440/mach-smdk2440.c”文件中,将107以后的结构体信息修改符合所使用LCD的参数。 .pixclock .setclkval = 100000, /* HCLK 100 MHz, divisor 4 */ = 0x4, 49 #if defined(CONFIG_FB_S3C24X0_T240320) = 240, = 320, .width .height 基于S3C2440的Linux操作系统移植 .xres .yres .bpp = 240, = 320, = 16, .left_margin = 3, /* for HFPD*/ .right_margin = 6, /* for HBPD*/ .hsync_len = 1, /* for HSPW*/ .upper_margin = 2, /* for VFPD*/ .lower_margin = 1, /* for VBPD*/ .vsync_len = 1, /* for VSPW*/ (2)为了支持更多分辨率的LCD.再次修改结构体,增加新的LCD信息。 (3)然后修改“dirvers/video/kconfig”文件,在1798到1819行增加下列信息: config FB_S3C24X0 50 tristate “S3C24X0 LCD framebuffer support” depends on FB && ARCH_S3C2410 select FB_CFB_FILLRECT select FB_CFB_COPYAREA select FB_CFB_IMAGEBLIT ---help--- Frame buffer driver for the built-in LCD controller in the Intel PXA2x0 processor. This driver is also available as a module ( = code which can be inserted and removed from the running kernel whenever you want). The module will be called pxafb. If you want to compile it as a module, say M here and read If unsure, say N. 基于S3C2440的Linux操作系统移植 choice config FB_S3C24X0_S3C2440 config FB_S3C24X0_S3C2440 config FB_S3C24X0_T240320 config FB_S3C24X0_TFT480272 51 prompt“LCD select” depend on FB_S3C24X0 help S3C24x0 LCD size select Boolean“3.5 inch 320x240 Samsung LCD” Depend on FB_S3C24X0 help 3.5 inch 320x240 Samsung LCD Boolean“3.5 inch 320x240 WanXin LCD” Depend on FB_S3C24X0 help 3.5 inch 320x240 WanXin LCD Boolean“3.5 inch 240X320 Toshiba LCD” Depend on FB_S3C24X0 help 3.5 inch 320x240 Toshiba LCD Boolean“3.5 inch 480X272 TFT LCD” Depend on FB_S3C24X0 help 4.3 inch 480X272 TFT LCD 基于S3C2440的Linux操作系统移植 config FB_S3C24X0_TFT800848 (4)修改“driver/video/Makefile”文件 obj-$(CONFIG_FB_S3C) += s3c-fb.o Boolean“7 inch 800x480 LCD” Depend on FB_S3C24X0 help 7 inch 480X272 TFT LCD obj-$(CONFIG_FB_S3C24X0) += s3c2410fb.o obj-$(CONFIG_TQ2440_BACKLIGHT) += EmbedSky_backlight.o obj-$(CONFIG_FB_FSL_DIU) += fsl-diu-fb.o (4)进入配置界面,如图6.2: 图6.2 LCD配置单 (6) 重新编译内核,烧写到开发板。 52 基于S3C2440的Linux操作系统移植 53 基于S3C2440的Linux操作系统移植 结 论 嵌入式Linux系统移植和Linux设备驱动是整个系统开发的热点和难点,尤其是驱动程序,需要精通软硬件知识,对开发人员的专业知识要求很高,本文对理论知识进行了详细的讲解,操作部分只是简单地演示,并没有实作,因为具体的功能需要编写应用程序,在嵌入式系统开发中,应用程序的开发占整个周期的大部分时间,因为时间关系,本文就不详细介绍了。只是实现了将系统信息在串口中打印出,并且在Linux控制台上查询到文件系统的内容。 基于S3C2440的Linux操作系统移植 致谢 值此论文完成之际,首先向尊敬的邹老师表示感谢,感谢邹老师在论文编写期间给予的细心的指导和无私帮助。导师知识渊博,耐心负责,严谨务实,是我以后工作和学习中学习的榜样,在此向邹老师表达我深深的敬意。还要感谢我的同学,在论文编写,格式整理,定稿阶段给了我很多建议,衷心谢谢他们。 55 基于S3C2440的Linux操作系统移植 参考文献 [1]马洪兵,谷源涛.嵌入式系统硬件与软件架构.人民邮电出版社,2008年2月.17~25. [2]杨宗德嵌入式ARM系统原理与实例开发.北京大学出版社,2007.100~115. [3]李善平,刘文峰,王焕龙. Linux与嵌入式系统(第2版)北京:清华大学出版社,2006 73~76. [4]魏永明,耿岳,钟书毅.Linux设备驱动程序(第三版)中国电力出版社,2006.12~16. [5] 阎彬云立实.嵌入式系统原理与开发(第二版).西安电子科技大学出版社,2012.135~148. [6] 马忠梅. ARM嵌入式处理器结构与应用基础.北京:北京航空航天大学出版社,2002. 87~96. [7]庄严,王光宇.嵌入式Linux系统工程师实训教程.北京:清华大学出版社,2012. 197~205. [8]黄炎..嵌入式Linux应用开发.人民邮电出版社发行,2011.143~147. [9]R.Rajsuman.SoC设计与测试.北京:北京航空航天人学出版社,2003. 245~261. [10]陈赜主编.ARM9嵌入式技术及Linux高级实践教程.北京航空航天大学出版社,2005. 378~390. [11]许海燕,付炎著.嵌入式系统技术与应用.机械工业出版,2002. 462~472. [12]DavidA.Rusling.朱珂等译.Lmux编程.机械工业出版社,2000. 278~280. 56 因篇幅问题不能全部显示,请点此查看更多更全内容
Copyright © 2019- igbc.cn 版权所有 湘ICP备2023023988号-5
违法及侵权请联系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com
本站由北京市万商天勤律师事务所王兴未律师提供法律服务