第3章嵌入式Linux操作系统



本章的知识只需在PC上就可完成。学习本章内容后读者将掌握如下知识。
· Linux基本概念。
· Linux的目录结构。
· Linux的常用命令。

· Linux的文本编辑器。
· Linux系统的启动过程。


视频讲解


3.1Linux基本概念

Linux的出现,最早开始于一位名叫Linus Torvalds的计算机业余爱好者,当时他是芬兰赫尔辛基大学的学生。他的目的是想设计一个代替Minix(由一位名叫Andrew Tannebaum的计算机教授编写的一个操作系统示教程序)的操作系统,这个操作系统可用于386、486或奔腾处理器的个人计算机上,并且具有Unix操作系统的全部功能,因而开始了Linux雏形的设计。
嵌入式系统其发展已有20多年的历史,国际上也出现了一些著名的嵌入式操作系统,如VxWorks,Palm OS,Windows CE等,但这些操作系统均属于商品化产品,价格昂贵且由于源代码不公开导致了诸如对设备的支持、应用软件的移植等一系列的问题。而Linux作为一种优秀的自由软件,近几年在嵌入式领域异军突起,成为有潜力的嵌入式操作系统。
从应用上讲,Linux有4个主要部分: 内核、Shell、文件系统和实用工具。
1. Linux内核
Linux内核是整个Linux系统的灵魂,Linux系统的能力完全受内核能力的制约。Linux内核负责整个系统的内存管理、进程调度和文件管理。Linux内核的容量并不大,一般一个功能比较全面的内核也不会超过1MB,而且大小可以裁减,这个特性对于嵌入式是非常有好处的。合理地配置Linux内核是嵌入式开发中很重要的环节,对内核的充分了解是嵌入式Linux开发的基本功。
下面简单介绍Linux内核功能,Linux内核的功能大致有如下几个部分。
1) 进程管理
进程管理功能负责创建和撤销进程,以及处理它们和外部世界的连接。不同进程之间的通信是整个系统的基本功能,因此也由内核处理。除此之外,控制进程如何共享CPU资源的调度程序也是进程管理的一部分。概括地说,内核的进程管理活动就是在单个或多个CPU上实现多进程的抽象。
2) 内存管理
内存是计算机的主要资源之一,用来管理内存的策略是决定系统性能的一个关键因素。内核在有限的可用资源上为每个进程都创建了一个虚拟寻址空间。内核的不同部分在和内存管理子系统交互时使用一套相同的系统调用。
3) 文件管理
Linux在很大程度上依赖于文件系统的概念,Linux中的每个对象都可以被视为文件。
4) 设备控制
几乎每个系统操作最终都会映射到物理设备上。除了处理器、内存以及其他有限的几个实体外,所有的设备控制操作都由与被控制设备相关的代码来完成,这段代码叫作设备驱动程序。内核必须为系统中的每个外设嵌入相应的驱动程序。
5) 网络功能
网络功能也必须由操作系统来管理,因为大部分网络操作都和具体的进程无关。在每个进程处理这些数据之前,数据报必须已经被收集、标识和分发。系统负责在应用程序和网络之间传递数据。另外,所有的路由和地址解析问题都由内核进行处理。
2. Linux Shell
Shell是Linux系统下的命令解释器,它提供了用户与内核进行交互操作的一种接口。它接收用户输入的命令并把它送入内核去执行,类似于Microsoft Windows的Command命令。
Linux内核与界面是分离的,它可以脱离图形界面单独运行,同样也可以在内核的基础上运行图形化的桌面。在Linux的图形用户界面(GUI)下,终端窗口就是Shell。
每个Linux系统的用户可以拥有自己的用户界面或Shell,用以满足自身专门的Shell需要。
3. Linux文件系统
Linux的文件系统和Microsoft Windows的文件系统有很大的不同。Linux只有一个文件树,整个文件系统是以一个树根/为起点的,所有的文件和外部设备都以文件的形式挂接在这个文件树上,包括硬盘、软盘、光驱、调制解调器等,这和以“驱动器盘符”为基础的Microsoft Windows系统有很大区别。
Linux的文件系统如图3.1所示。


图3.1Linux文件系统的目录结构


下面对各主要目录做一个简要的介绍。
1) /bin和/sbin
这两个目录通常存放Linux基本操作命令的执行文件,其中的内容是一样的,二者的主要区别是: /sbin中的程序只能由root(系统管理员)来执行。
2) /dev
这是一个非常重要的目录,它存放着各种外部设备的镜像文件。在Linux中,所有的设备都当作文件进行操作。例如,第一个硬盘的名字是hda,硬盘中的第一个分区是hda1,第二个分区是hda2,第一个光盘驱动器的名字是hdc。用户可以非常方便地像访问文件一样对外部设备进行访问。
3) /lib
该目录用来存放系统动态链接共享库。Linux系统内核内置的已经编译好的驱动程序存放在/lib/modules/kernel目录下。几乎所有的应用程序都会用到这个目录下的共享库。因此,不要轻易对这个目录进行操作。
4) /usr
该目录用来存放用户应用程序和文件,类似于Windows下的ProgramFiles目录。Linux系统内核的源码存放在usr/src/kernels目录下。 
5) /etc
该目录用来存放系统的各种配置文件,系统在启动过程中需要读取其参数进行相应的配置。其中: 
· /etc/rc.d目录存放启动或改变运行级时运行的脚本文件及目录。
· /etc/passwd文件为用户数据库,其中的字段给出了用户名、真实姓名、起始目录、加密的口令和用户的其他信息。
· /etc/profile文件为系统环境变量的配置文件。
内核、Shell及文件系统一起形成了基本的操作系统结构。它们使得用户可以运行程序、管理文件以及使用系统。此外,Linux操作系统还有许多被称为实用工具的程序,能辅助用户完成一些特定的任务。
3.2Linux常用操作命令
通常,在完成Linux安装后,就可以进入与Windows类似的图形化窗口界面。这个界面是Linux图形化界面X窗口系统的一部分。要注意的是,X窗口系统仅仅是Linux的一个应用软件(或称为服务),它不是Linux自身的一部分。为了让Linux系统能高效、稳定地工作,建议读者尽可能地使用Linux的命令行界面,也就是在Shell环境下工作。
Linux中运行Shell的环境是图形用户界面下的“终端”窗口,读者可以单击“终端”启动Shell环境。
Linux中的命令非常多,本节只讲解最常用的一些操作命令。要了解更多的命令使用方法,请查阅相关资料和书籍。





