配色: 字号:
《ARM9嵌入式系统设计基础教程》第11章Linux操作系统基础
2023-05-24 | 阅:  转:  |  分享 
  
第11章 Linux操作系统基础11.1嵌入式Linux的开发环境11.1.1交叉开发概述 用于开发和调试目标板上所用到的操作系统
、应用程序等所有软件。这种在宿主机上开发程序、在目标板上运行程序的方式,通常就叫做交叉开发 目标板(Target)可以是嵌入式应用
软件的实际运行环境,当然也可以是替代实际环境的仿真系统(如软件模拟器)。宿主机(Host)通过串口、网络连接或调试接口(如JTAG
仿真器)与目标机通信。宿主机的软硬件资源比较丰富,其操作系统主要有Windows和Linux两种,其上用于开发程序的那套软件工具,
通常叫做开发工具链。 11.1.2桌面Linux的开发工具链GNU 开发工具链( toolchain )主要包括GNU Compi
ler Collection 、 GNU libc 以及用来编译、测试和分析软件的GNU binutils 三个大的模块。 11.
1.3嵌入式Linux的交叉开发工具链基于ARM平台的交叉工具链,这里将其目标平台名为arm-linux-gnu,比如arm-li
nux-gcc、arm-linux-gdb等。 分步构建交交叉开发工具链的整个过程:1.下载源代码 到相
关的网站下载包括binutils、gcc、glibc(如ftp.gnu.org)及linux(如ftp.kernel.org)内核
的源代码.注意:glibc和内核源代码的版本必须与目标机上实际使用的版本保持一致. 11.1.3嵌入式Linux的交叉开发工具链2
.建立环境变量 声明以下环境变量的目的是在之后编译工具库的时候用到,很方便输入,尤其是可以降低输错路径的风险。3
.配置、安装binutils inutils是GNU工具之一,它包括连接器、汇编器和其他用于目标文件和档案的
工具,它是二进制代码的维护工具。安装Binutils工具包含的程序有addr2line、ar、as、c++filt、gprof、l
d、mm、 objcopy、ranlib、 readelf、size、strings、strip、libiberty、libbfd
和libopcodes。11.1.3嵌入式Linux的交叉开发工具链4. 配置linux内核头文件 编译器需要通过系统内核的头文件
来获得目标平台所支持的系统函数调用所需要的信息。对于LINUX内核,最好的方法是下载一个合适的内核,然后复制获得头文件。首先执行m
ake mrproper进行清理工作。接下来执行make config ARCH=arm(或make menuconfig/xco
nfig ARCH=arm)进行配置.11.1.3嵌入式Linux的交叉开发工具链5. 第一次编译gcc 完成此过程需要执行三个步
骤,分别如下: (1)修改t-linux下的内容 (2)配置gcc (3)编译、安装gcc11.1.3嵌入
式Linux的交叉开发工具链6. 交叉编译glibc 这一步骤生成的代码是针对目标机cpu的,因此它属于一个交叉编译过程。该过程要
用到linux内核头文件,默认路径为$PREFIX/arm- linux/sys-linux,因而需要在$PREFIX/arm-l
inux中建立一个名为sys-linux的软连接,使其内核头文件所在的 include目录. 或者也可以在接下来要执行的confi
gure命令中使用--with-headers参数指定linux内核头文件的实际路径。 11.1.3嵌入式Linux的交叉开发工具
链7. 第二次编译gcc 由于第一次安装的gcc没有交叉glibc支持,现在已经安装了glibc,所以需要重新编译来支持glibc
。 到此为止整个交叉开发工具链就完全生成了。 11.2 桌面Linux的安装11.2.1双操作系统环境一般会用到两个桌面操作系统,
即linux和windows操作系统,其中Linux主要有Redhat/Fedora、Suse、Mandrake等发行版本 Win
dows 与Linux 的双重启动为Linux操作系统准备硬盘空间11.2.2 Cygwin模拟环境Cygwin是GNU的开发人员
为了能将Linux系统下一些应用移植到Windows环境下而开发的一套中间移植工具即模拟环境。安装完成后,就是Windows下的一
个目录,而里面又提供了Linux操作系统环境。11.2.3 VMware虚拟机环境VMware workstation是VMwar
e公司设计的专业虚拟机,可以在Windows平台上为几乎任何的其他操作系统提供虚拟运行环境。顾名思义,只要物理主机的内存、CPU等
配置足够,就可以在Windows平台上,再“虚拟”出一台或多台“PC机”,而且使用简单,容易上手,是目前用得非常广泛的工具软件。
11.3 Linux的使用11.3.1 Linux基本命令adduser示例:创建pdr帐户adduser pdr2. cat示例
:cat text 在屏幕上显示文件text的内容;cat -n textfile1 > textfile2 把 textfil
e1 的文件内容加上行号后输入 textfile2 这个文件里;3.Cd示例:假设用户当前目录是 /home/xu 现需要更换到/
home/xu/pro 目录中$ cd pro4. cp示例:$ cp - r /usr/xu/ /usr/liu/ 表示将/us
r/xu 目录中的所有文件及其子目录拷贝到目录/usr/liu中。5. df示例:列出各文件系统的磁盘空间使用情况。 #df 6.
df示例:显示包含在每个文件以及目录/home/fran的子目录中的磁盘块数。du -a /home/fran7.Export示
例:显示当前所有环境变量的设置情况#export8. fdisk示例:查看当前系统中磁盘的分区状况,包括硬盘、U盘等fdisk -
l9.ln示例:要为当前目录下的file文件建立一个硬链接,名为/home/lbt/doc/file/,可用如下命令: ln fi
le /home/lbt/doc/file 10.locate 示例:locate filename: 寻找系统中所有叫filen
ame的文件 11.Ls示例:将 /bin 目录以下所有目录及文件详细资料列出 : ls -lR /bin12. minicom示
例:开启minicom得配置界面minicom –s13. Mkdir示例:在当前目录中创建嵌套的目录层次inin 和inin下的
mail目录,权限设置为只有文件拥有者有读、写和执行权限。mkdir -p -m 700 ./inin/mail/14.Mount
示例:挂载ntfs格式的hda7分区到/mnt/cdrom文件夹mount -o iocharset=cp936 /dev/hda
7 /mnt/cdrom15.mv示例:$ mv /usr/xu/ . 表示将/usr/xu 中的所有文件移到当前目录 用 .
表示16.Passwd示例:passwd pengdr17. ping示例:ping www.sina.com.cn18.pw
d示例:查看当前工作:pwd19. reboot示例:做个重开机的模拟(只有纪录并不会真的重开机)。reboot –w20. rm
dir示例:在工作目录下的 BBB 目录中,删除名为 Test 的子目录。若 Test 删除后,BBB 目录成为空目录,则 BBB
亦予删除。 rmdir -p BBB/Test21. setup功能说明:设置程序。语法:setup22. su功能说明:变更用
户身份。示例:变更账号为超级用户,并在执行df命令后还原使用者。 su -c df root22. tar功能说明:备份或解压文件
。示例:压缩目录/etc为tar.gz后缀。 # tar cvf backup.tar /etc解压#tar –zxvf file
.tar.gz #tar –jxvf file.tar.bz224. umount功能:卸除文件系统。示例:卸载 /mnt区
:umount /mnt/cdrom25 whereis功能:查询某个二进制命令文件、帮助文件等所在目录.比如:查找“ls”这个二
进制命令文件所在的目录whereis ls11.3.2 vi编辑器的使用vi是visual interface 的简称,它在 L
inux 上的地位就同Edit 程序在 DOS 上一样,可以执行输出、删除、查找、替换、块操作等众多文本操作,而且用户可以根据自己
的需要对其进行定制,这是其他编辑程序所没有的。它不是一个排版程序,不象 Word 或 WPS 那样可以对字体、格式、段落等其他属性
进行编排,它只是一个文本编辑程序。 1. vi的基本模式及模式间转换vi编辑器的使用按不同的使用方式可以分为3种状态,分别是命令模
式(Command Mode)、输入模式(Insert Mode)和末行模式(Last Line Mode),各模式区分如下:(1
)命令模式(2)输入模式(3)末行模式2. vi的基本操作(1)进入与离开vi要进入?vi?可以直接在系统提示字元下键入?vi?<
档案名称>,vi?可以自动帮你载入所要编辑的档案或是开启一个新档。进入?vi?後萤幕左方会出现波浪符号,凡是列首有?该符号就代表此
列目前是空的。要离开?vi?可以在指令模式下键入?“:q”(不保存离开),?“:wq?”(保存离开)指令则是?存档后再离开(注意冒
号)。(2)vi的删除、修改与复制(3)vi的光标移动由于许多编辑工作都是由游标来定位的,所以?vi?提供许多移动游标的方式。 例
如:0:?移动到游标所在行的最前面$:?移动到游标所在行的最後面?(4)vi的查找与替换在vi中的查找与替换也非常简单,其操作有些
类似在Telnet中的使用。其中,查找的命令在命令行模式下,而替换的命令则在底行模式下(以“:”开头).例如:查找 /patter
n :从光标开始处向文件尾搜索pattern?pattern从光标开始处向文件首搜索pattern (5)vi的文件操作11.3.
3 gcc编译器编译器的作用是将用高级语言或者汇编语言编写的源代码,翻译成处理器上等效的一系列操作命令。针对嵌入式系统来说,其编译
器数不胜数,其中gcc 和汇编器 as 是非常优秀的编译工具,而且免费。编译器的输出被称为目标文件。对于任何嵌入式系统而言,有一个
高效的编译器、链接器和调试器是非常重要的,gcc 不仅在桌面领域中表现出色,还可以为嵌入式系统编译出高质量的代码。使用语法:gcc
[ option ] filename... 11.3.4 make工具和Makefile文件无论是在Linux还是在Unix
环境中,make都是一个非常重要的编译命令。不管是自己进行项目开发还是安装应用软件,都经常要用到make或make install
。利用make工具,可以将大型的开发项目分解成为多个更易于管理的模块,对于一个包括几百个源文件的应用程序,使用make和makef
ile工具就可以简洁明快地理顺各个源文件之间纷繁复杂的相互关系。 Make工具最主要也是最基本的功能就是通过makefile文件来
描述源程序之间的相互关系并自动维护编译工作。而makefile 文件需要按照某种语法进行编写,文件中需要说明如何编译各个源文件并连
接生成可执行文件,并要求定义源文件之间的依赖关系。makefile 文件是许多编译器(包括 Windows NT 下的编译器)维护
编译信息的常用方法。以下将以一个示例的方式来说明Makefile文件的编写规则。在这个示例中有2个C文件和1个头文件,要写一个Ma
kefile来告诉make命令如何编译和链接这几个文件。实现的规则是:① 如果这个工程没有编译过,那么所有C文件都要编译并被链接;
② 如果这个工程的某几个C文件被修改,那么只编译被修改的C文件,并链接目标程序;③ 如果这个工程的头文件被改变了,那么需要编译引用
了这几个头文件的C文件,并链接目标程序; 11.4 Linux内核结构 从结构上来讲,操作系统有微内核结构和单一结构之
分,Windows NT 和 MINIX 是典型的微内核操作系统,而Linux 则是单一结构的操作系统。微内核结构只提供内存管理、
中断管理等最基本的服务,服务之间通过进程间通信来进行交互,因此效率相对较低,但它可方便地在内核中添加新的组件,结构清晰;单一内核的
访问是通过系统调用来实现,其效率高,但结构相对复杂,且不容易、不方便向内核中添加新的组件。11.4.1核心子系统1.内存管理对任何
一台计算机而言,其内存以及其它资源都是有限的。为了让有限的物理内存满足应用程序对内存的大需求量,Linux 采用了称为“虚拟内存”
的内存管理方式。2.进程调度进程实际是某特定应用程序的一个运行实体。在 Linux 系统中,能够同时运行多个进程,Linux 通过
在短的时间间隔内轮流运行这些进程而实现“多任务”。 3.进程间通信为了完成某特定任务,有时需要综合两个程序的功能,例如一个程序输
出文本,而另一个程序对文本进行排序。4.虚拟文件系统Linux 操作系统中单独的文件系统并不是由驱动器号或驱动器名称(如 A: 或
C: 等)来标识的,而是和 UNIX 操作系统一样,将独立的文件系统组合成了一个层次化的树形结构,并且由一个单独的实体代表这一文
件系统。 5.网络接口Linux 和网络几乎是同义词。实际上 Linux是就是Internet 或 WWW 的产物。6.其它除上
述主要组成部分之外,内核还包含设备驱动程序和一些一般性的任务和机制,这些任务和机制可使 Linux 内核的各个部分有效地组合在一起
,它们是上述主要部分高效工作的必要保证。 11.4.2设备驱动程序设备驱动程序也是内核的一部分,它由一组数据结构和函数组成,其中的
大部分函数是对驱动程序接口的实现。驱动程序通过这组数据结构和函数控制一个或多个设备,并通过驱动程序接口与内核的其它部分交互。 Li
nux 有许多不同的设备驱动程序,这也是 Linux 在嵌入式系统开发中广泛应用的原因之一,而且驱动程序还在不断增长。 虽然这些驱
动程序驱动的设备不同,完成的工作各异,但它们都具有一些一般的属性:(1)Kernel code:设备驱动程序和内核中的其它代码相似
,是 kenel 的一部分,如果发生错误,可能严重损害系统。 (2)Kenel interfaces设备驱动程序必须向 Linux
内核或者它所在的子系统提供一个标准的接口。例如,终端驱动程序向 Linux 内核提供了一个文件 I/O 接口,而 SCSI 设备
驱动程序向 SCSI 子系统提供了 SCSI 设备接口,接着,向内核提供了文件 I/O 和 buffer2cache 的接口。(3
)Kernel mechanisms and services设备驱动程序使用标准的内核服务,例如内存分配、中断转发和等待队列来完
成工作。UNIX SVR4 提出了设备-驱动程序接口/驱动程序-内核接口规范(DDI/DKI),由它来规范化内核与驱动程序之间的接
口。 (4)Loadable大多数的 Linux 设备驱动程序,可以在需要的时候作为内核模块加载,在不再需要的时候卸载。 (5)
ConfigurableLinux 设备驱动程序可以建立在内核。至于哪些设备建立到内核,可以在内核编译的时候配置。(6)Dynam
ic在系统启动,每一个设备启动程序初始化的时候,它会查找它管理的硬件设备。如果一个设备驱动程序所控制的设备不存在并没有关系。这时这
个设备驱动程序只是多余的,占用很少的系统内存,而不会产生危害。11.5 Linux目录结构11.5.1 Linux源文件的目录结构
一般桌面Linux安装后,在/usr/src/Linux-..(版本号,比如2.4.18)目录下有内核源代码
,内核代码非常庞大,包括驱动程序在内有好几百兆字节。下面介绍下内核的目录结构 (1) arch目录包括了所有和体系结构相关的核心
代码。(2) include目录包括编译核心所需要的大部分头文件,例如与平台无关的头文件在include/linux子目录下。 (
3) init目录包含核心的初始化代码(不是系统的引导代码),有main.c和Version.c两个文件。这是研究核心如何工作的好
起点。 (4) drivers目录中是系统中所有的设备驱动程序。它又进一步划分成几类设备驱动,每一种有对应的子目录,如声卡的驱动对
应于drivers/sound。 (5) ipc目录包含了核心进程间的通信代码。 (6) modules目录存放了已建好的、可动态
加载的模块。 (7) fs目录存放Linux支持的文件系统代码。不同的文件系统有不同的子目录对应,如ext3文件系统对应的就是ex
t3子目录。 (8) Kernel内核管理的核心代码放在这里。同时与处理器结构相关代码都放在arch//kernel目录下。 (
9) net目录里是核心的网络部分代码,其每个子目录对应于网络的一个方面。 (10) lib目录包含了核心的库代码,不过与处理器结
构相关的库代码被放在arch//lib/目录下。 (11) scripts目录包含用于配置核心的脚本文件。 (12) docum
entation目录下是一些文档,是对每个目录作用的具体说明。 11.5.2 Linux 运行系统的目录结构Linux运行后,它的
目录结构和源文件目录结构有所不同。运行系统目录树的主要部分有 /root、/usr、/var、/home 等。(1)/root目录
中包括:引导系统的必备文件,文件系统的挂装信息以及系统修复工具和备份工具等。(2)/usr目录中包含通常操作中不需要进行修改的命令
程序文件、程序库、手册和其它文档等,它并不和特定的CPU相关,也不会在通常的使用中修改。因此,将 /usr目录挂装为只读性质的。(
3)/var目录中包含经常变化的文件,例如打印机、邮件、新闻等的假脱机目录、日志文件、格式化后的手册页以及临时文件等。(4)/ho
me 中包含用户的主目录,用户的数据保存在其主目录中,如果有必要,也可将/home 划分为不同的文件系统,例如 /home/stu
dents 和/home/teachers 等。(5)/proc目录下的内容并不是ROM中的,而是系统启动后在内存中创建的,它包含
内核虚拟文件系统和进程信息,例如 CPU、DMA 通道以及中断的使用信息等。(6)/etc 包含了系统相关的配置文件,比如开机启动
选项等。(7)/bin 包含了引导过程必需的命令,也可由普通用户使用。(8)/sbin 和/bin 类似,尽管其中的命令可由普通用
户使用,但由于这些命令属于系统级命令,因此无特殊需求不使用其中的命令。(9)/dev 包含各类设备文件。(10)/tmp 包含临时
文件。引导后运行的程序应当在 /var/tmp 中保存文件,因为其中的可用空间大一些。(11)/boot 包含引导装载程序要使用的
文件,内核映象通常保存在这个目录中。(12)/mnt 是临时文件系统的挂装目录。比如U盘、光盘、软盘等都可以在这个目录下建立挂载点
。11.6 Linux文件系统Linux 利用虚拟文件系统,把文件系统操作和不同文件系统的具体实现细节分离了开来。很长时期以来,文
件系统的接口保持了一定的稳定性,即使变化也是向下兼容的。但是文件系统的框架结构发生了彻底的变化。起初的框架只支持一种文件系统,并且
所有的文件都必须存放在与系统有物理连接的本地磁盘上。 11.6.1 文件系统与内核的关系任何一个操作系统都必须要提供持久性存储和管
理数据的手段。在 Linux 系统中,“文件”用来保存数据,而“文件系统”可以让用户组织、操纵以及存取不同的文件。文件系统的基本组
成单位是文件,文件系统中的所有文件通过目录、链接等组织成一棵完整的树型结构,其根为“/”,文件在叶子位置,各子目录处在中间节点的位
置。11.6.2 常见通用Linux文件系统1. EXT2文件系统EXT2 是由 Remy Card 发明的,它是 Linux 的
一个可扩展的、功能强大的文件系统。至少在 Linux 社区中,EXT2 是最成功的文件系统,是所有当前的 Linux 发布版的基础
。象大多数文件系统一样,EXT2 文件系统建立在这样的前提下:文件的数据存放在数据块中,这些数据块的长度都相同。 2. EXT3文
件系统Ext3文件系统是直接从Ext2文件系统发展而来,它很大程度上是基于 Ext2 的,因此,它在磁盘上的数据结构从本质上与 E
xt2 文件系统的数据结构是相同的。事实上,如果 Ext3 文件系统已经被彻底卸载,那么,就可以把它作为 Ext2 文件系统来重新
安装;反之,创建Ext2 文件系统的日志,并把它作为 Ext3 文件系统来重新安装也是一种简单、快速的操作。 11.6.3 常见嵌
入式Linux文件系统在嵌入式Linux应用中,主要的存储设备为RAM(DRAM, SDRAM)和ROM(常采用FLASH存储器)
,常用的基于存储设备的文件系统类型包括:jffs2, yaffs, cramfs, romfs, ramdisk, ramfs/t
mpfs等。1.基于Flash的文件系统Flash(闪存)作为嵌入式系统的主要存储媒介,有其自身的特性。Flash的写入操作只能把
对应位置的1修改为0,而不能把0修改为1(擦除Flash就是把对应存储块的内容恢复为1),因此,一般情况下,向Flash写入内容时
,需要先擦除对应的存储区间,这种擦除是以块(block)为单位进行的。 2. 基于RAM的文件系统 (1) RamdiskRamd
isk是将一部分固定大小的内存当作分区来使用。它并非一个实际的文件系统,而是一种将实际的文件系统装入内存的机制,并且可以作为根文件
系统。将一些经常被访问而又不会更改的文件(如只读的根文件系统)通过Ramdisk放在内存中,可以明显地提高系统的性能。 (2)ramfs/tmpfsRamfs是Linus Torvalds开发的一种基于内存的文件系统,工作于虚拟文件系统(VFS)层,不能格式化,可以创建多个,在创建时可以指定其最大能使用的内存大小。(实际上,VFS本质上可看成一种内存文件系统,它统一了文件在内核中的表示方式,并对磁盘文件系统进行缓冲。)3. 网络文件系统(NFS, Network File System)网络文件系统是FreeBSD支持的文件系统中的一种,它允许一个系统在网络上共享目录和文件。通过使用NFS,用户和程序可以象访问本地文件一样访问远端系统上的文件。NFS 是由SUN公司于1984年推出。它的通讯协议设计与主机及嵌入式终端系统无关,用户只要在主机中用"mount"就可将某个文件夹挂到终端系统上。 11.6.4 根文件系统的选择选择一个文件系统用于根文件系统是一个取舍的过程,最后的决定往往是对一个文件系统性能和目标用途的折中。通常选择一个文件系统需要注意以下几个特点。1.可写:是否该文件系统能被写数据。2.可保存:是否该文件系统在重启后能够保存修改后的东西,一般是在有可写的基础上才会有该功能。3.可压缩:是否挂载的文件系统内容可被压缩,这对一个嵌入式系统非常有用,可以节约宝贵的存储空间。4.存在RAM:是否可以在挂载之前将该文件系统的内容第一次从存储设备压缩到RAM中,通常许多文件系统被直接从存储设备挂载。5.可恢复:当突然断电后能否恢复对文件系统的修改。
献花(0)
+1
(本文系大高老师首藏)