版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第13章嵌入式VNC远程控制的实现
随着电子技术和网络技术的开展,嵌入式系统在远程控制管理方面得到了越来越广泛的应用。嵌入式系统自身具有体积小、功能强、价格廉价等优点,而将远程控制软件移植进入嵌入式系统之中,能够让身处异地的人们随时方便地登录到远程个人计算机、远程效劳器上,并对其进行控制管理操作、故障诊断与维修等,并且可以分别控制和管理多台不同的电脑,同时反过来可以进行远程交流、远程教育等。第13章嵌入式VNC远程控制的实现概述13.1需求分析13.2
嵌入式Linux系统移植13.3Tiny-X及应用程序移植
13.4RFB协议简析及文件系统的裁剪
13.513.1概述
提及远程控制,大家都不会太陌生。我们都知道早期电脑中的远程控制技术,始于DOS时代,只不过当时由于技术上没有什么大的变化,网络不兴旺,市场没有更高的要求,所以远程控制技术没有引起更多人的注意。但是,随着计算机网络技术的高度开展,电脑管理及技术支持的需要,远程操作及控制技术越来越引起人们的关注。远程控制一般支持下面的这些网络方式:LAN、WAN、拨号方式、互联网方式。此外,有的远程控制软件还支持通过串口、并口、红外端口来对远程机进行控制〔不过,这里指的远程机,只能是有限距离范围内的电脑〕。传统的远程控制软件一般使用NETBEUI、NETBIOS、IPX∕SPX、TCP∕IP等协议来实现远程控制,不过,随着网络技术的开展,目前很多远程控制软件提供通过Web页面以Java技术来控制远程电脑,这样可以实现不同操作系统下的远程控制。目前,能实现远程控制管理的软件很多,例如Windows自带的终端效劳,PCAnyWhere和冰河等,但是它们要么程序很大占用系统过多空间;要么使用起来过于麻烦、不宜配置;或是需要注册付费;抑或使用效率低下速度慢。经比较,VNC软件是一款值得推荐的远程控制软件。VNC采用远程帧缓存〔RFB〕协议进行通信,它的主要应用是使用户能够利用VNC客户端连接到正在运行的远程VNC效劳器,并借由网络,传送键盘与鼠标的动作及即时的屏幕画面,实现远程图形化操作。VNC软件主要由两个局部组成:VNC效劳端及VNC客户端。用户需先将VNC效劳端安装在目标计算机上,才能够在本地计算机上执行VNC客户端进行控制。VNC支持多种操作系统,如Unix系列〔Unix、Linux、Solaris等〕、Windows及Mac操作系统。VNC运行的工作流程如下:(1)VNC客户端通过嵌入式Linux中的VNCViewer连接至远程VNCServer。(2)VNCServer传送一对窗口至客户端,要求输入连接密码,以及存取的VNCServer显示装置。(3)在客户端输入联机密码后,VNCServer验证客户端是否具有存取权限。(4)假设是客户端通过VNCServer验证,客户端即要求VNCServer显示桌面环境。(5)被控端将画面显示控制权交由VNCServer负责。(6)VNCServer将把被控端的桌面环境利用VNC通信协议送至客户端,并且允许客户端控制VNCServer的桌面环境及输入装置。13.2需求分析作为一个基于嵌入式系统的远程控制实现,无论是硬件方面的电路板体积、本钱,电路的性能,还是软件方面的功能实现、运行效率和稳定性等,都会受到资源限制的影响。因此在进行软硬件开发之前要进行详细的需求分析。13.2.1软件需求分析1、交叉编译工具2、Bootloader引导程序3、Linux内核4、Linux根文件系统5、Tiny-X及相关应用程序1.交叉编译工具工欲善其事,必先利其器。嵌入式Linux系统开发离不开交叉编译工具。交叉开发工具链就是为了编译、链接、处理和调试跨平台体系结构的程序代码。主机端装好Linux操作系统后,就可以准备配置、制作自己的编译工具。如果要基于Gcc和glibc来制作工具链,可以使用crosstool来进行编译;如果要基于Gcc和uClibc来制作工具链,可以使用buildroot来进行编译。如果不借助这些工具,编译过程是非常繁琐的。uClibc比glibc小,在已有的接口上是兼容的,更适用于嵌入式系统。但是uClibc并没有包括glibc中的所有接口实现,因此有些应用程序可能在uClibc中不能编译。基于这个原因,本章使用glibc和Gcc来制作工具链。2.Bootloader引导程序我们知道,当按下PC机的启动电源时,CPU会首先运行固化在CMOS中的BIOS(BasicInputOutputSystem)程序。BIOS程序的主要任务是对各种硬件设备进行自检和初始化,然后运行位于硬盘MBR〔MasterBootRecord〕上的操作系统加载程序。操作系统加载程序负责把操作系统加载到内存中,并启动操作系统。在嵌入式系统中是没有BIOS程序的,从开机硬件初始化到启动操作系统内核完全是由Bootloader程序完成的。Bootloader是嵌入式系统中最先运行的程序。Bootloader启动后首先对硬件进行初始化、建立内存的映射图等,其目的是为内核准备好软硬件运行环境;接着Bootloader会把内核加载到内存中适宜的位置并跳转到内核的入口处启动内核。3.Linux内核Linux内核主要由进程调度、内存管理、虚拟文件系统、网络接口、进程间通信等5个子系统组成,是构建Linux系统的核心组成局部。在2.6版本内核以前,并没有专门针对嵌入式平台进行支持。所以把Linux2.6版本以前的内核移植到嵌入式平台上时必须安装相应的补丁。Linux2.6内核于2003年12月发布,在2.4内核的根底上作了极大的改进。使用了新的调度器,进程的切换更高效;内核可以被抢占,使得用户的操作可以得到更快速的响应;I/O子系统也经历了很大的修改,使得它在各种工作负荷下都更具响应性;模块子系统、文件系统都做了大量的改进。本章移植版本的内核。4.Linux根文件系统Linux中没有类似于Windows下的C、D、E等盘符的概念,它以树状机构管理所有目录、文件,其他分区挂接在某个目录上,这个目录被称为挂接点〔mountpoint〕,然后就可以通过这个目录来访问这个分区上的文件了。在一个分区上存储文件时,需要遵循一定的格式,这种格式称为文件系统类型,比方fat、ntfs、ext2、ext3、jffs2、yaffs等。除这些拥有实实在在的存储分区的文件系统类型外,Linux还有几种虚拟的文件系统类型,比方proc、sysfs等,它们的文件并不存储在实际的设备上,而是在访问它们时由内核临时生成。5.Tiny-X及相关应用程序X窗口系统〔XWindowingSystem〕提供了Linux桌面图形系统。X系统中的窗口环境采用客户端/效劳端〔C/S〕模式。X系统应用程序是客户端,它们和效劳器通信,向效劳器发送请求并且接收效劳器发送的信息。X系统的效劳器控制显示和处理来自客户端的请求。应用程序〔客户端〕只需要知道如何与效劳器端通信,并不需要知道显示设备绘制图形的操作细节。这个通信机制〔协议〕能在任何提供八位字节流的进程间通信机制上工作。X使用了socket接口来到达通信协议的一致性。因为X系统是基于socket的,所以它可以在网络中运行并且能很好远程绘图〔Remotegraphics〕。X客户端使用X窗口系统提供的API在屏幕上绘制对象。这些API是函数库X-lib中的一局部,用它连接客户端应用程序。本章移植的是体积小巧,但功能强大的Tiny-X。13.2.2硬件需求分析1.嵌入式开发目标板目前市面上流行的嵌入式开发板款式很多,本章采用友善之臂推出的mini2440开发板进行开发,它是一种集成了S3C2440处理器以及各类外设的电路板。它不但提供了运行嵌入式系统的根本平台,还提供了开发和调试嵌入式软件系统的硬件平台。其板上主要配备了以下相关部件:CPU处理器,SamsungS3C2440A,主频400MHz,最高533MHz;64MBSDRAM内存,时钟频率高达100MHz;2MBNORFlash,掉电非易失;128MBNANDFlash,掉电非易失;3.5寸真彩LCD,分别率为240×320;USBHost、USBSlaveB型接口各一个;DM9000网卡一块;音频输入输出〔本章未用到〕;标准SD/MMC卡座。2.嵌入式开发主机在PC主机上,Linux已经成为优秀的计算机操作系统。各种Linux发行版本,可以直接在PC机上安装,功能十分强大。它不仅能够支持各种处理器和外围设备接口,而且提供了图形化的用户交互界面和丰富的开发环境,更重要的是Linux系统性能稳定。进行开发之前,事先在PC主机上安装Linux操作系统,这里安装的是Ubuntu9.10操作系统。开发主机上应配备有25针的并行接口一个,用来连接JTAG,下载Bootloader到NORFlash中;9针的RS-232串行接口一个,用于打印开发板启动、调试信息并能输入控制命令;至少一块网卡,用于网络传输文件。13.3嵌入式Linux系统移植
Linux操作系统的移植主要包括移植BootLoader、移植Linux内核、移植相应的驱动程序和构建文件系统。使某个平台的代码运行在其他平台上的过程叫做移植。Linux操作系统是一种遵循GPL协议的开源系统,其内核可以进行剪裁,并且支持32位和64位的CPU,可以运行在ARM、PowerPC、M68k等多种硬件平台上。13.3.1交叉开发环境的构建1.交叉开发模式所谓的交叉开发模式就是指在主机上编辑、编译程序,然后在目标板上运行、验证程序的过程。图13-1所示是交叉开发模式。图13-1交叉开发模式目标板和主机之间通常可以使用JTAG接口、串口、以太网接口以及USB接口等方式进行连接。JTAG接口传输方式:JTAG仿真器跟主机之间连接,将第一个引导程序烧写进入NorFlash之中。串口传输方式:主机端通过kermit、minicom或者windows超级终端等工具都可以通过串口打印目标板程序运行、调试信息,另外它是嵌入式开发的重要控制台。网络传输方式:网络传输方式一般采用NFS、TFTP等协议传输文件。USB接口传输方式:通常分主从设备端,主机端为主设备端,目标板端为从设备端。用于下载测试应用程序到目标板中。2.交叉编译环境交叉编译通俗地讲就是在一种平台上编译出能运行在体系结构不同的另一种平台上的程序,比方在PC平台〔X86CPU〕上编译出能运行在以ARM为内核的CPU平台上的程序,编译得到的程序在X86CPU平台上是不能运行的,必须放到ARMCPU平台上才能运行,所以要生成在目标机上运行的程序,必须要用交叉编译工具链来完成。在裁减和定制Linux内核用于嵌入式系统之前,由于一般嵌入式开发系统的资源有限,通常都要在PC上建立一个用于目标机的交叉编译工具链,用该交叉编译工具链在PC上编译目标机上要运行的程序。交叉编译工具链是一个由编译器、连接器和解释器组成的综合开发环境,交叉编译工具链主要由binutils、gcc和glibc3个局部组成。建立交叉编译工具链是一个相当复杂的过程,如果不想自己经历复杂繁琐的编译过程,网上有一些编译好的可用的交叉编译工具链可以下载,但就以学习为目的来说读者有必要学习自己制作一个交叉编译工具链。下面就通过具体的实例讲述基于ARM的嵌入式Linux交叉编译工具链的制作过程。首先下载,其官方网站是://,它是一个方便的用来建立交叉编译工具链的工具。wgettar-zxvf解压缩后查看目录中的文件,其中包含很多的Shell脚本文件,编辑其中的demo-arm.sh文件,其中第7行制定编译过程中软件包下载路径,第8行制定交叉编译工具链的安装路径。取消第25行的注释〔这里我们要建立一个,的交叉编译链〕同时修改notest为gdb还可以同时创立arm-linux-gdb的交叉调试工具。#!/bin/sh#Thisscripthasonelineforeachknownworkingtoolchain#forthisarchitecture.Uncommenttheoneyouwant.#Generatedbygenerate-demo.plfromset-exTARBALLS_DIR=$HOME/downloadsRESULT_TOP=/usr/local/crosstoolexportTARBALLS_DIRRESULT_TOPGCC_LANGUAGES="c,c++"exportGCC_LANGUAGES#Really,youshoulddothemkdirbeforerunningthis,#andchown/opt/crosstooltoyourselfsoyoudon'tneedtorunasroot.mkdir-p$RESULT_TOP#eval`catarm.datgcc-2.95.3-glibc-2.1.3.dat`shall.sh--notest#eval`catarm.datgcc-2.95.3-glibc-2.2.2.dat`shall.sh--notest#eval`catarm.datgcc-2.95.3-glibc-2.2.5.dat`shall.sh--notest#eval`catarm.datgcc-3.2.3-glibc-2.2.5.dat`shall.sh--notest#eval`catarm.datgcc-3.2.3-glibc-2.3.2.dat`shall.sh--notest#eval`catarm.datgcc-3.2.3-glibc-2.3.2-tls.dat`shall.sh--notest#eval`catarm.datgcc-3.3.6-glibc-2.2.2.dat`shall.sh--notest#eval`catarm.datgcc-3.3.6-glibc-2.2.5.dat`shall.sh--notesteval`catarm.datgcc-3.3.6-glibc-2.3.2.dat`shall.sh--gdb#eval`catarm.datgcc-3.3.6-glibc-2.3.2-tls.dat`shall.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它会自动从网络下载所需的软件包并且进行编译,整个编译过程大概需要1~2个小时。如果没出现意外情况的话,会在“/usr/local/crosstool”目录下生成一套交叉编译工具链。把制作好的交叉编译工具链添加到当前的环境变量当中,只需要修改主目录下的.bashrc文件,在文件末尾添加exportPATH=/usr/local/crosstool/gcc-3.3.6-glibc-2.3.2/bin:$PATH,并且重新读取到当前的环境变量当中就可以了。echo'exportPATH=/usr/local/crosstool/gcc-3.3.6-glibc-2.3.2/bin:$PATH'>>.bashrcsource.bashrc3.主机开发工具安装与配置1〕串口控制台工具串行通讯接口很适合作为控制台,在各种操作系统上一般都有现成的控制台程序可以使用。Windows操作系统有超级终端〔Hyperterminal〕工具;Linux/UNIX操作系统有Minicom、C-Kermit等工具。本文用的是Linux下的minicom,首先安装Minicom到系统中,然后通过在Shell下执行“minicom-s”命令进行配置,配置菜单如图13-2所示。当需要使用时,执行“sudominicom”运行,退出时执行“Ctrl+A+Q”组合键即可。图13-2minicom配置菜单2〕NFS效劳NFS效劳的主要任务是把本地的一个目录通过网络输出,其他计算机可以远程挂接这个目录并且访问文件。NFS效劳有自己的协议和端口号,但是在文件传输或者其他相关信息传递的时候,NFS那么使用远程过程调用〔RPC,RemoteProcedureCall〕协议。NFS是嵌入式开发不可或缺的工具。首先安装NFS效劳软件,执行以下命令会自动下载安装:$sudoapt-getinstallnfs-kernel-serverportmap它的配置文件为/etc/eXports,在里面可以增加想要通过网络文件系统访问的目录,本文配置内容如下:/nfsboot*(rw,sync,no_root_squash)13.3.2Bootloader的移植简单地说,Bootloader就是在操作系统内核运行之前运行的一段小程序。通过这段小程序,我们可以初始化硬件设备、建立内存空间的映射图,从而将系统的软硬件环境带到一个适宜的状态,以便为最终调用操作系统内核准备好正确的环境。通常Bootloader是严重地依赖于硬件而实现的,特别是在嵌入式世界。因此,在嵌入式世界里建立一个通用的Bootloader几乎是不可能的。尽管如此,我们仍然可以对Bootloader归纳出一些通用的概念来,以指导用户特定的Bootloader设计与实现。Bootloader可以分为以下两种操作模式。(1)启动加载〔Bootloading〕模式。上电后,Bootloader从板子上的某个固态存储设备上将操作系统加载到RAM中运行,整个过程并没有用户介入。产品发布时,Bootloader工作在这种模式下。(2)下载〔Downloading〕模式。在这种模式下,开发人员可以使用各种命令,通过串口连接或网络连接等通信手段从主机下载文件〔比方内核镜像、文件系统镜像〕,将它们直接放在内存中运行或烧入Flash类固态存储设备中。由于Bootloader的实现依赖CPU的体系结构,因此大多数Bootloader都分为stage1和stage2两大局部。依赖于CPU体系结构的代码,比方设备初始化代码等,通常都放在stage1中,而且通常都用汇编语言来实现,以到达短小精悍的目的。而stage2那么通常用C语言来实现,这样可以实现给复杂的功能,而且代码会具有更好的可读性和可移植性。Bootloader的stage1通常包括以下步骤(以执行的先后顺序):硬件设备初始化。为加载Bootloader
的stage2准备RAM空间。拷贝Bootloader
的stage2到RAM空间中。设置好堆栈。跳转到stage2的C入口点。Bootloader的stage2通常包括以下步骤(以执行的先后顺序):初始化本阶段要使用到的硬件设备。检测系统内存映射(memorymap)。将kernel映像和根文件系统映像从flash上读到RAM空间中。为内核设置启动参数。调用内核。这是Bootloader一开始就执行的操作,其目的是为stage2的执行以及随后的kernel的执行准备好一些根本的硬件环境。它通常包括以下步骤〔以执行的先后顺序〕:〔1〕屏蔽所有的中断。为中断提供效劳通常是OS设备驱动程序的责任,因此在Bootloader的执行全过程中可以不必响应任何中断。中断屏蔽可以通过写CPU的中断屏蔽存放器或状态存放器〔比方ARM的CPSR存放器〕来完成。〔2〕设置CPU的速度和时钟频率。〔3〕RAM初始化。包括正确地设置系统的内存控制器的功能存放器以及各内存库控制存放器等。〔4〕初始化LED。典型地,通过GPIO来驱动LED,其目的是说明系统的状态是OK还是Error。如果板子上没有LED,那么也可以通过初始化UART向串口打印Bootloader的Logo字符信息来完成这一点。〔5〕关闭CPU内部指令/数据cache。13.3.3Linux内核的移植1、Linux内核的定制原理2、Linux内核源码结构3、配置和编译内核源码4、对YAFFS文件系统的支持1.Linux内核的定制原理定制内核的根本目的是使内核能够根据嵌入式系统的软硬件需求为应用程序提供一个专用的运行平台。从实现的角度看,定制内核就是有针对性地定制内核的各项功能。定制程序功能的根本方法有两种:一是直接修改程序的源代码,二是添加或删除源文件。但是这两种方法的效率都很低,而且一旦出现错误也不容易改正,所以并不适合于代码量大的程序。对于源代码量到达上百万行的Linux内核来说,通过直接修改源代码的方式来进行定制更加行不通。在Linux内核中,几乎每个目录下都有Makefile文件。面对数量众多、结构复杂的Makefile文件,仅仅依靠手工的方式来定制Makefile同样是不适宜的。为此,Linux内核把哪些源文件需要被编译和链接的规那么都记录在.config文件中。由Makefile文件根据.config文件中的规那么来控制源文件的编译过程。这样一来,Makefile文件的定制就又转变成了.config文件的定制。为了提高.config文件的定制效率,需要使用内核配置工具。它们分别通过以下命令启动。makeconfig。它采用文本的操作界面。用户通过输入y或n来配置内核的功能。由于需要逐一操作每个配置选项,所以配置的效率非常低。makemenuconfig。它采用菜单操作界面。如图13-3所示。图13-3内核配置菜单2.Linux内核源码结构Linux内核文件数目将近2万,除去其他架构CPU的相关文件,支持S3C2410、S3C2440这两款芯片的完整内核文件也有1万多个。这些文件的组织结构并不复杂,它们分别位于顶层目录下的各个子目录中。表13-1描述了主要目录的功能。表13-1Linux内核子目录结构目录名描述arch体系结构相关代码,例如arch/arm、arch/i386block块设备的通用函数crypto常用的加密和散列算法,还有一些压缩和CRC校验算法drivers所有的设备驱动,例如drivers/char、drivers/mtdDocumentation内核文档fsLinux支持的文件系统代码,比如fs/jffs2、fs/ext2include内核头文件,有基本头文件、各种驱动或功能部件头文件、各种体系相关的头文件init内核的初始化代码,其中的main.c文件中的start_kernel函数是内核引导后运行的第一个函数ipc进程间通信的代码kernel内核管理的核心代码lib内核用到的一些库函数代码mm内存管理代码net网络支持代码,每个子目录对应于网络的一个方面security安全、密钥相关代码sound音频设备的驱动程序scripts用于配置、编译内核的脚本文件usr用来制作一个压缩的cpio归档文件:initrd的镜像,它可以作为内核启动后挂载的第一个文件系统3.配置和编译内核源码本章编译版本的内核。首先,修改内核根目录下的Makeflle文件,这个文件中需修改的内容包括以下两个方面。〔1〕指定目标平台:修改前ARCH ?=&(SUBARCH)修改后ARCH ?=arm〔2〕指定交叉编译器:修改前CROSS_COMPILE?=修改后CROSS_COMPILE?=arm-linux-然后,修改MTD〔即内存技术设备〕分区,在arch/arm/mach-s3c2440/mach-mini2440.c文件中,本章将NandFlash划分为3个区,前1MB用于存放引导程序,接下来的3MB用于存放嵌入式内核,剩下的空间用来存放yaffs文件系统,分区结构如下所示:staticstructmtd_partitionmini2440_default_nand_part[]__initdata={ [0]={ .name ="u-boot", .size =0x00100000, .offset =0, }, [1]={ .name ="kernel",
.size =0x00300000, .offset =0x00100000, }, [2]={ .name ="root", .size =MTDPART_SIZ_FULL, .offset =0x00400000, },};4.对YAFFS文件系统的支持〔1〕首先,获取YAFFS2的源代码从下载并且解压缩,YAFFS2目录下有一个脚本文件可以用来给内核打补丁。./patch-ker.sh/cpath其中/c这个参数用来将YAFFS2的代码复制到内核的相应目录下,path是内核源代码的路径。〔2〕其次,配置内核时选中YAFFS2支持:Filesystems一>Miscellaneousfilesystems一><*>YAFFS2filesystemsupport13.3.4Linux根文件系统的构建文件系统是一种用于向用户提供底层数据访问的机制。它将设备中的空间划分为特定大小的块〔扇区〕,一般每块512字节。数据存储在这些块中,大小被修正为占用整数个块。由文件系统软件来负责将这些块组织为文件和目录,并记录哪些块被分配给了哪个文件,以及哪些块没有被使用。不过,文件系统并不一定只在特定存储设备上出现。它是数据的组织者和提供者,至于它的底层,可以是磁盘,也可以是其它动态生成数据的设备〔比方网络设备〕。1.Linux文件系统层次标准介绍因为Linux的开发人员实在太多了,如果每个人都使用自己的目录配置方法,那么将可能会带来很多管理问题。所以,后来就有所谓的文件系统层次标准〔FilesystemHierarchyStandard,FHS〕出台。它定义了文件系统中的目录、文件分类存放的原那么,定义了系统运行所需的最小文件、目录的集合。下面分别介绍一下各个目录的作用。〔1〕/bin根底系统所需要的那些命令位于此目录,也是最小系统所需要的命令;比方ls、cp、mkdir等命令;功能和/usr/bin类似,这个目录中的文件都是可执行的,普通用户都可以使用的命令。做为根底系统所需要的最根底的命令就是放在这里。〔2〕/bootLinux的内核及引导系统程序所需要的文件,比方vmlinuzinitrd.img文件都位于这个目录中。在一般情况下,GRUB或LILO系统引导管理器也位于这个目录;〔3〕/dev设备文件存储目录,比方声卡、磁盘......〔4〕/etc系统配置文件的所在地,一些效劳器的配置文件也在这里;比方用户帐号及密码配置文件;〔5〕/home普通用户家目录默认存放目录;〔6〕/lib库文件存放目录〔7〕/lost+found在ext2或ext3文件系统中,当系统意外崩溃或机器意外关机,而产生一些文件碎片放在这里。当系统启动的过程中fsck工具会检查这里,并修复已经损坏的文件系统。有时系统发生问题,有很多的文件被移到这个目录中,可能会用手工的方式来修复,或移到文件到原来的位置上。〔8〕/media即插即用型存储设备的挂载点自动在这个目录下创立,比方USB盘系统自动挂载后,会在这个目录下产生一个目录;CD/DVD自动挂载后,也会在这个目录中创立一个目录,类似cdrom的目录。这个只有在最新的发行套件上才有,比方Fedora等。可以参看/etc/fstab的定义;〔9〕/mnt这个目录一般是用于存放挂载储存设备的挂载目录的,比方有cdrom等目录。可以参看/etc/fstab的定义。有时我们可以把让系统开机自动挂载文件系统,把挂载点放在这里也是可以的。主要看/etc/fstab中怎么定义了;比方光驱可以挂载到/mnt/cdrom。〔10〕/proc操作系统运行时,进程〔正在运行中的程序〕信息及内核信息〔比方cpu、硬盘分区、内存信息等〕存放在这里。/proc目录伪装的文件系统proc的挂载目录,proc并不是真正的文件系统。〔11〕/rootLinux超级权限用户root的家目录;/sbin大多是涉及系统管理的命令的存放,是超级权限用户root的可执行命令存放地,普通用户无权限执行这个目录下的命令,这个目录和/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,普通用户可执行文件目录/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这个目录是用来存放系统或效劳器以SystemV模式启动的脚本,这在以SystemV模式启动或初始化的系统中常见。/etc/xinit.d如果效劳器是通过xinetd模式运行的,它的脚本要放在这个目录下。/etc/rc.d这是BSD方式启动脚本的存放地;比方定义网卡,效劳器开启脚本等。2.移植Busybox构建Linux根文件系统,就是参照FHS的标准创立相应的目录,并且在其中存放各种可执行程序,建立相关的配置文件以及相应的库文件。这里我们采用的是Busybox工具,它是遵循GPL协议的一个开源的工具,最初是为了Debian安装盘编写的,其目的是在一张软盘上创立一个可引导的Linux系统,可以用于安装盘和急救盘,其大小在1.44MB以内。它将众多的Unix命令集合到一个可执行文件当中,很多标准的Linux工具都可以共享很多相同的元素,这些工具被合并到一个可执行程序中,就可以共享这些相同的元素,从而产生更小的可执行程序。Busybox在设计时充分的考虑了硬件资源受限的环境,通过不同的符号链接来选择到底执行哪一个命令,这对资源紧张的嵌入式Linux系统来说再适宜不过了。首先下载busybox,://,这里我们用的是,解压缩以后,修改Makefile文件移植前ARCH ?=&(SUBARCH)移植后ARCH ?=arm指定交叉编译器:移植前CROSS_COMPILE ?=移植后CROSS_COMPILE ?=arm-linux-3.构建Linux根文件系统[1]首先建立etc目录和一些根本的配置文件。mkdir-petc/init.d/&&touchetc/inittab&&touchetc/init.d/rcS&&touchetc/fstab&&touchetc/resolv.conf[2]参考busyboxexample目录下的inittab文件编辑etc/inittab文件如下#/etc/inittab::sysinit:/etc/init.d/rcSttySAC0::askfirst:/bin/sh::ctrlaltdel:/sbin/reboot::shutdown:/bin/umount-a-r[3]编辑etc/init.d/rcS文件,配置ip#!/bin/shPATH=/sbin:/bin:/usr/sbin:/usr/bin:/usr/local/bin:/sbin/ifconfiglonetmaskupifconfigeth00netmaskuprouteadddefaultgwmount-a然后执行chmod755etc/init.d/rcS添加可执行权限。[4]编辑etc/resolv.conf修改添加dns配置echo"nameserver">etc/resolv.conf[5]编辑etc/fstab文件,这是一个用来定义系统开机后自动挂载的配置文件#device mount-point type option dumpfsck orderproc /proc proc defaults 0 0ramfs /tmp ramfs defaults 0 0sysfs /sys sysfs defaults 0 0ramfs /dev ramfs defaults 0 0var /var ramfs defaults 0 0表13-2常见的设备节点设备节点名称设备类型主设备号次设备号文件权限说明console字符51600控制台mem字符11600物理内存null字符13666空设备random字符18644随机数发生器tty字符50666控制台tty0字符40600虚拟控制台tty1字符41600虚拟控制台ttyS0字符464600第一个串口zero字符15666零设备mknod-m600consolec51mknod-m600memc11mknod-m666nullc13mknod-m644randomc18mknod-m666ttyc50mknod-m600tty0c40mknod-m600tty1c41mknod-m600ttyS0c464mknod-m666zeroc15[6]最后创立一些其他的目录mdirprocmnttmpsysroot这样一个根本的文件系统就已经做好了,把做好的目录按照FHS标准放在自建的rootfs目录下面。现在需要制作YAFFS2文件系统映像文件,在YAFFS2源码目录下有一个utils目录,下面有编译好的mkyaffs2image的代码,编译好了以后就可以用来制作YAFFS2文件系统映像文件了。[7]利用mkyaffsimage工具制作根文件系统镜像,例如根文件系统放在/nfsboot目录下,可以执行如下命令完成:mkyaffsimage/nfsbootrootfs.img把rootfs.img复制到NFS目录后,在U-Boot控制界面就可以将镜像下载到开发板内存、继而把镜像烧入到NandFlash中,操作命令如下:nfs:/nfsboot/rootfs.imgnanderase0x4000000x7c00000nandwrite.yaffs0x300080000x400000$(filesize)修改U-Boot的命令行参数以MTD2分区作为根文件系统,设置如下:setenvbootargs‘noinitrdconsole=ttySAC0root=/dev/mtdblock2rootfstype=yaffs’saveenv启动开发板就可以了。当开发测试时,可以设置U-Boot从NFS启动,这时的设置为:setenvbootargs"console=ttySAC0init=/linuxrcmem=64Mroot=/dev/nfsrwnfsroot=05:/nfsboot,proto=tcp,nfsvers=3,nolockip=00:05:05::wenjun24x0:eth0:off"setenvbootcmd"nfs0x3000800005:/nfsboot/uImage;bootm"saveenv13.4Tiny-X及应用程序移植
13.4.1LinuxX图形系统和嵌入式X13.4.2配置编译Tiny-X13.4.3编译Matchbox13.4.4编译VNCViewer13.4.5编译Xterm13.4.1LinuxX图形系统和嵌入式XX窗口系统〔XWindowingSystem〕提供了Linux桌面图形系统。X系统中的窗口环境采用客户端/效劳端〔C/S〕模式。X系统应用程序是客户端,它们和效劳器通信,向效劳器发送请求并且接收效劳器发送的信息。X系统的效劳器控制显示和处理来自客户端的请求。应用程序〔客户端〕只需要知道如何与效劳器端通信,并不需要知道显示设备绘制图形的操作细节。这个通信机制〔协议〕能在任何提供八位字节流的进程间通信机制上工作。X使用了socket接口来到达通信协议的一致性。因为X系统是基于socket的,所以它可以在网络中运行并且能很好远程绘图〔Remotegraphics〕。X客户端使用X窗口系统提供的API在屏幕上绘制对象。这些API是函数库X-lib中的一局部,用它连接客户端应用程序。13.4.2配置编译Tiny-X1、解压缩源代码2、建立临时目录3、修改和添加配置文件4、修改armtinyx/lib/X11/Makefile文件5、编译和安装Tiny-X6、测试Tiny-X1.编译Tiny-X的依赖软件本章编译的所有软件都安装到/usr/arm目录下,配置时指定“-prefix=/usr/arm”。它们之间也存在依赖关系,所以按照一定顺序进行交叉编译,共计14个软件包。具体过程如下:1)zlibtarzxvfcdCC=arm-linux-gcc./configure--prefix=/usr/arm-sharedmakemakeinstall2)libpngtarjxvfcdCC=arm-linux-gcc./configure--host=arm-linux--prefix=/usr/armmakemakeinstall3)expattarzxvfcdCC=arm-linux-gcc./configure--host=arm-linux--prefix=/usr/armmakemakeinstall4)freetypetarjxvfcdCC=arm-linux-gcc./configure--host=arm-linux--prefix=/usr/armmakemakeinstall5)libxmltarzxvfcdCC=arm-linux-gcc./configure--host=arm-linux--prefix=/usr/armmakemakeinstall6)fontconfigtarzxvfcdCC=arm-linux-gccexportLIBXML2_CFLAGS=-I/usr/arm/include/libxml2exportLIBXML2_LIBS="-L/usr/arm/lib-lxml2"./configure--host=arm-linux--prefix=/usr/arm--with-arch=armmakemakeinstall7)libdrmtarjxvfcdCC=arm-linux-gcc./configure--host=arm-linux--prefix=/usr/armmakemakeinstall8)openssltarzxvfcd./Configure--prefix=/usr/arm--openssldir=/usr/arm/opensslos/compiler:arm-linux-gccmakemakeinstall9)jpegtarzxvfcdjpeg-6bCC=arm-linux-gcc./configure--host=arm-linux--prefix=/usr/arm--enable-shared修改Makefile文件,AR=arrc改成AR=arm-linux-arrc;AR2=ranlib改成AR2=arm-linux-ranlib,接着执行:mkdir/usr/arm/manmkdir/usr/arm/man/man1makemakeinstall10)glibtarzxvfcdexportPREFIX=/usr/armexportLDFLAGS=-L$PREFIX/libexportCFLAGS="-g-I$PREFIX/include"exportPKG_CONFIG_PATH=$PREFIX/lib/pkgconfigechoac_cv_type_long_long=yes>arm-linux.cacheechoglib_cv_stack_grows=no>>arm-linux.cacheechoglib_cv_uscore=no>>arm-linux.cacheechoac_cv_func_posix_getpwuid_r=yes>>arm-linux.cacheechoac_cv_func_posix_getgrgid_r=yes>>arm-linux.cacheCC=arm-linux-gcc./configure--host=arm-linux--build=i386-linux--prefix=$PREFIX--cache-file=arm-linux.cachemakemakeinstall11)cairotarzxvfcdexportPREFIX=/usr/armCC=arm-linux-gccexportLDFLAGS=-L$PREFIX/libexportCFLAGS="-g-I$PREFIX/include"exportPKG_CONFIG_PATH=$PREFIX/lib/pkgconfig./configure--host=arm-linux--prefix=$PREFIX--disable-gtk-doc--disable-xcb--without-x--disable-xlib--disable-xlib-xrender--enable-directfb--enable-freetype--disable-win32--disable-svg--enable-png--enable-pdf--enable-psmakemakeinstall12)pangotarzxvfcdexportPREFIX=/usr/armexportLDFLAGS=-L$PREFIX/libexportCFLAGS="-g-I$PREFIX/include"exportPKG_CONFIG_PATH=$PREFIX/lib/pkgconfigCC=arm-linux-gcc./configure--host=arm-linux--prefix=$PREFIX--enable-cairo--without-xmakemakeinstall13)atktarzxvfcdexportPREFIX=/usr/armexportLDFLAGS=-L$PREFIX/libexportCFLAGS="-g-I$PREFIX/include"exportPKG_CONFIG_PATH=$PREFIX/lib/pkgconfigCC=arm-linux-gcc./configure--host=arm-linux--build=i386-linux--prefix=$PREFIXmakemakeinstall14)tifftarzxvfexportPREFIX=/usr/armCC=arm-linux-gcc./configure--host=arm-linux--prefix=$PREFIX--enable-sharedmakemakeinstall2.编译Tiny-X1、解压缩源代码$tarzxvf$tarzxvf$tarzxvf$tarzxvf$tarzxvf$tarzxvf$tarzxvf解压后生成代码目录Xc。2、建立临时目录在与Xc同一个目录下建立另外一个链接文件夹。$mkdirarmTinyX$cdarmTinyX$lndir../Xc/3、修改和添加配置文件在armTinyX/config/cf目录下修改cross.def文件并添加host.def文件。4、修改armtinyx/lib/X11/Makefile文件找到:#if(BuildServersOnly||!BuildX11Lib)&&!XnestServer&&!BuildGLXLibrary&&!BuildClients&&!XdmXServer修改为:#if(BuildServersOnly||!BuildX11Lib)&&!XnestServer&&!BuildGLXLibrary&&!BuildClients&&!XdmXServer&&!TinyXServer5、编译和安装Tiny-X#makeWorld#makeinstall6、测试Tiny-X复制整个Tiny-X目录到相应的NFS目录〔/nfsboot〕下,从网络启动开发板,挂载根文件系统后,在开发板控制终端中输入:#cd/usr/arm/bin#./Xfbdev-mousemouse-keybdkeyboard&13.4.3编译Matchbox1、下载源代码2、逐一对上述各软件包进行交叉编译1、下载源代码可以通过以下网址下载所需要的软件包。:///download.html软件包清单为:libmatchbox-1.9.tar.gz它是Matchbox的根本库matchbox-common-0.9.1.tar.gz它中含有图标及一些配置数据matchbox-window-manager-1.2.tar.gz它是窗口管理器matchbox-panel-0.9.3.tar.gz它是控制面板matchbox-desktop-0.9.tar.gz它是桌面管理器2、逐一对上述各软件包进行交叉编译方法与编译Tiny-X的依赖软件类似,这里就不详述了。编译结束,将安装代码复制到nfsboot目录,通过网络启动,运行以下命令进行测试:#Xfbdev-mousemouse-keybdkeyboardexportDISPLAY=:0#exportHOME=/root#matchbox-session&matchbox-session启动的程序有:matchbox-window-manager、matchbox-desktop、matchbox-panel;而matchbox-panel自己又启动了mb-applet-menu-launcher和mb-applet-clock,就是桌面左下角的按钮、右下角的时钟。13.4.4编译VNCViewer这里所移植的VNCViewer是TigerVNC,登录://官网,下载源代码,执行以下命令编译:$tarzxvf$cd$CC=arm-linux-gcc$CXX=arm-linux-g++$./configure--host=arm-linux--x-libraries=/usr/arm/lib--x-includes=/usr/arm/include在目录下生成vncviewer可执行文件,将其复制到/nfsboot/usr/arm/bin目录下,通过网络启动开发板进行测试。TigerVN
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025版油茶林智能化管理与承包服务协议6篇
- 2024年度私立学校入学条件及教育服务合同3篇
- 嘉兴2024年浙江嘉兴市急救中心招聘编外合同制人员10人(三)笔试历年典型考点(频考版试卷)附带答案详解
- 台州浙江台州市立医院招聘放射技术人员笔试历年典型考点(频考版试卷)附带答案详解
- 2024年03月恒丰银行长沙分行2024年社会招考笔试历年参考题库附带答案详解
- 2024年物流信息平台建设合同封面设计3篇
- 2025版国际学校教师聘任与文化交流合同3篇
- 2024年中国电磁线用云母带市场调查研究报告
- 2025版智能加油站改造项目施工及运营管理合同3篇
- 2025版货车司机劳动合同与环保责任承诺范本3篇
- (完整word版)体检报告单模版
- 2024年陕西航空职业技术学院高职单招(英语/数学/语文)笔试历年参考题库含答案解析
- 铣刨机操作规程范文
- 安徽省芜湖市2023-2024学年七年级上学期期末数学试卷(含答案)
- 钢铁行业用电分析
- 考研的重要性和必要性
- 掘进机维修培训课件
- 《土壤中的钙素营养》课件
- 导医接待工作的沟通技巧与话术培训
- 初中数学思想方法导引
- 江苏省南京市建邺区2023-2024学年五年级上学期期末数学试卷.1
评论
0/150
提交评论