视频讲解


3.2.1文件目录相关命令
Linux中有关文件目录的操作是最常用的,与文件目录相关的命令如表3.1所示。


表3.1文件目录相关命令



命令命 令 含 义程序所在目录
ls显示文件名(相当于 DOS 的 dir命令)/bin
cd切换目录(相当于 DOS 的 cd命令)Shell内部提供
cp复制文件(相当于 DOS 的 copy命令)/bin
mkdir创建新目录(相当于 DOS 的 md命令)/bin
rm删除文件(相当于 DOS 的 del命令)/bin
rmdir删除空目录(相当于 DOS的 rd命令)/bin
mv移动文件,另兼有更换文件名的作用/bin
pwd显示目前所在目录/bin
cat显示文本文件内容/bin
env查看环境设置/usr/bin
find查找文件/usr/bin
grep寻找某字串内容/bin
more分屏显示文本文件内容或输出结果/bin
mtools与MSDOS兼容的操作命令集/usr/bin
su用于切换用户/bin
df查看磁盘使用情况/bin
uname查看当前Linux版本信息,使用时要带参数r/bin


1. ls命令
1) 作用
ls的功能为列出目录的内容。该命令类似于DOS下的dir命令。
2) 命令格式

ls \[选项\] \[目录或文件名\]

3) 命令选项
· a: 显示指定目录下所有子目录与文件名,包括隐藏文件。
· l: 以长格式来显示文件的详细信息。
4) 示例
查看当前根目录下的文件。

\[root@localhost/\]# ls

bindevhomelibmiscoptroottftpbootusr

boot etcinitrdlost+foundmntprocsbintmpvar


查看当前root目录下的所有文件,包括隐藏文件。

\[root@localhostroot\]#ls-a

..esd_auth.gtkrc.tcshrcebook

...fonts.cache-1.gtkrc-1.2-gnome2.viminfotmp


查看当前root目录下的文件属性。

\[root@localhostroot\]#ls-l

total72

-rw-r--r--1rootroot965Jan32007anaconda-ks.cfg

drwx------4rootroot4096Jan32007evolution

-rw-r--r--1rootroot49492Jan32007install.log


每行显示的信息依次是: 文件类型与权限、链接数、文件属主、文件属组、文件大小、建立或最近修改的时间、文件名。
显示的信息中,开头是由10个字符构成的字符串,其中第一个字符表示文件类型,它可以是下述类型之一。
· : 普通文件
· d: 目录 
· l: 符号链接
· b: 块设备文件
· c: 字符设备文件
后面的9个字符表示文件的访问权限,分为3组,每组3位。
第1组表示文件属主的权限,第2组表示同组用户的权限,第3组表示其他用户的权限。每一组的3个字符分别表示对文件的读、写和执行权限。
2. 文件权限的表示
用户对文件的读、写和执行权限(简称文件权限)如下所示。
· r: 读权限。
· w: 写权限。
· x: 执行权限,对于目录,表示可进入权限。
文件权限也可用数字表示,其约定如下。
· 数字0: 无权限。
· 数字1: 可执行。
· 数字2: 写权限。
· 数字4: 读权限。
可用数字求和来表示多权限的组合。
例如,用户对某一文件拥有可读、可写、可执行的权限,则可表示为7(1+2+4=7),对另一文件拥有可读、可执行的权限,则可表示为5(1+4=5)。
若对文件拥有可读、可写的权限,则可表示为6(4+2=6),若对文件拥有可写、可执行的权限,则可表示为3(1+2=3)。
总结文件权限的对应关系,如表3.2所示。


表3.2权限对应关系



字符表示数字表示对应权限字符表示数字表示对应权限
0无权限wx3写和执行
x1只能执行rx5读和执行
w2只写rw6读和写
r4只读rwx7读、 写和执行


有时,用3位数字来表示文件权限,其中每位数字分别表示文件拥有者、同组用户、不同组用户的权限。
例如: 
600: 表示文件拥有者具有读写权限,其他用户均无任何操作权限。
777: 表示文件拥有者、同组用户、不同组用户均具有读、写和执行的权限。
3. cd命令
1) 作用
改变工作目录,该命令与DOS下的cd命令作用是相同的。
2) 命令格式

cd\[目录路径/\]目录名

3) 示例
将目录/usr/test设为当前目录。

\[root@localhostroot\]#cd/usr/test

\[root@localhosttest\]#pwd

/usr/test

命令pwd显示当前目录的绝对路径(从根目录/开始)。
4. mkdir命令
1) 作用
创建一个目录,该命令类似于DOS下的md命令。
2) 命令格式

mkdir\[目录路径/新目录名\]

5. cp命令
1) 作用
复制文件,可以使用通配符,该命令类似于DOS下的copy命令。
2) 命令格式

cp\[选项\]\[源文件路径\]源文件名目标路径\[目标文件名\]

3) 示例
在/tmp目录下,新建一个子目录mysub,并将/usr/test目录下的所有文件复制到mysub目录下: 

\[root@localhostroot\]#mkdir/tmp/mysub

\[root@localhostroot\]#cp/usr/test/*.*/tmp/mysub


6. rm命令和rmdir命令
1) 作用
· rm为删除指定文件,可以使用通配符,该命令类似于DOS下的del命令。
· rmdir为删除指定的目录,该目录必须为空目录。


