目录
17.“虚拟文件系统”VFS概念(VFS是virtual file system的缩写,或者是virtual filesystem缩写)
操作系统是用以控制和管理计算机系统资源,方便用户使用的程序和数据结构的集合。在所有的系统软件中,操作系统是一种首要的、最基本、最重要的系统程序,也是最庞大、最复杂的系统软件。
基本特征:多路性、独立性、交互性、及时性。
能在限定的时间内输入,进行快速处理并作出响应的计算机处理系统。
分布式操作系统:分布式系统具有一个统一的操作系统,它可以把一个大任务划分成许多可以并行执行的子任务,并按一定的策略将它们动态地分配给各个计算机执行,并控制管理各个计算的资源分配、运行及计算机之间的通信,以协调任务的并行执行。
网络操作系统:不是一个集中、统一的操作系统。它基本上是在各种各样自治的计算机原有操作系统基础上加上具有各种网络访问功能的模块,这些模块使网络上的计算机能方便、有效地共享网络资源,实现各种通信服务的有关协议。
网络操作系统各个主机独立管理自己的资源;分布式则由一台主机统一管理系统中的资源。
网络操作系统用户面对多台主机,分布式用户好像在使用同一台主机。
网络操作系统是多用户操作,分布式是单用户操作。
运行在嵌入式芯片环境中,对整个芯片以及它所操作和控制的各种部件装置等资源进行统一协调、调度、指挥和控制的系统软件。
具有高可靠性、实时性、占有资源少、低成本等。
体积小、运行时间长、故障重启、低功耗、价格便宜、动态加载。
· 请求计算机完成的一个完整的处理任务称为作业,它可以包括几个程序的相继执行。
· 用户在键盘上输入的一条完整的命令就是一个作业。
· 复杂的作业也可由作业说明书(如shell命令程序)来描述。一个复杂的作业可由多个作业步组成,如编译、运行、打印一个程序的全部工作是一个作业,其中相对独立的每一部分称为作业步。
程序在一个数据集合上的运行活动,它是系统进行资源分配和调度的一个可并发执行的独立单位。
· 程序是一组指令的集合,它是静态的实体,没有执行的含义。
· 进程是一个动态的实体,有自己的生命周期。一般来说,一个程序可以只有一个进程,也可有多个进程;一个进程可以同这个程序相对应,也可以同另一个程序相对应。
· 进程为应用程序的运行实例,是应用程序的一次动态执行。
处理机管理、存储管理、设备管理、文件管理、用户接口。
最基本的操作系统:多任务操作系统、分时操作系统、实时操作系统。
是一个操作系统最基本的组成部分,由它来向应用程序访问硬件时提供服务。
是系统的用户界面,提供用户与内核的交互接口。实际上shell是一个命令解释器,它接收并解释用户输入的命令并把它们送到内核。
是文件存放在磁盘等存储设备上的组织方法。Linux支持多种目前流行的文件系统,如EXT2、EXT3、FAT、VFAT、IS09660、NFS、SMB等。
标准Linux系统都有一套称为应用程序的程序集,包括文本编辑器、编程语言、X Window、办公套件、Internet工具、数据库等。
可以把外壳脚本的的权限设置为可执行,在外壳提示符下直接执行;也可使用chmod命令更改外壳脚本的权限。
在调用执行的外壳命令后面跟随外壳脚本的文件名作为命令行参数。
在pdksh和bash下使用.命令,或在tcsh下使用source命令。
如果想要使某个命令的输出成为另一个命令的参数时,就可以使用这个方法。我们将命令列于两个’号之间,而外壳会以这个命令执行后的输出结果代替这个命令以及两个’符号。
r:目前发布的Kernel主版本。
x:偶数为稳定版本,奇数为开发中版本。
y:错误修补的次数。
一般来说,x位为偶数的版本是一个可以使用的稳定版本,如2.4.4;x位为奇数的版本一般加入了一些新的内容,所以性能不一定很稳定,仍是处于测试阶段,系统是一个测试版本,如2.5.5。
VFS由一组标准的、抽象的文件操作系统构成,以系统调用的形式提供于用户程序,如read()、write()、lseek()等。用户程序可以把所有的文件都看作一致的、抽象的“VFS文件”。
常用的linux编辑器有很多,比如图形模式下的gedit、kwrite、openoffice,文本模式下的VIM、Emacs和nano。VIM和Emacs是我们在Linux下最常用的两个编辑器。
vim是linux最基本的文本编辑工具,是创建和编辑简单文档最高效的工具,尤其适用于没有安装xWindows桌面环境或桌面环境崩溃等场合。
· 一般模式:进入vim就是处于一般模式,只能通过按键向编辑器发送指令,不能输入文字。这些命令可能是移动光标的命令,也可能是编辑命令或寻找替换命令。
· 编辑模式:在一般模式下按i,此时可以输入文件、写文章、按esc又回到一般模式下。
· 命令模式:在一般模式下按:就会进入命令模式,左下角会有一个冒号出现,此时可以敲入命令并执行,按esc回到一般模式。
shell是一种具备特殊功能的程序,它是介于使用者和Unix/Linux操作系统内核间的一个接口。简单地说,shell就是一个命令解释器。用户可以用shell来启动、挂起、停止甚至是编写一些程序。
计算机对于命令的接收和处理则需要用到shell,shell首先向用户提供了一个界面系统,用户通过该界面可以向计算机发出指令,同时,shell对命令进行解释,并向内核提出请求。
Shell Script定义: 在shell程序中执行一些批处理命令,这些批处理命令在Linux中叫做外壳脚本。
不同外壳的脚本会有一些差异,写给A外壳的脚本一般不能在B外壳中执行。Linux系统最常用的外壳有Bourne外壳和C外壳。
三个基本元素:系统引导工具(用于机器加电后的系统定位引导)、linux微内核(内存管理、程序管理)、初始化进程。
如果想要成为完整的操作系统并且继续保持小型化,还必须加上:硬件驱动程序、硬件接口程序、应用程序组。
GCC是基于GNU的编译器套件,作为GNU工具链的一部分,与gdb调试器一起工作。它提供了开发嵌入式Linux系统的所有软件工具。
如果要寻找嵌入式软件系统,那么,应首先确定硬件平台,即确定微处理器CPU的型号。硬件开发成本常是开发者很关心的。当考虑硬件成本时,需要考虑产品的整个成本而不仅是CPU的成本。因为合适的CPU,一旦加上总线逻辑和延时电路使之与外设一起工作,硬件系统就可能变得非常昂贵。

