




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、 随着电子技术和网络技术的发展,嵌入式系统随着电子技术和网络技术的发展,嵌入式系统在远程控制管理方面得到了越来越广泛的应用。嵌在远程控制管理方面得到了越来越广泛的应用。嵌入式系统自身具有体积小、功能强、价格便宜等优入式系统自身具有体积小、功能强、价格便宜等优点,而将远程控制软件移植进入嵌入式系统之中,点,而将远程控制软件移植进入嵌入式系统之中,能够让身处异地的人们随时方便地登录到远程个人能够让身处异地的人们随时方便地登录到远程个人计算机、远程服务器上,并对其进行控制管理操作、计算机、远程服务器上,并对其进行控制管理操作、故障诊断与维修等,并且可以分别控制和管理多台故障诊断与维修等,并且可以分别
2、控制和管理多台不同的电脑,同时反过来可以进行远程交流、远程不同的电脑,同时反过来可以进行远程交流、远程教育等。教育等。 概述概述 13.1需求分析需求分析 13.2 嵌入式嵌入式LinuxLinux系统移植系统移植13.3Tiny-XTiny-X及应用程序移植及应用程序移植 13.4RFBRFB协议简析及文件系统的裁剪协议简析及文件系统的裁剪 13.5 提及远程控制,大家都不会太陌生。我们都知道早期电脑中提及远程控制,大家都不会太陌生。我们都知道早期电脑中的远程控制技术,始于的远程控制技术,始于DOS时代,只不过当时由于技术上没有时代,只不过当时由于技术上没有什么大的变化,网络不发达,市场没有
3、更高的要求,所以远程什么大的变化,网络不发达,市场没有更高的要求,所以远程控制技术没有引起更多人的注意。但是,随着计算机网络技术控制技术没有引起更多人的注意。但是,随着计算机网络技术的高度发展,电脑管理及技术支持的需要,远程操作及控制技的高度发展,电脑管理及技术支持的需要,远程操作及控制技术越来越引起人们的关注。远程控制一般支持下面的这些网络术越来越引起人们的关注。远程控制一般支持下面的这些网络方式:方式:LAN、WAN、拨号方式、互联网方式。此外,有的远程、拨号方式、互联网方式。此外,有的远程控制软件还支持通过串口、并口、红外端口来对远程机进行控控制软件还支持通过串口、并口、红外端口来对远程
4、机进行控制(不过,这里指的远程机,只能是有限距离范围内的电脑)。制(不过,这里指的远程机,只能是有限距离范围内的电脑)。传统的远程控制软件一般使用传统的远程控制软件一般使用NETBEUI、NETBIOS、IPXSPX、TCPIP等协议来实现远程控制,不过,随着网络技术的发展,等协议来实现远程控制,不过,随着网络技术的发展,目前很多远程控制软件提供通过目前很多远程控制软件提供通过Web页面以页面以Java技术来控制远技术来控制远程电脑,这样可以实现不同操作系统下的远程控制。程电脑,这样可以实现不同操作系统下的远程控制。 目前,能实现远程控制管理的软件很多,例如Windows自带的终端服务,PCA
5、nyWhere和冰河等,但是它们要么程序很大占用系统过多空间;要么使用起来过于麻烦、不宜配置;或是需要注册付费;抑或使用效率低下速度慢。经比较,VNC软件是一款值得推荐的远程控制软件。 VNC采用远程帧缓存(RFB)协议进行通信,它的主要应用是使用户能够利用VNC客户端连接到正在运行的远程VNC服务器,并借由网络,传送键盘与鼠标的动作及即时的屏幕画面,实现远程图形化操作。VNC软件主要由两个部分组成:VNC服务端及VNC客户端。用户需先将VNC服务端安装在目标计算机上,才能够在本地计算机上执行VNC客户端进行控制。VNC支持多种操作系统,如Unix系列(Unix、Linux、Solaris等)
6、、Windows及Mac操作系统。VNC运行的工作流程如下:(1) VNC客户端通过嵌入式Linux中的VNC Viewer连接至远程VNC Server。(2) VNC Server传送一对窗口至客户端,要求输入连接密码,以及存取的VNC Server显示装置。(3) 在客户端输入联机密码后,VNC Server验证客户端是否具有存取权限。(4) 若是客户端通过VNC Server验证,客户端即要求VNC Server显示桌面环境。(5) 被控端将画面显示控制权交由VNC Server负责。(6) VNC Server将把被控端的桌面环境利用VNC通信协议送至客户端,并且允许客户端控制VNC
7、 Server的桌面环境及输入装置。 作为一个基于嵌入式系统的远程控制实现,无论是硬件方面的电路板体积、成本,电路的性能,还是软件方面的功能实现、运行效率和稳定性等,都会受到资源限制的影响。因此在进行软硬件开发之前要进行详细的需求分析。 13.2.1 13.2.1 软件需求分析软件需求分析1、交叉编译工具、交叉编译工具 2、Bootloader引导程序引导程序 3、Linux内核内核 4、Linux根文件系统根文件系统5、Tiny-X及相关应用程序及相关应用程序1交叉编译工具 工欲善其事,必先利其器。嵌入式Linux系统开发离不开交叉编译工具。交叉开发工具链就是为了编译、链接、处理和调试跨平台
8、体系结构的程序代码。主机端装好Linux操作系统后,就可以准备配置、制作自己的编译工具。如果要基于Gcc和glibc来制作工具链,可以使用crosstool来进行编译;如果要基于Gcc和uClibc来制作工具链,可以使用buildroot来进行编译。如果不借助这些工具,编译过程是非常繁琐的。uClibc比glibc小,在已有的接口上是兼容的,更适用于嵌入式系统。但是uClibc并没有包括glibc中的所有接口实现,因此有些应用程序可能在uClibc中不能编译。基于这个原因,本章使用glibc和Gcc来制作工具链。2Bootloader引导程序 我们知道,当按下PC机的启动电源时,CPU会首先运
9、行固化在CMOS中的BIOS(Basic Input Output System)程序。BIOS程序的主要任务是对各种硬件设备进行自检和初始化,然后运行位于硬盘MBR(Master Boot Record)上的操作系统加载程序。操作系统加载程序负责把操作系统加载到内存中,并启动操作系统。 在嵌入式系统中是没有BIOS程序的,从开机硬件初始化到启动操作系统内核完全是由Bootloader程序完成的。Bootloader是嵌入式系统中最先运行的程序。Bootloader启动后首先对硬件进行初始化、建立内存的映射图等,其目的是为内核准备好软硬件运行环境;接着Bootloader会把内核加载到内存中合
10、适的位置并跳转到内核的入口处启动内核。3Linux内核 Linux内核主要由进程调度、内存管理、虚拟文件系统、网络接口、进程间通信等5个子系统组成,是构建Linux系统的核心组成部分。在2.6版本内核以前,并没有专门针对嵌入式平台进行支持。所以把Linux 2.6版本以前的内核移植到嵌入式平台上时必须安装相应的补丁。Linux 2.6内核于2003年12月发布,在2.4内核的基础上作了极大的改进。使用了新的调度器,进程的切换更高效;内核可以被抢占,使得用户的操作可以得到更快速的响应;I/O子系统也经历了很大的修改,使得它在各种工作负荷下都更具响应性;模块子系统、文件系统都做了大量的改进。本章移
11、植Linux-版本的内核。4Linux根文件系统 Linux中没有类似于Windows下的C、D、E等盘符的概念,它以树状机构管理所有目录、文件,其他分区挂接在某个目录上,这个目录被称为挂接点(mount point),然后就可以通过这个目录来访问这个分区上的文件了。 在一个分区上存储文件时,需要遵循一定的格式,这种格式称为文件系统类型,比如fat、ntfs、ext2、ext3、jffs2、yaffs等。除这些拥有实实在在的存储分区的文件系统类型外,Linux还有几种虚拟的文件系统类型,比如proc、sysfs等,它们的文件并不存储在实际的设备上,而是在访问它们时由内核临时生成
12、。5Tiny-X及相关应用程序 X窗口系统(X Windowing System)提供了Linux桌面图形系统。X系统中的窗口环境采用客户端/服务端(C/S)模式。X系统应用程序是客户端,它们和服务器通信,向服务器发送请求并且接收服务器发送的信息。X系统的服务器控制显示和处理来自客户端的请求。应用程序(客户端)只需要知道如何与服务器端通信,并不需要知道显示设备绘制图形的操作细节。这个通信机制(协议)能在任何提供八位字节流的进程间通信机制上工作。X使用了socket接口来达到通信协议的一致性。因为X系统是基于socket的,所以它可以在网络中运行并且能很好远程绘图(Remote graphics
13、)。X客户端使用X窗口系统提供的API在屏幕上绘制对象。这些API是函数库X-lib中的一部分,用它连接客户端应用程序。本章移植的是体积小巧,但功能强大的Tiny-X。13.2.2 13.2.2 硬件需求分析硬件需求分析1嵌入式开发目标板 目前市面上流行的嵌入式开发板款式很多,本章采用友善之臂推出的mini2440开发板进行开发,它是一种集成了S3C2440处理器以及各类外设的电路板。它不但提供了运行嵌入式系统的基本平台,还提供了开发和调试嵌入式软件系统的硬件平台。其板上主要配备了以下相关部件:l CPU处理器,Samsung S3C2440A,主频 400M Hz,最高 533M Hz;l
14、64MB SDRAM内存,时钟频率高达 100M Hz;l 2MB NOR Flash,掉电非易失;l 128MB NAND Flash,掉电非易失;l 3.5寸真彩LCD,分别率为240320;l USB Host、USB Slave B 型接口各一个;l DM9000网卡一块;l 音频输入输出(本章未用到);l 标准SDMMC卡座。2嵌入式开发主机 在PC主机上,Linux已经成为优秀的计算机操作系统。各种Linux发行版本,可以直接在PC机上安装,功能十分强大。它不仅能够支持各种处理器和外围设备接口,而且提供了图形化的用户交互界面和丰富的开发环境,更重要的是Linux系统性能稳定。 进行
15、开发之前,事先在PC主机上安装Linux操作系统,这里安装的是Ubuntu9.10操作系统。开发主机上应配备有25针的并行接口一个,用来连接JTAG,下载Bootloader到NOR Flash中;9针的RS-232串行接口一个,用于打印开发板启动、调试信息并能输入控制命令;至少一块网卡,用于网络传输文件。 Linux操作系统的移植主要包括移植BootLoader、移植Linux内核、移植相应的驱动程序和构建文件系统。 使某个平台的代码运行在其他平台上的过程叫做移植。Linux操作系统是一种遵循GPL协议的开源系统,其内核可以进行剪裁,并且支持32位和64位的CPU,可以运行在ARM、Powe
16、rPC、M68k等多种硬件平台上。13.3.1 13.3.1 交叉开发环境的构建交叉开发环境的构建1. 交叉开发模式 所谓的交叉开发模式就是指在主机上编辑、编译程序,然后在目标板上运行、验证程序的过程。图13-1所示是交叉开发模式。图13-1 交叉开发模式目标板和主机之间通常可以使用JTAG接口、串口、以太网接口以及USB接口等方式进行连接。JTAG接口传输方式:JTAG仿真器跟主机之间连接,将第一个引导程序烧写进入Nor Flash之中。串口传输方式:主机端通过kermit、minicom或者windows超级终端等工具都可以通过串口打印目标板程序运行、调试信息,另外它是嵌入式开发的重要控制
17、台。网络传输方式:网络传输方式一般采用NFS、TFTP等协议传输文件。USB接口传输方式:通常分主从设备端,主机端为主设备端,目标板端为从设备端。用于下载测试应用程序到目标板中。2. 交叉编译环境 交叉编译通俗地讲就是在一种平台上编译出能运行在体系结构不同的另一种平台上的程序,比如在PC平台(X86 CPU)上编译出能运行在以ARM为内核的CPU平台上的程序,编译得到的程序在X86 CPU平台上是不能运行的,必须放到ARM CPU平台上才能运行,所以要生成在目标机上运行的程序,必须要用交叉编译工具链来完成。在裁减和定制Linux内核用于嵌入式系统之前,由于一般嵌入式开发系统的资源有限,通常都要
18、在PC上建立一个用于目标机的交叉编译工具链,用该交叉编译工具链在PC上编译目标机上要运行的程序。交叉编译工具链是一个由编译器、连接器和解释器组成的综合开发环境,交叉编译工具链主要由binutils、gcc和glibc 3个部分组成。 建立交叉编译工具链是一个相当复杂的过程,如果不想自己经历复杂繁琐的编译过程,网上有一些编译好的可用的交叉编译工具链可以下载,但就以学习为目的来说读者有必要学习自己制作一个交叉编译工具链。下面就通过具体的实例讲述基于ARM的嵌入式Linux交叉编译工具链的制作过程。 首 先 下 载 c r o s s t o o l - 0 . 4 3 . t a r . g z
19、, 其 官 方 网 站 是http:/ http:/ -zxvf crosstool-0.43.tar.gz 解压缩后查看目录中的文件,其中包含很多的Shell脚本文件,编辑其中的demo-arm.sh文件,其中第7行制定编译过程中软件包下载路径,第8行制定交叉编译工具链的安装路径。取消第25行的注释(这里我们要建立一个gcc-3.3.6,glibc-2.3.2的交叉编译链)同时修改notest为gdb还可以同时创建arm-linux-gdb的交叉调试工具。#!/bin/sh# This script has one line for each known working toolchain#
20、 for this architecture. Uncomment the one you want.# Generated by generate-demo.pl from buildlogs/all.dats.txtset -exTARBALLS_DIR=$HOME/downloadsRESULT_TOP=/usr/local/crosstoolexport TARBALLS_DIR RESULT_TOPGCC_LANGUAGES=c,c+export GCC_LANGUAGES# Really, you should do the mkdir before running this,#
21、and chown /opt/crosstool to yourself so you dont need to run as root.mkdir -p $RESULT_TOP#eval cat arm.dat gcc-2.95.3-glibc-2.1.3.dat sh all.sh -notest#eval cat arm.dat gcc-2.95.3-glibc-2.2.2.dat sh all.sh -notest#eval cat arm.dat gcc-2.95.3-glibc-2.2.5.dat sh all.sh -notest#eval cat arm.dat gcc-3.2
22、.3-glibc-2.2.5.dat sh all.sh -notest#eval cat arm.dat gcc-3.2.3-glibc-2.3.2.dat sh all.sh -notest#eval cat arm.dat gcc-3.2.3-glibc-2.3.2-tls.dat sh all.sh -notest#eval cat arm.dat gcc-3.3.6-glibc-2.2.2.dat sh all.sh -notest#eval cat arm.dat gcc-3.3.6-glibc-2.2.5.dat sh all.sh -notesteval cat arm.dat
23、 gcc-3.3.6-glibc-2.3.2.dat sh all.sh -gdb#eval cat arm.dat gcc-3.3.6-glibc-2.3.2-tls.dat sh all.sh -notest修改arm.dat文件,将TARGET=arm-unknown-linux-gnu改为TARGET=arm-linux,保证编译出来的工具是常用的名字。KERNELCONFIG=pwd/arm.configTARGET=arm-linuxTARGET_CFLAGS=-O最后一步,保证网络的畅通,以普通用户的权限来执行demo-arm.sh脚本文件。./demo-arm.sh它会自动从网
24、络下载所需的软件包并且进行编译,整个编译过程大概需要12个小时。如果没出现意外情况的话,会在“/usr/local/crosstool”目录下生成一套交叉编译工具链。把制作好的交叉编译工具链添加到当前的环境变量当中,只需要修改主目录下的.bashrc文件,在文件末尾添加export PATH=/usr/local/crosstool/gcc-3.3.6-glibc-2.3.2/bin:$PATH,并且重新读取到当前的环境变量当中就可以了。echo export PATH=/usr/local/crosstool/gcc-3.3.6-glibc-2.3.2/bin:$PATH .bashrcso
25、urce .bashrc3主机开发工具安装与配置1)串口控制台工具 串行通讯接口很适合作为控制台,在各种操作系统上一般都有现成的控制台程序可以使用。Windows操作系统有超级终端(Hyperterminal)工具;Linux/UNIX操作系统有Minicom、C-Kermit等工具。本文用的是Linux下的minicom,首先安装Minicom到系统中,然后通过在Shell下执行“minicom -s”命令进行配置,配置菜单如图13-2所示。当需要使用时,执行“sudo minicom”运行,退出时执行“Ctrl+A+Q”组合键即可。图13-2 minicom配置菜单2)NFS服务 NFS服
26、务的主要任务是把本地的一个目录通过网络输出,其他计算机可以远程挂接这个目录并且访问文件。NFS服务有自己的协议和端口号,但是在文件传输或者其他相关信息传递的时候,NFS则使用远程过程调用(RPC,Remote Procedure Call)协议。NFS是嵌入式开发不可或缺的工具。首先安装NFS服务软件,执行以下命令会自动下载安装:$sudo apt-get install nfs-kernel-server portmap它的配置文件为/etc/eXports,在里面可以增加想要通过网络文件系统访问的目录,本文配置内容如下:/nfsboot *(rw,sync,no_root_squash)
27、13.3.2 13.3.2 BootloaderBootloader的移植的移植 简单地说,简单地说,Bootloader 就是在操作系统内核运行之就是在操作系统内核运行之前运行的一段小程序。通过这段小程序,我们可以初始前运行的一段小程序。通过这段小程序,我们可以初始化硬件设备、建立内存空间的映射图,从而将系统的软化硬件设备、建立内存空间的映射图,从而将系统的软硬件环境带到一个合适的状态,以便为最终调用操作系硬件环境带到一个合适的状态,以便为最终调用操作系统内核准备好正确的环境。统内核准备好正确的环境。 通常通常Bootloader是严重地依赖于硬件而实现的,特别是严重地依赖于硬件而实现的,特
28、别是在嵌入式世界。因此,在嵌入式世界里建立一个通用是在嵌入式世界。因此,在嵌入式世界里建立一个通用的的Bootloader几乎是不可能的。尽管如此,我们仍然可以几乎是不可能的。尽管如此,我们仍然可以对对 Bootloader 归纳出一些通用的概念来,以指导用户特归纳出一些通用的概念来,以指导用户特定的定的 Bootloader 设计与实现。设计与实现。 Bootloader可以分为以下两种操作模式。(1) 启动加载(Boot loading)模式。上电后,Bootloader从板子上的某个固态存储设备上将操作系统加载到RAM中运行,整个过程并没有用户介入。产品发布时,Bootloader工作在
29、这种模式下。(2) 下载(Down loading)模式。在这种模式下,开发人员可以使用各种命令,通过串口连接或网络连接等通信手段从主机下载文件(比如内核镜像、文件系统镜像),将它们直接放在内存中运行或烧入Flash类固态存储设备中。 由于Bootloader的实现依赖CPU的体系结构,因此大多数Bootloader 都分为 stage1和stage2 两大部分。依赖于CPU体系结构的代码,比如设备初始化代码等,通常都放在stage1 中,而且通常都用汇编语言来实现,以达到短小精悍的目的。而 stage2 则通常用C语言来实现,这样可以实现给复杂的功能,而且代码会具有更好的可读性和可移植性。B
30、ootloader 的 stage1 通常包括以下步骤(以执行的先后顺序):l硬件设备初始化。l为加载 Bootloader 的 stage2 准备 RAM 空间。l拷贝 Bootloader 的 stage2 到 RAM 空间中。l设置好堆栈。l跳转到 stage2 的 C 入口点。Bootloader 的 stage2 通常包括以下步骤(以执行的先后顺序):l初始化本阶段要使用到的硬件设备。l检测系统内存映射(memory map)。l将 kernel 映像和根文件系统映像从 flash 上读到 RAM 空间中。l为内核设置启动参数。l调用内核。这是 Bootloader 一开始就执行的操
31、作,其目的是为 stage2 的执行以及随后的 kernel 的执行准备好一些基本的硬件环境。它通常包括以下步骤(以执行的先后顺序):(1)屏蔽所有的中断。为中断提供服务通常是 OS 设备驱动程序的责任,因此在 Boot loader 的执行全过程中可以不必响应任何中断。中断屏蔽可以通过写 CPU 的中断屏蔽寄存器或状态寄存器(比如 ARM 的 CPSR 寄存器)来完成。(2)设置 CPU 的速度和时钟频率。(3)RAM 初始化。包括正确地设置系统的内存控制器的功能寄存器以及各内存库控制寄存器等。(4)初始化 LED。典型地,通过 GPIO 来驱动 LED,其目的是表明系统的状态是 OK 还是
32、 Error。如果板子上没有 LED,那么也可以通过初始化 UART 向串口打印 Bootloader 的 Logo 字符信息来完成这一点。(5)关闭 CPU 内部指令数据 cache。13.3.3 Linux13.3.3 Linux内核的移植内核的移植1、Linux内核的定制原理内核的定制原理 2、Linux内核源码结构内核源码结构 3、配置和编译内核源码、配置和编译内核源码4、对、对YAFFS文件系统的支持文件系统的支持 1Linux内核的定制原理 定制内核的根本目的是使内核能够根据嵌入式系统的软硬件需求为应用程序提供一个专用的运行平台。从实现的角度看,定制内核就是有针对性地定制内核的各项
33、功能。定制程序功能的基本方法有两种:一是直接修改程序的源代码,二是添加或删除源文件。但是这两种方法的效率都很低,而且一旦出现错误也不容易改正,所以并不适合于代码量大的程序。对于源代码量达到上百万行的Linux内核来说,通过直接修改源代码的方式来进行定制更加行不通。 在Linux内核中,几乎每个目录下都有Makefile文件。面对数量众多、结构复杂的Makefile文件,仅仅依靠手工的方式来定制Makefile同样是不合适的。为此,Linux内核把哪些源文件需要被编译和链接的规则都记录在.config文件中。由Makefile文件根据.config文件中的规则来控制源文件的编译过程。这样一来,M
34、akefile文件的定制就又转变成了.config文件的定制。为了提高.config文件的定制效率,需要使用内核配置工具。它们分别通过以下命令启动。make config。它采用文本的操作界面。用户通过输入y或n来配置内核的功能。由于需要逐一操作每个配置选项,所以配置的效率非常低。make menuconfig。它采用菜单操作界面。如图13-3所示。图13-3 内核配置菜单2Linux内核源码结构 Linux内核文件数目将近2万,除去其他架构CPU的相关文件,支持S3C2410、S3C2440这两款芯片的完整内核文件也有1万多个。这些文件的组织结构并不复杂,它们分别位于顶层目录下的各个子目录中
35、。表13-1描述了主要目录的功能。表13-1 Linux内核子目录结构目录名描述arch体系结构相关代码,例如arch/arm、arch/i386block块设备的通用函数crypto常用的加密和散列算法,还有一些压缩和CRC校验算法drivers所有的设备驱动,例如drivers/char、drivers/mtdDocumentation内核文档fsLinux支持的文件系统代码,比如fs/jffs2、fs/ext2include内核头文件,有基本头文件、各种驱动或功能部件头文件、各种体系相关的头文件init内核的初始化代码,其中的main.c文件中的start_kernel函数是内核引导后运
36、行的第一个函数ipc进程间通信的代码kernel内核管理的核心代码lib内核用到的一些库函数代码mm内存管理代码net网络支持代码,每个子目录对应于网络的一个方面security安全、密钥相关代码sound音频设备的驱动程序scripts用于配置、编译内核的脚本文件usr用来制作一个压缩的cpio归档文件:initrd的镜像,它可以作为内核启动后挂载的第一个文件系统3. 配置和编译内核源码本章编译Linux-版本的内核。首先,修改内核根目录下的Makeflle文件,这个文件中需修改的内容包括以下两个方面。(1)指定目标平台:修改前 ARCH?= & (SUBARCH)修
37、改后 ARCH?= arm(2)指定交叉编译器:修改前CROSS_COMPILE ?=修改后CROSS_COMPILE ?= arm-linux-然后,修改MTD(即内存技术设备)分区,在arch/arm/mach-s3c2440/mach-mini2440.c文件中,本章将Nand Flash划分为3个区,前1MB用于存放引导程序,接下来的3MB用于存放嵌入式内核,剩下的空间用来存放yaffs文件系统,分区结构如下所示:static struct mtd_partition mini2440_default_nand_part _initdata = 0 = .name= u-boot,.s
38、ize= 0 x00100000,.offset= 0,1 = .name= kernel,.size= 0 x00300000,.offset= 0 x00100000,2 = .name= root,.size= MTDPART_SIZ_FULL,.offset= 0 x00400000,;4. 对YAFFS文件系统的支持(1)首先,获取YAFFS2的源代码从http:/www.aleph1.co.uk/cgi-bin/viewcvs.cgi/yaffs2/下载并且解压缩,YAFFS2目录下有一个脚本文件可以用来给内核打补丁。./patch-ker.sh /c path其中/c这个参数用来
39、将YAFFS2的代码复制到内核的相应目录下,path是内核源代码的路径。(2)其次,配置内核时选中YAFFS2支持: File systems一 Miscellaneous filesystems一 YAFFS2 file system support13.3.4 Linux13.3.4 Linux根文件系统的构建根文件系统的构建 文件系统是一种用于向用户提供底层数据访问的机制。它将设备中的空间划分为特定大小的块(扇区),一般每块512字节。数据存储在这些块中,大小被修正为占用整数个块。由文件系统软件来负责将这些块组织为文件和目录,并记录哪些块被分配给了哪个文件,以及哪些块没有被使用。不过,文
40、件系统并不一定只在特定存储设备上出现。它是数据的组织者和提供者,至于它的底层,可以是磁盘,也可以是其它动态生成数据的设备(比如网络设备)。1. Linux文件系统层次标准介绍 因为Linux的开发人员实在太多了,如果每个人都使用自己的目录配置方法,那么将可能会带来很多管理问题。所以,后来就有所谓的文件系统层次标准(Filesystem Hierarchy Standard,FHS)出台。它定义了文件系统中的目录、文件分类存放的原则,定义了系统运行所需的最小文件、目录的集合。下面分别介绍一下各个目录的作用。(1)/bin 基础系统所需要的那些命令位于此目录,也是最小系统所需要的命令;比如 ls、
41、cp、mkdir等命令;功能和/usr/bin类似,这个目录中的文件都是可执行的,普通用户都可以使用的命令。做为基础系统所需要的最基础的命令就是放在这里。(2)/boot Linux的内核及引导系统程序所需要的文件,比如 vmlinuz initrd.img 文件都位于这个目录中。在一般情况下,GRUB或LILO系统引导管理器也位于这个目录;(3)/dev 设备文件存储目录,比如声卡、磁盘. .(4)/etc 系统配置文件的所在地,一些服务器的配置文件也在这里;比如用户帐号及密码配置文件;(5)/home 普通用户家目录默认存放目录;(6)/lib 库文件存放目录(7)/lost+found
42、在ext2或ext3文件系统中,当系统意外崩溃或机器意外关机,而产生一些文件碎片放在这里。当系统启动的过程中fsck工具会检查这里,并修复已经损 坏的文件系统。 有时系统发生问题,有很多的文件被移到这个目录中,可能会用手工的方式来修复,或移到文件到原来的位置上。(8)/media 即插即用型存储设备的挂载点自动在这个目录下创建,比如USB盘系统自动挂载后,会在这个目录下产生一个目录 ;CD/DVD自动挂载后,也会在这个目录中创建一个目录,类似cdrom 的目录。这个只有在最新的发行套件上才有,比如Fedora等。可以参看/etc/fstab的定义;(9)/mnt 这个目录一般是用于存放挂载储存
43、设备的挂载目录的,比如有cdrom 等目录。可以参看/etc/fstab的定义。有时我们可以把让系统开机自动挂载文件系统,把挂载点放在这里也是可以的。主要看/etc/fstab中怎么定义了;比如光驱可以挂载到/mnt/cdrom 。(10)/proc 操作系统运行时,进程(正在运行中的程序)信息及内核信息(比如cpu、硬盘分区、内存信息等)存放在这里。/proc目录伪装的文件系统proc的挂载目录,proc并不是真正的文件系统。(11)/root Linux超级权限用户root的家目录;/sbin 大多是涉及系统管理的命令的存放,是超级权限用户root的可执行命令存放地,普通用户无权限执行这个
44、目录下的命令,这个目录和/usr/sbin或(12)/usr/local/sbin目录是相似的。(13)/tmp 临时文件目录,有时用户运行程序的时候,会产生临时文件。/tmp就用来存放临时文件的。/var/tmp目录和这个目录相似。(14)/usr 这个是系统存放程序的目录,比如命令、帮助文件等。这个目录下有很多的文件和目录。当我们安装一个Linux发行版官方提供的软件包时,大多安装在这里。 如果有涉及服务器配置文件的,会把配置文件安装在/etc目录中。/usr目录下包括涉及字体目录/usr/share/fonts,帮助目录 (15)/usr/share/man或/usr/share/doc
45、,普通用户可执行文件目录/usr/bin 或/usr/local/bin。超级权限用户root的可执行命令存放目录,比如 /usr/sbin 或/usr/local/sbin 等;还有程序的头文件存放目录/usr/include。(16)/var 这个目录的内容是经常变动的,看名字就知道,我们可以理解为vary的缩写,/var下有/var/log 这是用来存放系统日志的目录。/var/www目录是定义Apache服务器站点存放目录;/var/lib 用来存放一些库文件。(17)/etc/init.d 这个目录是用来存放系统或服务器以System V模式启动的脚本,这在以System V模式启动
46、或初始化的系统中常见。/etc/xinit.d 如果服务器是通过xinetd模式运行的,它的脚本要放在这个目录下。/etc/rc.d 这是BSD方式启动脚本的存放地;比如定义网卡,服务器开启脚本等。2. 移植Busybox 构建Linux根文件系统,就是参照FHS的标准创建相应的目录,并且在其中存放各种可执行程序,建立相关的配置文件以及相应的库文件。这里我们采用的是Busybox工具,它是遵循GPL协议的一个开源的工具,最初是为了Debian安装盘编写的,其目的是在一张软盘上创建一个可引导的Linux系统,可以用于安装盘和急救盘,其大小在1.44MB以内。它将众多的Unix命令集合到一个可执行
47、文件当中,很多标准的Linux工具都可以共享很多相同的元素,这些工具被合并到一个可执行程序中,就可以共享这些相同的元素,从而产生更小的可执行程序。Busybox在设计时充分的考虑了硬件资源受限的环境,通过不同的符号链接来选择到底执行哪一个命令,这对资源紧张的嵌入式Linux系统来说再合适不过了。首先下载busybox,http:/,这里我们用的是busybox-1.3.0,解压缩以后,修改Makefile文件移植前 ARCH?= & (SUBARCH)移植后 ARCH?= arm指定交叉编译器: 移植前CROSS_COMPILE ?=移植后CROSS_COMPILE ?=arm-lin
48、ux-3. 构建Linux根文件系统1 首先建立etc目录和一些基本的配置文件。mkdir -p etc/init.d/ & touch etc/inittab & touch etc/init.d/rcS & touch etc/fstab & touch etc/resolv.conf2 参考busybox example目录下的inittab文件编辑etc/inittab文件如下# /etc/inittab:sysinit:/etc/init.d/rcSttySAC0:askfirst:/bin/sh:ctrlaltdel:/sbin/reboot:shu
49、tdown:/bin/umount -a -r 3 编辑etc/init.d/rcS文件,配置ip#! /bin/shPATH=/sbin:/bin:/usr/sbin:/usr/bin:/usr/local/bin:/sbin/ifconfig lo netmask upifconfig eth0 0 netmask uproute add default gw mount -a然后执行chmod 755 etc/init.d/rcS添加可执行权限。4 编辑etc/reso
50、lv.conf修改添加dns配置echo nameserver etc/resolv.conf5 编辑etc/fstab文件,这是一个用来定义系统开机后自动挂载的配置文件#device mount-pointtype optiondump fsckorderproc/procprocdefaults 0 0ramfs/tmpramfsdefaults 0 0sysfs/syssysfsdefaults 0 0ramfs/devramfsdefaults 0 0var/varramfsdefaults 0 0表13-2常见的设备节点设备节点名称设备类型主设备号次设备号
51、文件权限说明console字符51600控制台mem字符11600物理内存null字符13666空设备random字符18644随机数发生器tty字符50666控制台tty0字符40600虚拟控制台tty1字符41600虚拟控制台ttyS0字符464600第一个串口zero字符15666零设备mknod -m 600 console c 5 1mknod -m 600 mem c 1 1mknod -m 666 null c 1 3mknod -m 644 random c 1 8mknod -m 666 tty c 5 0mknod -m 600 tty0 c 4 0mknod -m 600
52、 tty1 c 4 1mknod -m 600 ttyS0 c 4 64mknod -m 666 zero c 1 56 最后创建一些其他的目录mdir proc mnt tmp sys root 这样一个基本的文件系统就已经做好了,把做好的目录按照FHS标准放在自建的rootfs目录下面。现在需要制作YAFFS2文件系统映像文件,在YAFFS2源码目录下有一个utils目录,下面有编译好的mkyaffs2image的代码,编译好了以后就可以用来制作YAFFS2文件系统映像文件了。7 利用mkyaffsimage工具制作根文件系统镜像,例如根文件系统放在/nfsboot目录下,可以执行如下命令
53、完成:mkyaffsimage /nfsboot rootfs.img 把rootfs.img复制到NFS目录后,在U-Boot控制界面就可以将镜像下载到开发板内存、继而把镜像烧入到Nand Flash中,操作命令如下:nfs 0 x30008000 05:/nfsboot/rootfs.imgnand erase 0 x400000 0 x7c00000nand write.yaffs 0 x30008000 0 x400000 $(filesize)修改U-Boot的命令行参数以MTD2分区作为根文件系统,设置如下:setenv bootargs noinitrd c
54、onsole=ttySAC0 root=/dev/mtdblock2 rootfstype=yaffssaveenv启动开发板就可以了。当开发测试时,可以设置U-Boot从NFS启动,这时的设置为:setenv bootargs console=ttySAC0 init=/linuxrc mem=64M root=/dev/nfs rw nfsroot=05:/nfsboot,proto=tcp,nfsvers=3,nolock ip=00:05:05::wenjun24x0:et
55、h0:offsetenv bootcmd nfs 0 x30008000 05:/nfsboot/uImage; bootmsaveenv 13.4.1 Linux X图形系统和嵌入式X13.4.2 配置编译配置编译Tiny-X 13.4.3 编译编译Matchbox 13.4.4 编译编译VNC Viewer 13.4.5 编译编译Xterm 13.4.1 13.4.1 Linux X图形系统和嵌入式X X窗口系统(窗口系统(X Windowing System)提供了)提供了Linux桌面图桌面图形系统。形系统。X系统中的窗口环境采用客户端系统中的窗口环境采用客户端/
56、服务端(服务端(C/S)模式。)模式。X系统应用程序是客户端,它们和服务器通信,向服务器发送请系统应用程序是客户端,它们和服务器通信,向服务器发送请求并且接收服务器发送的信息。求并且接收服务器发送的信息。X系统的服务器控制显示和处理系统的服务器控制显示和处理来自客户端的请求。应用程序(客户端)只需要知道如何与服务来自客户端的请求。应用程序(客户端)只需要知道如何与服务器端通信,并不需要知道显示设备绘制图形的操作细节。这个通器端通信,并不需要知道显示设备绘制图形的操作细节。这个通信机制(协议)能在任何提供八位字节流的进程间通信机制上工信机制(协议)能在任何提供八位字节流的进程间通信机制上工作。作
57、。X使用了使用了socket接口来达到通信协议的一致性。因为接口来达到通信协议的一致性。因为X系统系统是基于是基于socket的,所以它可以在网络中运行并且能很好远程绘图的,所以它可以在网络中运行并且能很好远程绘图(Remote graphics)。)。X客户端使用客户端使用X窗口系统提供的窗口系统提供的API在屏在屏幕上绘制对象。这些幕上绘制对象。这些API是函数库是函数库X-lib中的一部分,用它连接客中的一部分,用它连接客户端应用程序。户端应用程序。 13.4.2 13.4.2 配置编译配置编译Tiny-XTiny-X1、解压缩源代码、解压缩源代码 2、建立临时目录、建立临时目录 3、修
58、改和添加配置文件、修改和添加配置文件4、修改、修改armtinyx/lib/X11/Makefile文件文件5、编译和安装、编译和安装Tiny-X 6、测试、测试Tiny-X1编译Tiny-X的依赖软件本章编译的所有软件都安装到/usr/arm目录下,配置时指定“-prefix=/usr/arm”。它们之间也存在依赖关系,所以按照一定顺序进行交叉编译,共计14个软件包。具体过程如下:1) zlibtar zxvf zlib-1.2.3.tar.gzcd zlib-1.2.3CC=arm-linux-gcc./configure -prefix=/usr/arm -sharedmakemake
59、install2)libpngtar jxvf libpng-1.2.33.tar.bz2cd libpng-1.2.33CC=arm-linux-gcc./configure -host=arm-linux -prefix=/usr/arm makemake install3)expattar zxvf expat-2.0.1.tar.gzcd expat-2.0.1CC=arm-linux-gcc./configure -host=arm-linux -prefix=/usr/armmake make install4)freetypetar jxvf freetype-2.3.7.tar
60、.bz2cd freetype-2.3.7CC=arm-linux-gcc./configure -host=arm-linux -prefix=/usr/armmakemake install5)libxmltar zxvf libxml2-2.6.31.tar.gzcd libxml2-2.6.31CC=arm-linux-gcc./configure -host=arm-linux -prefix=/usr/armmakemake install6)fontconfigtar zxvf fontconfig-2.6.0.tar.gzcd fontconfig-2.6.0CC=arm-linux-gccexport LIBXML2_
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025辽宁沈阳地铁三号线招安检员和安保员笔试参考题库附带答案详解
- 2025届百师联盟高三上学期一轮复习联考(五)历史试题及答案
- 2025江苏无锡市宜兴市诚信人力资源服务有限公司招聘17人笔试参考题库附带答案详解
- 教玩具制作知到智慧树章节测试课后答案2024年秋山东女子学院
- 2025年福建省晋江人力资本有限公司招聘1人(第一批)笔试参考题库附带答案详解
- 2025年安徽港航集团所属企业招聘13人笔试参考题库附带答案详解
- 公务用车定点维修服务计划、管理方案
- 2025宁夏中卫市中宁县丰安屯旅游发展有限公司面向社会招聘16名笔试参考题库附带答案详解
- 2025中国大唐集团科技创新有限公司招聘14人笔试参考题库附带答案详解
- 2024辽宁沈阳盛京金控投资集团有限公司拟聘用人员笔试参考题库附带答案详解
- 《绘本教学》课件
- LIMS实验室信息管理系统
- 柱塞泵工作原理动画演示
- 数字法学原理
- 玉米收购可行性分析报告
- 最全医院应急预案汇编目录
- 驾驶员心理健康教育培训课件
- 别墅的价格评估报告
- 沪科版七年级数学下册 第六章 实数 单元测试卷
- 无痛胃肠镜的护理查房
- 农村生活污水检测服务方案
评论
0/150
提交评论