2) 命令格式

· rm\[选项\]文件名

· rmdir目录路径/目录名

3) 命令选项
rm的命令选项如下。
· i: 询问是否删除(y表示是,n表示否)。
· f: 不询问是否删除。
· r: 递归删除整个目录,同rmdir。
4) 示例
删除前面示例中在/tmp目录下建立的子目录mysub。由于rmdir只能删除空目录,因此,要先将该目录下的所有文件删除。

\[root@localhostroot\]#rm -f/tmp/mysub/*.*

\[root@localhostroot\]#rmdir/tmp/mysub

7. cat命令
1) 作用
cat为在屏幕上显示文本文件内容的命令。
2) 命令格式

cat文件名

3) 示例
设有一个文本文件a.txt,应用cat显示其内容: 

\[root@localhostabc\]#cata.txt

Hello,I'mwritingtothisfile

cat命令也常用于查看当前Linux系统的版本,例如: 

\[root@localhostroot\]# cat /proc/version

Linuxversion2.6.35-22-generic(buildd@rothera)(gccversion4.4.5 (Ubuntu/
Linaro 4.4.4-14ubuntu4) ) #33-Ubuntu SMP Sun Sep 19 20: 34: 50 UTC 2010

8. pwd命令
1) 作用
pwd命令用来查看当前工作目录的完整路径。
2) 命令格式

pwd

3) 示例
显示当前所在的目录路径。

\[root@localhostabc\]# pwd

/mnt/abc




视频讲解


3.2.2磁盘及系统操作
在Linux中与磁盘操作及系统操作相关的命令如表3.3所示。


表3.3与磁盘及系统操作相关的命令



命令命 令 含 义程序所在目录

fdisk硬盘分区及显示分区状态的工具程序/sbin
df检查硬盘所剩(所用)空间/bin
free查看当前系统内存的使用情况/usr/bin
mount挂载某一设备成为某个目录名称/bin
umount取消挂载的设备/bin
du检查目录所用的空间/usr/bin
mkbootdisk制作启动盘/sbin
shutdown整个系统关机/sbin
reboot重启系统/sbin
login用户登录/bin
logout用户注销Shell内部提供

1. fdisk命令
1) 作用
fdisk命令可以用来给磁盘进行分区,查看磁盘情况等,往往使用参数l来显示系统的分区情况。
2) 命令格式

fdisk\[选项\]

3) 命令选项

-l显示系统的分区情况

4) 示例

\[root@localhostroot\]#fdisk-l

Disk/dev/sda: 8589MB,8589934592bytes

255 heads,63 sectors/track, 1044cylinders

Units = cylindersof 16065 *512=8225280 bytes

DeviceBootStartEndBlocksIdSystem

/dev/sda1*113 10439183Linux

/dev/sda214 10047960207+ 86Linux

/dev/sda31005 104432130082Linux swap

2. df命令
1) 作用
检查硬盘所剩(所用)空间。
2) 命令格式

df\[选项\]

3) 命令选项
· h: 以1024KB=1MB的方式显示磁盘的使用情况。
· H: 以1000Bytes为换算单位的方式显示磁盘的使用情况。
4) 示例

\[root@localhostroot\]#df-h

FilesystemSizeUsedAvail Use%Mounted on

/dev/sda27.5G4.8G2.4G 67%/

/dev/sda199M9.3M85M10%/boot

None 78M078M0%/dev/shm

\[root@localhostroot\]#df-H

FilesystemSizeUsedAvailUse%Mounted on

/dev/sda28.1G5.1G 2.6G67%/

/dev/sda1104M9.7M89M10%/boot

None 82M082M0%/dev/shm 

3. free命令
1) 作用
free命令的功能是查看当前系统内存的使用情况,它显示系统中剩余及已用的物理内存和交换内存,以及共享内存和被核心使用的缓冲区。
2) 命令格式

free\[选项\]

3) 命令选项
· b: 以B(字节)为单位显示。
· k: 以KB为单位显示。
· m: 以MB为单位显示。
4) 示例

\[root@localhostroot\]#free-b

totalusedfreesharedbufferscached 

Mem16210739283656784784506880961331233099776

-/+ buffers/cache:40943616121163776

Swap: 3290030080329003008

\[root@localhostroot\]#free-m

totalusedfreesharedbufferscached

Mem15479740 931

-/+ buffers/cache:39115

Swap:313 0313

4. mount命令
1) 作用
挂载某一设备使之成为某个目录名称。
2) 命令格式

mount \[选项\] <-t 类型> \[-o 挂载选项\] <设备> <挂载点>

3) 命令选项
· t: 该参数配合选项用于指定一个文件系统分区的类型。
· o: 该参数配合选项用于指定一个或多个挂载选项。
其具体可供选择的内容见表3.4所示。


表3.4mount命令的参数选项



命 令 参 数对 应 选 项选 项 说 明
tvfat
ntfs
hpfs
ext2、ext3、nfs
iso9660
挂载Windows 95/98的FAT32文件系统

挂载Windows NT/2000的文件系统 

挂载OS/2用的文件系统 

挂载Linux用的文件系统 

挂载CDROM 光盘

oro,rw
async,sync
auto,noauto
dev,nodev
exec,noexec
user,nouser
defaults
remount
挂载区为只读(ro)或读写(rw)

挂载区为同步写入(sync)或异步写入(async)

允许此挂载区被 mount a自动挂载(auto)

是否允许在此挂载区上建立档案,dev为可以

是否允许此挂载区上拥有可执行的二进制文件

是否允许此挂载区让普通用户拥有mount的权限

默认值为rw,suid,dev,exec,auto,nouser,async

重新挂载

4) 命令使用说明
挂载设备之前,首先要确定设备的类型和设备名称,确定设备名称可通过使用命令fdiskl查看。
要卸载已经挂载的设备,使用umount命令。
umount命令是mount命令的逆操作,umount命令的作用是卸载一个文件系统。例如,将光驱装载到 /mnt/cdrom目录后,若要取出光盘,必须先使用umount命令进行卸载,否则无法取下。它的参数使用方法和mount命令是一样的,命令格式如下。