根据生成嵌入式开发工具链的流程图,简述:
在redhat Linux9.0环境下建立基于ARM+Linux的嵌入式开发工具链的过程。
选用适当的版本,找到适合主机和目标板的组合。
内核头文件的配置是建立工具链的第一步。它与后面将要执行的其他步骤有着类似性,大多需要执行下面几步操作:
· 解压缩包、为跨平台开发设定包的配置、建立包、安装包;
· 其中,进行配置时,变量ARCH和CROSS_COMPILE的值与目标板的架构类型有关。
· 如果使用PPC目标板,则 ARCH=ppc CROSS-COMPILE=ppc-linux-。
· 如果使用i386目标板,则:ARCH=i386 CROSS-COMPILE=i386-linux-。
本例中,配置的具体参数是:
$make ARCH=arm CROSS-COMPILE=arm-linux- menuconfig
配置工具选择:
make menuconfig是以文本菜单方式配置。
make xconfig是以图形界面方式配置。
make config是纯文本界面方式配置。
binutils包中的工具常用来操作二进制目标文件。该包中最重要的两个工具就是GNU汇编器as和链接器ld。
因为是交叉编译器,还不需要目标板的系统头文件,所以需要使用-without-headers这个选项。
-enable-language=c用来告诉配置脚本,需要产生的编译器支持何种语言,现在只能支持c语言。
开始只能建立支持C语言的引导编译器,因为缺少C链接库(glibc)的支持。等到glibc编译好之后,可以重新编译gcc并提供完整的C++支持。
这一步是最为繁琐的过程。目标板必须靠它来执行或者是开发大部分的应用程序。glibc套件常被称为C链接库,但是glibc实际产生很多链接库,其中之一是c链接库libc。因为嵌入式系统的限制,标准GNU C链接库显得太大,不适合应用在目标板上。所以需要寻找c链接库的替代品,比如uclibc。
为目标板安装支持C和C++的完整编译器。这个步骤相对于前面的建立过程要简单一些。具体命令:
$cd $PRJROOT/build-dir/build-gcc
$.. /.. /src-dir/gcc-2.95.3/configure --target=$TARGET --prefix=$PREFIX
--enable-languages=c,c++
$make all
$make install
调试器GDB能让你观察另一个程序在执行时的内部活动,或程序出错时发生了什么。
完成以下四件事,帮助找出程序中的错误。
(1)运行程序,设置所有的能影响程序运行的东西。
(2)保证程序在指定的条件下停止。
(3)当程序停止时,让你检查发生了什么。
(4)改变程序。那样你可以试着修正某个bug引起的问题,然后继续查找另一个bug。
在文本编辑器emacs中编写一个简单的C程序,使用嵌入式开发工具链编译,并用gdb调试的例子。
$cd $PRJROOT/program
$emacs hello.c
在文本编辑器emacs中编写:
#include
int main()
{
int i;
for(i=1;i<9;i++)
printf(“Hello World%d times!\n”,i);
}
保存退出。
$gcc -g hello.c -o hello
$gdb
(gdb)file hello
(gdb)l
#include
int main()
{
int i;
for(i=1;i<9;i++)
printf(“Hello World%d times!\n”,i);
}
(gdb)r
(gdb)q
$arm-linux-gcc -g hello.c -o hello-linux
$file hello-linux
hello-linux:ELF 32-bit LSB executable,ARM,version 1(ARM),for GNU/Linux2.0.0,
dynamically linked(uses shared libs),not stripped
上面的输出说明已成功编译了一个能在arm体系结构下运行的hello-linux,证明编译工具安装成功了。
一套完整的开发工具应至少包括以下三种工具:编辑工具、编译工具和调试工具。如果是大型项目,还要有配置工具和项目管理工具。
开发环境分为基于文本的开发平台(典型组合是vim/emacs + gcc + gdb)和集成开发平台(Eclipse+CDT插件)。
课堂提问
1. 该Makefile包含几个规则?
2. 该Makefile执行后,生成的最终目标文件是什么?
3. 按照各个目标文件生成的先后顺序,写出该Makefiles生成的目标文件。
4. 使用make命令执行该Makefile时,所有的规则都自动执行吗?如果不是,哪条规则没有自动执行?为什么?