umount<挂载点|设备>

5) 示例
【例31】挂载一个Linux分区,将其挂载到/mnt目录下(/mnt称为挂载点)。

\[root@localhostroot\]# mount -t ext3 /dev/hdb1 /mnt

【例32】挂载硬盘的Windows分区,将其挂载到/mnt/wind目录下。
(1) 用fdiskl查看硬盘的Windows分区在linux下的设备名称。

\[root@localhost /\]# fdisk -l

Disk /dev/hda: 500.1 GB, 500105249280 bytes

255 heads, 63 sectors/track, 60801 cylinders

Units = cylinders of 16065 * 512 = 8225280 bytes


Device BootStartEndBlocksIdSystem

/dev/hda1 1510040965718+2dUnknown

/dev/hda2 510160801447418282+fW95 Ext'd (LBA)

/dev/hda5510124223153605466bW95 FAT32

/dev/hda624224433461536054662dUnknown

/dev/hda743347608011402072562dUnknown


Disk /dev/sda: 21.4 GB, 21474836480 bytes

255 heads, 63 sectors/track, 2610 cylinders

Units = cylinders of 16065 * 512 = 8225280 bytes


Device BootStartEndBlocksIdSystem

/dev/sda1*11310439183Linux

/dev/sda214261020860402+8eLinux LVM

(2) 将设备名称为/dev/hda5的Windows分区挂载到/mnt/wind。

\[root@localhostroot\]#mount -t vfat/dev/hda5/mnt/wind

/mnt/wind称为挂载设备/dev/hda5的挂载点。在挂载了硬盘的Windows分区之后,可直接访问Windows下的磁盘内容。
【例33】挂载U盘。
U盘的挂载方法同硬盘的挂载方法是一样的,先用fdisk l查看U盘的设备名称, U盘一般是以sdb出现的。设U盘的名称为/dev/sdb1,则其挂载命令如下。

\[root@localhost/\]#mount-tvfat/dev/sdb1/mnt/usb

卸载U盘的命令如下。

\[root@localhost/\]#umount /mnt/usb



视频讲解


3.2.3打包压缩相关命令
Linux常用的压缩及解压缩命令如表3.5所示。


表3.5Linux常用的压缩及解压缩命令说明



压缩工具解压工具压缩文件扩展名压缩工具解压工具压缩文件扩展名

gzipgunzip.gzcompressuncompress.Z
zipunzip.ziptartar.tar

1. gzip命令
1) 作用
对单个文件进行压缩或对压缩文件进行解压缩,压缩文件名后缀为.gz。
2) 命令格式

gzip压缩或解压缩文件名

3) 命令选项
· d: 对压缩文件进行解压缩。
· r: 递归方式查找指定目录并压缩其中所有文件或解压缩。
· v: 对每个压缩文件显示文件名和压缩比。
· num: 用数值num指定压缩比,num取值1~9,其中1代表压缩比最低,9代表压缩比最高,默认值为6。
4) 示例

\[root@localhosttest\]# gzip test.txt

\[root@localhosttest\]# ls

test.txt.gz

2. tar命令
1) 作用
对文件进行打包或解包,打包文件名后缀为.tar。利用tar命令,可以把多个文件和目录全部打包成一个文件,这对于备份文件或将几个文件组合成为一个文件以便于网络传输是非常有用的。注意,打包与压缩是两个不同的概念,打包只是把多个文件组成一个总的文件,不一定被压缩。
2) 命令格式

tar\[选项\]目标文件名源文件列表

3) 命令选项
· A或catenate: 新增文件到已存在的备份文件。
· c或create: 建立新的备份文件。
· f<备份文件>或file=<备份文件>: 指定备份文件。
· r或append: 新增文件到已存在的备份文件的结尾部分。
· t或list: 列出备份文件的内容。
· u或update: 仅置换较备份文件内的文件更新的文件。
· v或verbose: 显示指令执行过程。
· w或interactive: 遭遇问题时先询问用户。
· x或extract或get: 从备份文件中还原文件。
· z或gzip或ungzip: 通过gzip指令处理备份文件。
4) 示例
将文件包filetest.tar.gz 解包的命令如下。


#tar -zxvffiletest.tar.gz



视频讲解


3.2.4网络相关命令
Linux有许多与网络相关的命令,下面介绍几个常用的网络操作命令。
1. ifconfig命令
1) 作用
用于查看和配置网络接口的地址和参数,包括IP地址、网络掩码和广播地址。它的使用权限是超级用户。
2) 命令格式
· 查看网卡配置信息:  ifconfig
· 设置网卡:  ifconfig eth0\[主机IP地址\]
eth0代表第1块网卡,eth1代表第2块网卡,若主机上仅安装了一块网卡,则为eth0。
3) 示例

\[root@localhost /\]# ifconfig 

eth0Link encap: Ethernet HWaddr 00: 11: 11: 11: 23: 5A 

inet addr: 192.168.1.15 Bcast: 192.168.1.255 Mask: 255.255.255.0

inet6 addr:  fe80::208:2ff:fee0:c18a/64 Scope:Link 

UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 

RX packets: 26931 errors: 0 dropped: 0 overruns: 0 frame: 0 

TX packets: 3209 errors: 0 dropped: 0 overruns: 0 carrier: 0 

collisions: 0 txqueuelen: 1000 

RX bytes: 6669382 (6.3 MiB) TX bytes: 321302 (313.7 KiB) 

Interrupt: 11 



loLink encap: Local Loopback 

inet addr: 127.0.0.1 Mask: 255.0.0.0 

inet6 addr:  ::1/128 Scope: Host 

UP LOOPBACK RUNNING MTU: 16436 Metric: 1 

RX packets: 1381 errors: 0 dropped: 0 overruns: 0 frame: 0 

TX packets: 1381 errors: 0 dropped: 0 overruns: 0 carrier: 0 

collisions: 0 txqueuelen: 0 

RX bytes: 1354690 (1.2 MiB) TX bytes: 1354690 (1.2 MiB) 

重新设置网卡的IP地址,改设为192.168.1.100,则使用以下命令。

\[root@localhost /\]# ifconfig eth0 192.168.1.100

注意: 用ifconfig命令配置的网络参数不需重启就可生效,但机器重新启动以后其设置将会失效。
2. ping命令
1) 作用
ping命令用于检测网络连接情况,从而判断主机联网是否连接正常。
2) 命令格式

ping \[IP地址\]

3) 示例

\[root@localhost /\]# ping 192.168.1.1

PING 192.168.1.1(192.l168.1.1)56(84) bytes of data.

64 bytes from 192.168.1.1 icmp_seq=0ttl=64time=2.439 ms

64 bytes from 192.168.1.1 icmp_seq=1ttl=64time=1.149 ms

64 bytes from 192.168.1.1 icmp_seq=2ttl=64time=1.043 ms

64 bytes from 192.168.1.1 icmp_seq=3ttl=64time=1.038 ms


--- 192.168.1.1 ping statistics ---

4 packets transmitted, 4 received. 0% packet loss, time 7004ms

rtt min/avg/max/mdev = 1.038/1.924/2.439/1.529 ms, pipe 2




视频讲解


3.3Linux的文本编辑器
3.3.1Vi文本编辑器



Vi是Linux系统的第一个全屏幕交互式编辑程序,它从诞生至今一直得到广大用户的青睐,历经数十年仍然是人们主要使用的文本编辑工具,足以见其生命力之强,而强大的生命力是其强大的功能带来的。由于大多数读者在此之前都已经用惯了Windows的Word等编辑器,因此,在刚刚接触Vi时总会或多或少不适应,但只要习惯之后,就能感受到它的方便与快捷。
1. Vi的模式 
Vi有3种模式,分别为命令行模式、插入模式和底行模式。各模式的功能具体进行介绍如下。 
1) 命令行模式
用户在用Vi编辑文件时,最初进入的为一般模式。在该模式中可以通过上下移动光标进行“删除字符”或“整行删除”等操作,也可以进行“复制”“粘贴”等操作,但无法编辑文字。
2) 插入模式
只有在该模式下,用户才能进行文字编辑输入,用户可按Esc键回到命令行模式。
3) 底行模式
在该模式下,光标位于屏幕的底行。用户可以进行文件保存或退出操作,也可以设置编辑环境,如寻找字符串、列出行号等。
2. Vi的基本流程 
(1) 进入Vi,即在命令行下输入Vi hello(文件名)。 此时进入的是命令行模式,光标位于屏幕的上方,如图3.2所示。 


图3.2进入Vi命令行模式


(2) 在命令行模式下输入i进入插入模式,如图3.3所示。可以看出,在屏幕底部显示有“插入”字样表示插入模式,在该模式下可以输入文字信息。 


图3.3进入Vi插入模式



(3) 在插入模式中,按Esc键,则当前模式转入命令行模式,此时在底行行中输入:wq(存盘退出)进入底行模式,如图3.4所示。


图3.4进入Vi底行模式


这样,就完成了一个简单的Vi操作流程: 命令行模式→插入模式→底行模式。由于Vi在不同的模式下有不同的操作功能,因此,读者一定要时刻注意屏幕最下方的提示,分清所在的模式。

3. Vi的各模式功能键
(1) 命令行模式常见功能键如表3.6所示。


表3.6Vi命令行模式功能键



功能键功 能 说 明 

I切换到插入模式,此时光标位于开始输入文件处
A切换到插入模式,并从目前光标所在位置的下一个位置开始输入文字
O切换到插入模式,且从行首开始插入新的一行
Ctrl+B屏幕往后翻动一页
Ctrl+F屏幕往前翻动一页
Ctrl+U屏幕往后翻动半页
Ctrl+D屏幕往前翻动半页
0光标移到本行的开头
G光标移动到文章的最后
nG光标移动到第n行
$移动到光标所在行的行尾
n光标向下移动n行

续表


功能键功 能 说 明 

/name在光标之后查找一个名为name的字符串
?name在光标之前查找一个名为name的字符串
X删除光标所在位置的一个字符
dd删除光标所在行
ndd从光标所在行开始向下删除n行
yy复制光标所在行
nyy复制光标所在行开始的向下n行
p将缓冲区内的字符粘贴到光标所在位置(与yy搭配)
U恢复前一个动作

(2) 插入模式的功能键只有一个,也就是Esc退出到命令行模式。
(3) 底行模式常见功能键如表3.7所示。 


表3.7Vi底行模式功能键



功能键 功 能 说明
: w 将编辑的文件保存到磁盘中 
: q退出 Vi(系统对做过修改的文件会给出提示) 
: q!强制退出 Vi(对修改过的文件不作保存) 
: wq 存盘后退出 
: w \[filename\]另存一个名为 filename 的文件 
: set nu显示行号,设定之后,会在每一行的前面显示对应行号 
: set nonu取消行号显示



视频讲解


3.3.2gedit文本编辑器
除了vi之外,Linux下还有一个功能同样强大的编辑器gedit。gedit是一个GNOME桌面环境下兼容UTF8的文本编辑器。它简单易用,有良好的语法高亮,对中文支持很好,支持包括GB2312、GBK在内的多种字符编码,是一款自由软件。
gedit是一个功能强大的文本编辑器,类似于Windows系统下面的记事本,它的功能比Windows系统的记事本更强大,还具有行号显示、括号匹配、文本自动换行、自动文件备份等功能,适合编写程序代码。
1. gedit的启动
gedit的启动方式有多种,可以从菜单启动,也可以从终端命令行启动。从菜单启动时,选择桌面顶部的“应用程序”|“附件”|“文本编辑器”命令即可打开; 从终端启动,只需要输入代码$gedit再按Enter键即可。
gedit启动之后的主界面如图3.5所示。


图3.5gedit主界面



2. 窗口说明
读者可以看到gedit启动的界面和Windows中的“写字板”程序相似。窗口上有菜单栏、工具栏、编辑栏、状态栏等。
3. 常用的技巧
1) 打开多个文件
要从命令行打开多个文件,请输入“gedit file1.txt file2.txt file3.txt”命令,然后按下Enter键。
2) 将命令的输出输送到文件中
例如,要将ls命令的输出输送到一个文本文件中,请输入“ls | gedit”,然后按下Enter键。ls命令的输出就会显示在gedit窗口的一个新文件中。
3) 更改“突出显示模式”以适用各种文件
例如,更改以适应html文件的步骤为,依次选择菜单中的“查看”|“突出显示模式”|“标记语言”|HTML,即可以彩色模式查看html文件。
4) 插件
gedit中有多种插件可以选用,这些插件极大地方便了用户处理代码,常用的包括以下几种。
· 文档统计信息: 选择菜单栏中的“工具”|“统计文档”命令,出现“文档统计信息”对话框,里面显示了当前文件中的行数、单词数、字符数及字节数。
· 高亮显示: 选择“视图”|“高亮”,然后选择需要高亮显示的文本。
· 插入日期/时间: 选择“编辑”|“插入时间和日期”命令,则在文件中插入当前时间和日期。
· 跳到指定行: 选择“查找”|“进入行”命令,之后输入需要定位的行数,即可跳到指定的行。
5) 常用的快捷键
gedit常用的快捷键如表3.8所示。 


表3.8gedit常用的快捷键



快捷键功 能 说 明 快捷键功 能 说 明 
Ctrl+Z撤销Ctrl+Q退出
Ctrl+C复制Ctrl+S保存
Ctrl+V粘贴Ctrl+R替换
Ctrl+T缩进

3.4Linux启动过程
了解Linux的常见命令之后,下面介绍Linux的启动过程。Linux的启动过程包含了Linux工作原理的精髓,在嵌入式系统的开发过程中非常需要这方面的知识积累。
3.4.1Linux系统的引导过程
许多人对Linux的启动过程感到很神秘,因为所有的启动信息都在屏幕上一闪而过。其实,Linux的启动过程并不像启动信息所显示的那样复杂,它主要分成以下两个阶段。
(1) 启动内核。在这个阶段,内核装入内存并在初始化每个设备驱动器时打印信息。
(2) 执行程序init。装入内核并初始化设备后,运行init程序。init程序处理所有程序的启动,包括重要系统精灵程序和其他指定在启动时装入的软件。
首先,当用户打开PC的电源后,CPU将自动进入实模式,这时BIOS进行开机自检,并按BIOS中设置的启动设备(通常是硬盘)进行启动引导。BIOS通常是转向硬盘的第一个扇区,寻找用于装载操作系统的指令。装载操作系统的这个程序就是BootLoader。针对不同的硬件平台,需要有专门的Bootloader程序。Bootloader程序依赖于特定的硬件。
Linux里面的BootLoader通常是lilo或者grub,从Red Hat Linux 7.2起,GRUB(GRand Unified Bootloader)取代lilo成为默认的启动装载程序。


图3.6Linux的启动过程



对于嵌入式Linux系统,经常使用另一款功能强大的BootLoader: Blob。Blob是Boot Loader Object的缩写,它遵循GPL,源代码完全开放。Blob既可以用来简单地调试,也可以启动Linux内核。
下面以Red Hat为例,简单介绍Linux在PC上运行时的启动过程。
当用户打开PC的电源,BIOS开机自检,按BIOS中设置的启动设备(通常是硬盘)启动,接着启动设备上安装的引导程序lilo或grub开始引导Linux。Linux首先进行内核的引导,接下来执行init程序。init程序调用rc.sysinit和rc等程序,rc.sysinit和rc完成系统初始化和运行服务的任务后,返回init; init启动mingetty后,打开终端供用户登录系统,用户登录成功后进入Shell,这样就完成了从开机到登录的整个启动过程。启动流程如图3.6所示。
1. 启动内核
计算机启动时,BIOS装载MBR,然后从当前活动分区启动,LILO获得引导过程的控制权后,会显示LILO提示符。此时如果用户不进行任何操作,LILO将在等待指定时间后自动引导默认的操作系统,而如果在此期间按下Tab键,则可以看到一个可引导的操作系统列表,选择相应的操作系统名称就能进入相应的操作系统。
当用户选择启动Linux操作系统时,LILO就会根据事先设置好的信息从ROOT文件系统所在的分区读取Linux映象,然后装入内核映象并将控制权交给Linux内核。Linux内核获得控制权后,以如下步骤继续引导系统。
(1) Linux内核一般是压缩保存的,因此,它首先要进行自身的解压缩。内核映象前面的一些代码完成解压缩。
(2) 如果系统中安装有可支持特殊文本模式的、且Linux可识别的SVGA卡,Linux会提示用户选择适当的文本显示模式。但如果在内核的编译过程中预先设置了文本模式,则不会提示选择显示模式。该显示模式可通过LILO或RDEV工具程序设置。
(3) 内核接下来检测其他的硬件设备,例如硬盘、软驱和网卡等,并对相应的设备驱动程序进行配置。这时,显示器上出现内核运行输出的一些硬件信息。
(4) 接下来,内核装载ROOT文件系统。ROOT文件系统的位置可在编译内核时指定,也可通过LILO或RDEV指定。文件系统的类型可自动检测。如果由于某些原因装载失败,则内核启动失败,最终会终止系统。
2. 执行init程序
利用init程序可以方便地定制启动期间装入哪些程序。init的任务是启动新进程和退出时重新启动其他进程。例如,在大多数Linux系统中,启动时最初装入6个虚拟的控制台进程,退出控制台窗口时,进程死亡,然后init启动新的虚拟登录控制台,因而总是提供6个虚拟登录控制台。控制init程序操作的规则存放在文件/etc/inittab中。Red Hat Linux默认的inittab文件如下。

#inittab This file describes how the INIT process should set up the system in a certain

#run-level.

#Default runlevel.The runlevels used by RHS are: 

#0-halt(Do NOT set initdefault to this)

#1-Single user mode

#2-Multiuser,without NFS(the same as 3,if you do not have networking)

#3-Full multiuser mode

#4-unused

#5-X11

#6-reboot(Do NOT set initdefault to this)

id: 3: initdefault: 


#system initialization

si::sysinit: /etc/rc.d/rc.sysinit

10:0:wait: /etc/rc.d/rc 0

11:1:wait: /etc/rc.d/rc 1

12:2:wait: /etc/rc.d/rc 2

13:3:wait: /etc/rc.d/rc 3

14:4:wait: /etc/rc.d/rc 4

15:5:wait: /etc/rc.d/rc 5

16:6:wait: /etc/rc.d/rc 6

#Things to run in every runlevel

ud:once: /sbin/update


#Trap CTRL-ALT-DELETE

ca::ctrlaltdel: /sbin/shutdown -t3 -r now


#When our UPS tells us power has failed,assume we have a few minutes of

power left.Schedule a

#shutdown for 2 minutes from now.

#This does,of course,assume you have powered installed and your UPS

connected and working

#correctly.

pf::powerfail: /sbin/shutdown -f -h 2 "Power Restored;Shutdown Cancelled"


#Run gettys in standard runlevels

1: 2345: respawn: /sbin/minggetty tty1

2: 2345: respawn: /sbin/minggetty tty2

3: 2345: respawn: /sbin/minggetty tty3

4: 2345: respawn: /sbin/minggetty tty4

5: 2345: respawn: /sbin/minggetty tty5

6: 2345: respawn: /sbin/minggetty tty6

#Run xdm in runlevel 5


x: 5: respawn: /usr/bin/X11/xdm -nodaemon

Linux有个运行级系统,运行级是表示系统当前状态和init应运行哪个进程并保持在这种系统状态中运行的数字。在inittab文件中,第一个项目指定启动时装入的默认运行级。
上例中是个多用户控制台方式,运行级为3。然后,inittab文件中每个项目指定第2个字段的项目用哪种运行级(每个字段用冒号分开)。因此,对运行级3,下列行是相关的。

13: 3: wait: /etc/rc.d/rc 3

1: 2345: respawn: /sbin/minggetty tty1

2: 2345: respawn: /sbin/minggetty tty2

3: 2345: respawn: /sbin/minggetty tty3

4: 2345: respawn: /sbin/minggetty tty4

5: 2345: respawn: /sbin/minggetty tty5

6: 2345: respawn: /sbin/minggetty tty6

最后6行建立Linux提供的6个虚拟控制台。第一行运行启动脚本/etc/rc.d/rc 3,将运行目录/etc/rc.d/rc3.d中包含的所有脚本,这些脚本表示系统初始化时要启动的程序。一般来说,这些脚本不需要编辑或改变,是系统默认的。
3.4.2ARM Linux操作系统
ARM Linux是一种常见的嵌入式操作系统,主要运行在以ARM为核心的处理器上。根据运行的层次,可以划分为三大部分: 启动引导(Bootloader)、操作系统内核(Linux Kernel)和文件系统(File System)。
启动引导程序Bootloader非常像PC中的BIOS程序,主要负责初始化系统的最基本设备,通常主要包括CPU、网络、串行接口。当基本部分初始化成功后,会把操作系统的镜像文件装载到内存中,最后把CPU的控制权交给内核程序。
内核接管系统后,会重新检查外部器件的运行状态,初始化所有外部硬件设备,加载驱动程序,检查系统参数表,装载文件系统,运行SHELL程序,等待用户输入命令,或直接运行设定好的应用程序。内核在运行的过程中,会把基本的初始化信息打印到终端(通常是串口0或LCD),并且通过终端接收用户命令,它负责控制应用程序的运行状态,实现对整个系统的控制。Linux内核是Linux的最核心部分,内核的优劣决定了整个系统是否稳定与高效。
文件系统是一种数据结构,使操作系统明确存储介质(Flash或硬盘等)上的文件,即在存储介质上组织文件的方法。文件系统通常占用大部分的存储空间,主要负责保存应用程序和数据,由Linux内核管理。
Bootloader、KERNEL、FS(FILE SYSTEM)都存储在Flash中,运行时,根据需要被加载到内存里。图3.7给出了板上内存的地址空间分布: MEMORY MAP。


图3.7内存的地址空间分布: MEMORY MAP







视频讲解


3.5数据共享与数据传输
3.5.1应用串口通信协议传输数据
1. 串口通信协议


串口通信协议由Xmodem、Ymodem、Zmodem等协议组成。
Xmodem协议是一种应用于串口通信的文件传输协议。这种协议以包为传输信息的单位来传输数据,并且每个包都使用一个校验和过程来进行错误检测。1个包=128字节,传输速度较慢。
Ymodem协议由Xmodem协议演变而来,传输效率及可靠性均较高,它的1个包=1024字节。Ymodem一次传输可发送或接收多个文件。
Zmodem协议也是由Xmodem协议演变而来,以连续的数据流发送数据,传输效率更高。
2. Windows系统主机传输文件到Linux系统开发板
当需要把Windows系统主机的文件传输到Linux系统开发板时,可以使用本方法来实现。首先,用串口通信数据线连接Windows系统主机和Linux系统开发板,如图3.8所示。


图3.8用串口通信数据线连接Windows系统主机和Linux系统开发板


1) 在Windows系统主机端设置发送文件
在Windows系统主机的桌面“开始”菜单中,选择“程序”|“附件”|“通信”|“超级终端”项,打开“连接描述”对话框,填写超级终端连接的名称,单击“确定”按钮,如图3.9所示。Windows 7以后版本没有自带“超级终端”,可以从网络上搜索下载“超级终端”软件。
在打开的“连接到”对话框中选择串口通信的连接端口为COM1端口,单击“确定”按钮,如图3.10所示。


图3.9设置超级终端的连接名称





图3.10选择COM1为连接端口





图3.11设置端口参数



在打开的“COM1属性”对话框中,设置端口的各个重要参数值: 每秒位数(波特率)为115200,数据位为8位,奇偶校验为“无”,停止位为1,数据流控制为“无”,如图3.11所示。设置好端口的参数值后,单击“确定”按钮。
2) 在Linux系统开发板端设置接收文件
在开发板端设置接收文件的操作很简单,只需通过minicom窗口,进入准备接收数据文件的目录等待发送来的文件即可。
3) 发送数据
在Windows系统主机端,继续前面的“超级终端”窗口操作。
在超级终端的串口通信窗口的“发送”菜单中,选择“发送文件”项,如图3.12所示。
在弹出的“发送文件”对话框中,单击“浏览”按钮,选择需要传送的数据文件; 然后在“协议”下拉列表框中,选择Xmodem协议,如图3.13所示。


图3.12在超级终端选择“发送文件”菜单项





图3.13选择发送的文件和Xmodem协议


这时,在“为串口通信发送Xmodem文件”窗口可以看到数据传送的过程,如图3.14所示。


图3.14传输数据


文件传输完毕后,在开发板的接收数据文件的目录中可以看到传送的文件。
3. Linux系统主机传输数据到Linux系统开发板
经常需要把在Linux系统主机上经过交叉编译后的文件传输到Linux系统开发板运行,可以使用本方法来实现传送文件。
首先,用串口通信数据线连接Linux系统主机和Linux系统开发板,如图3.15所示。


图3.15用串口通信数据线连接Linux系统主机和Linux系统开发板


1) 在开发板端设置接收文件
通过minicom窗口操作开发板端文件系统,进入准备接收数据文件的目录,等待发送来的文件。
2) 从Linux系统主机端发送文件
在minicom窗口中,按下Ctrl+A+S快捷键,弹出选择传输数据协议的对话框,如图3.16所示。


图3.16在minicom窗口中弹出选择传输数据协议的对话框


用键盘上的方向键移动光标至xmodem项后,按Enter键确定。进入Linux系统主机端的文件系统,按“上”“下”方向键移动文件目录前面的小方块,按两次空格键进入选定的目录,若要返回到上一级目录,则选中\[..\]后按两次空格键,如图3.17所示。


图3.17按“上”“下”方向键移动小方块,选择需要的文件目录


进入需要的文件目录后,按“上”“下”方向键移动小方块,选择需要传送的文件。找到需要的文件按空格键选中该文件;若要取消选中,则再次按空格键,如图3.18所示。


图3.18按空格键选中需要的文件


选中需要传输的文件,按Enter键,则开始发送文件。当显示Transfer incomplete时,表示文件传输完毕,如图3.19所示。



图3.19发送文件完毕





视频讲解


3.5.2在VMware虚拟机中设置Windows
与Linux系统的数据
共享
在VMware虚拟机中可以设置Windows与Linux系统的共享。设Windows操作系统的VMware中安装有Linux操作系统,通过VMware虚拟机可以设置Windows与Linux系统的共享,如图3.20所示。


图3.20在VMware虚拟机中设置Windows与Linux系统的数据共享


1. 安装VMware Tools
在VMware虚拟机中选择“虚拟机(VM)”菜单,在弹出的下拉菜单中选择Install VMware Tools项,Linux系统桌面上会出现一个名为VMware Tools的光盘图标。

双击VMware Tools光盘图标,打开光盘,复制VMware Tools.tar.gz文件到/home目录下,将其解压至/home/vmwaretoolsdistrib目录下。进入安装目录/home/vmwaretoolsdistrib中,在终端运行如下命令。

./vmware-install.pl

安装过程中会有一些文件安装路径的提示问题,按Enter键即可,如图3.21所示。


图3.21在终端运行vmwareinstall.pl



2. 设置共享文件夹
选择VMware虚拟机“虚拟机(VM)”菜单中的“设置(Settings)”项,弹出“虚拟机设置”对话框。选择“选项”选项卡,在左侧选择“共享文件夹”项,然后单击右侧的“添加”按钮,添加Windows系统中的共享文件夹,如图3.22所示。


图3.22设置Windows系统的共享文件夹


3. 在Linux系统中操作Windows系统的共享文件夹
在Linux系统中,打开/mnt目录,可以看到其中存在一个hgfs目录。打开/mnt/hgfs目录,可以看到Windows系统的共享文件夹,如图3.23所示。因而在Linux系统中,可以很方便地对这些共享文件夹的文件进行复制、删除、修改等操作。


图3.23在Linux系统中操作Windows系统的共享文件夹


本 章 小 结
本章介绍了Linux的基本概念、Linux文件系统的概念、嵌入式Linux系统中常用的命令、Linux系统的文本编辑器的使用、Linux系统的启动过程等。这些都是Linux中最基础、最常见的概念,掌握和理解这些知识对进一步学习和使用Linux系统有很大帮助,因此,必须多上机练习,熟练掌握它们。
习题
1. 查看Linux目录结构,说出下列目录放置的数据类型。 

/etc/: 

/etc/rc.d/init.d/: 

/usr/bin: 

/bin: 

/sbin: 

/dev: 

2. Bootloader有什么作用?为什么不作为操作系统的一部分加以实现?
3. 叙述在主机端配置NFS服务的过程。
4. 应用串口协议传输,把主机端的一个文件传输到开发板上,并记录下操作过程。 
5. 在VMware虚拟机中建立Windows操作系统与Linux操作系统的数据共享文件目录。