嵌入式系统设计与开发-(7)_第1页
嵌入式系统设计与开发-(7)_第2页
嵌入式系统设计与开发-(7)_第3页
嵌入式系统设计与开发-(7)_第4页
嵌入式系统设计与开发-(7)_第5页
已阅读5页,还剩157页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、7.1 嵌入式Linux开发基础7.2 Linux的常用工具7.3 嵌入式Linux操作系统的开发工具7.4 交叉开发环境练习题第7章 嵌入式Linux程序设计基础7.1 嵌入式Linux开发基础通常嵌入式Linux的开发分为主机系统和目标系统。主机系统就是我们一般用的计算机或者工作站,用来编写代码和编译;目标系统就是嵌入式开发系统中的硬件板。两者通过网络接口、串口互连,将主机开发好的目标执行代码烧写到目标系统中的非易失性存储器(通常是Flash)中,由目标系统来执行这些代码。7.1.1 嵌入式Linux开发步骤嵌入式Linux开发主要包括如下步骤:(1) 建立交叉编译环境。在进行嵌入式开发之

2、前,首先要建立一个交叉编译环境,这是一套由编译器、连接器和libc库等组成的开发环境。(2) 编写和编译应用程序。在主机上编写应用程序,然后对程序进行编译生成可执行的目标代码,供目标板下载。(3) 连接主机系统和目标系统。主机系统和目标系统一般通过网络接口和串口互连,网口一般用于下载程序和内核映像文件,串口一般作为console控制台来使用,在主机上通过超级终端与目标系统进行命令交互,就像PC的键盘和显示器。(4) 下载目标代码到目标板执行调试。将主机上编译生成的目标代码通过网口下载到目标板中执行;同时通过串口,让主机与目标板进行交互,实现调试。7.1.2 嵌入式Linux的安装前面讲过,主机

3、系统通常就是我们使用的计算机或工作站,对于嵌入式Linux开发而言,主机上安装的操作系统当然应该是Linux,下面我们就以Red Hat Linux 9.0为例,介绍安装过程。(1) 系统安装前的设置。先将系统上的BIOS(基本输入/输出系统)设置改成光盘启动模式,然后将Red Hat Linux 9.0的安装光盘放入光驱,重启系统,系统就会从光盘搜寻引导文件,进行操作系统的安装。(2) 选择安装模式。若光驱引导成功,则Linux进入安装引导界面,在“boot:”后键入“text”并回车后,进入文本安装模式,如图7-1所示。图7-1 Red Hat Linux 9.0文本安装模式(3) 检测介

4、质。此处选择是否对光盘介质进行完整性检测,一般可以跳过,即选择“Skip”按钮,如图7-2所示。图7-2 检测介质(4) 进入欢迎界面。此处显示欢迎界面,选中“OK”按钮继续。(5) 选择语言种类。此处我们选择系统默认语种English(英语),如果你更熟悉系统提供的其他语种请自行选择,然后单击“OK”按钮进入下一步安装,如图7-3所示。图7-3 选择语言种类(6) 选择键盘类型和鼠标。此处我们选择默认的us(标准键盘格式),也可以根据自己的需要来选择,然后单击“OK”按钮进入下一步安装,如图7-4所示。鼠标的选择与此类似,这里不再赘述。 图7-4 选择键盘类型(7) 选择安装类型。此处我们选

5、择Custom(自定义安装),然后单击“OK”按钮进入下一步安装,如图7-5所示。(8) 选择分区工具。可以自动分区,也可人为分区,建议选择自动分区。图7-5 选择安装类型(9) 设置系统装载器。选择系统装载器(Boot Loader),这里选择“Use GRUB Boot Loader”选项,如图7-6所示。接下来,一路单击“OK”按钮即可。图7-6 系统装载器的设置(10) 配置网卡和设定主机名。配置网卡时,输入相关信息后单击“OK”按钮继续。设定Linux的主机名时,可在“Hostname”处输入Linux的主机名,主机名设定完毕后,选择“OK”按钮进入下一步安装。(11) 设置防火墙。

6、由于我们要进行ARM嵌入式开发,因此建议关闭防火墙,以免在以后的开发调试中出现不必要的麻烦,故这里选择“No firewall”选项,如图7-7所示。然后单击“OK”按钮进入下一步安装。图7-7 设置防火墙(12) 选择语言。选择语言时,我们保持默认值“English(USA)”不变。(13) 设置系统时钟。我们选用Linux系统时钟为格林威治标准时间,先选定“* Hardware clock set to GMT?”选项,再选择“Etc/GMT+0”选项,安装完后,系统会自动校正。系统时钟设置完毕后,单击“OK”按钮进入下一步安装,如图7-8所示。图7-8 系统时钟的设置(14) 设定系统密

7、码。设定Linux系统管理员(root)的密码,密码设置完毕后,单击“OK”按钮进入下一步安装。(15) 添加用户。为了系统的安全着想请不要随便添加用户。单击“OK”按钮进入下一步安装。 (16) 加密设置。我们保持默认值,单击“OK”安钮进入下一步安装。(17) 安装应用软件包。选择全部安装,避免后期没有相关工具。单击“OK”按钮进入下一步安装,如无误,系统开始格式化硬盘并安装系统程序和应用软件包,如图7-9所示。图7-9 格式化硬盘并安装系统(18) 制作启动盘。如需要制作Linux启动软盘,则选择“Yes”,否则就选择“No”。(19) 安装完成。如图7-10所示,此界面提示用户已经全部

8、完成Linux系统的安装,请取出Linux的安装光盘,单击“OK”按钮后,系统会自动重新启动计算机。图7-10 安装完成7.1.3 开发工具的配置在主机上建立交叉编译环境之后,还需要进行一些配置。先说明几点:当前主机操作系统是Red Hat 9.0;还有两个文件夹,即/s3c2410_linux和/opt,前者作为嵌入式系统开发工作目录,后者则是作为交叉编译环境目录。1配置minicomminicom类似于Windows中的超级终端,这里利用minicom作为开发目标的终端,在使用之前需要正确配置。配置过程如下:(1) 在Linux终端中输入“minicoms”。(2) 对minicom进行设

9、置。选择“serial port setup”,然后选择“Serial Device”为“/dev/ttyS0”,表示串口1,再选择波特率为“115200,8N1”,并选择“Hardware Flow Control”模式为“No”,最后按回车键退出之后再选择“Save setup as df1”,保存刚才的设置。2配置TFTP服务器TFTP(简单文件传输协议)服务器用于目标系统从主机系统上获取可执行的代码或内核映像文件。配置过程如下:(1) 在主机上执行“setup”。(2) 选择“System services”,将“tftp”项选中(出现*表示选中),并去掉“ipchains”和“ipt

10、ables”两项(即去掉前面的*),然后选择“Firewall configuration”,选中“No firewall”,最后退出setup,执行“service xinetd restart”命令启动TFTP服务。3配置NFSNFS(Network File System,网络文件系统)是Linux中经常使用的一种服务,它类似于Windows中的文件共享服务,其设计就是为了在不同系统之间使用。当用户想要使用远端档案时,只要用“mount”命令,就可以把远端档案系统挂接在自己的档案系统之下,使用起来就跟本机的档案一样。配置NFS包括两个方面:(1) 打开NFS服务。打开NFS服务可以使用“

11、setup”命令。然后选择“System services”,将“nfs”项选中(出现*表示选中),并去掉“ipchains”和“iptables”两项(即去掉前面的*),然后退出。(2) 允许“指定用户”使用。“指定用户”是通过编辑配置文件实现的,即vi /etc/exports。在exports文件中加入“/s3c2410_linux/nfs 6(rw,insecure,no_root_squash, no_all_squash)”,保存后退出。其中/s3c2410_linux/nfs是一个可以被IP地址为6的计算机访问并读/写的文件夹(注意:读者切莫认为IP地址一定是6,而是要根据实际的

12、IP地址来设置,这里只是以6为例,可以更改这个IP,让不同的计算机访问该文件夹)。最后,和配置TFTP一样,在系统服务中启动NFS服务,重新启动系统或运行:/etc/rc.d/init.d/nfs restart这样,NFS配置完毕,服务就可以使用了。至此,主机配置基本完毕。7.2 Linux的常用工具7.2.1 Shell编程在使用Linux操作系统时,每个用户登录系统之后,系统总会出现不同的命令提示符,如#、$或者等,当用户输入正确的命令之后,系统可以根据命令的要求执行,直到用户注销。输入错误的命令,系统会给出提示。用户所输入的命令都要经过解释才能被执行,而完成这一功能的机制就是Shell

13、。简单地讲,Shell就是用户与Linux系统(内核)进行交互所需要的一个平台。 这种交互过程是基于文本方式的,这种面向命令行的用户界面被称为CLI(Command Line Interface)。在通常使用的图像化Linux操作系统中一般只需要打开Shell来完成极少量的任务,不过,在Linux操作系统中,许多功能在Shell提示符下要比在图形化用户界面(GUI)下完成得更加高效。Shell在Linux操作系统中的位置如图7-11所示。如图7-11所示,当用户希望与系统内核(Kernel)发生联系进而控制硬件设备时,用户不会也不允许直接与内核交互,而必须通过Shell来下达命令使系统来控制硬

14、件,同时内核也会通过Shell来反馈执行的情况。所以,Shell其实就是内核与外部的用户发生联系的介质。 图7-11 Shell在Linux操作系统中的位置Shell提供了用户与操作系统之间通信的方式。有两种执行方式:一种是交互方式(从键盘输入,可以立即得到响应);另一种是非交互(Shell script)方式。Shell script是把命令行的命令组合到一个文件中,构成新的命令,组合方式简单,而且可以重复使用。Shell本身是一种编程语言,支持绝大多数在高级语言中能见到的程序元素,如函数、变量、数组和程序控制结构等。Shell编程语言简单而且易于掌握,任何在提示符中能键入的命令都能被放到一

15、个可执行的Shell程序中。在Linux和Unix操作系统中可以使用多种Shell。最常用的几种是Bourne Shell(sh)、C Shell(csh)和Korn Shell(ksh)。Bourne Shell是Stephen R. Bourne于20世纪70年代中期在AT&T贝尔实验室编写的,为了纪念他,称其为“Bourne Shell”。Bourne Shell是一个交互式的命令解释器和命令编程语言,它在Shell编程方面比较优秀,但是在处理与用户的交互方面不如其他几种Shell。C Shell是20世纪80年代在美国Berkeley的加利福尼亚大学开发出来的,C Shell的编程接口

16、不如Bourne Shell,但是因为C Shell的语法与C很相似,而且更容易让用户使用交互功能,所以很多C程序员都愿意使用C Shell。Korn Shell由Dave Korn编写,它集合了C Shell和Bourne Shell的优点并且和Bourne Shell完全兼容。Bash(Bourne Again Shell)是目前大多数Linux系统所默认使用的Shell,它由Brian Fox和Chet Ramey共同完成,是Bourne Shell的扩展,与Bourne Shell完全向后兼容,并且在Bourne Shell的基础上增加了很多特性。Bash也同时包含了很多C Shell

17、和Korn Shell的优点,有很灵活和强大的编程接口,同时又有友好的用户界面,其表现在如下几个方面:(1) 可以使用类似DOS下的doskey的功能,用上下方向键查阅和快速输入并修改命令;(2) 通过自动查找匹配的方式,给出以某字符串开头的命令;(3) 包含了自身的帮助功能,只要在提示符下键入help就可以得到相关的帮助。Linux下使用Shell时,只需打开终端就可以看到Shell的提示符,是Shell进程提供了命令行提示符。作为Linux默认的Bash,对于普通用户以“$”作为Shell提示符,而对于根用户(root)用“#”作为提示符。7.2.2 常用Shell命令由于Bash是Lin

18、ux系统中缺省的Shell,因此本节主要介绍Bash。Shell命令可以分为两种:Shell内部的命令(如cd命令)和存在于系统文件内部的某个应用程序(如ls命令)。从用户的使用角度来说,用户不必关心一个命令是建立在Shell内部还是一个单独的程序。在实际执行的时候,Shell会首先检查输入的命令是否是Shell的内部命令。如果不是,再检查是否是一个内部的应用程序。然后,Shell会在搜索路径里寻找这些应用程序(搜索路径就是一个能找到可执行程序的目录列表)。如果键入的命令不是一个内部命令并且在路径中没有找到这个可执行文件,将会显示一条错误信息。如果能够成功找到命令,该内部命令或应用程序将被分解

19、为系统调用并传给Linux内核。1Shell命令的格式Shell命令的一般格式如下:命令名 选项 参数1 参数2命令行中输入的第一个部分必须是一个命令的名字,第二个部分是命令的选项或参数,命令行中的每个部分必须由空格或Tab键隔开。注意,这里的选项和参数都用 标注,意思就是它们都是可选的,因为有的命令不需要选项和参数。选项是包括一个或多个字母的代码,它前面有一个减号(-),Linux用它来区别选项和参数。选项可用于改变命令执行的类型。多个选项可以用一个减号(-)连起来,例如“ls -l -a”与“ls -la”相同。以常用的命令ls为例,ls命令可以查看当前目录下的内容。2常用Shell命令介

20、绍Shell命令种类很多,功能也比较复杂,下面主要介绍几种常用的Shell命令的使用。1) 输入命令行自动补齐(automatic command line completion)功能在Linux下有时要对文件进行操作,有的文件名或文件夹的名称可能会很长,完全逐字输入比较麻烦,在输入命令的任何时刻,可以按Tab键,此时,系统将试图补齐已输入的命令。但是当与所输入的字母相同的文件名或者文件夹有几个时,还需要继续输入,直至是唯一的为止。 例如,当前目录下有一文件,名称为Screenshot-out.tar.gz,现在想要解压该文件,而该文件是当前目录下唯一以S开头的文件名,我们可以进行如下操作:#

21、 tar zxvf S此时,系统会自动补齐该文件名后面的部分creenshot-out.tar.gz,这样用起来就会非常方便。使用命令行自动补齐功能,对于使用长命令或操作较长名字的文件和文件夹都是非常有意义的。2) 对目录和文件的操作(1) 改变当前目录。在Linux下可以使用cd命令来改变当前目录,即# cd 目的目录名这里的目的目录名可用相对路径表示,也可用绝对路径表示。如果要切换到上一级目录,则可以采用下面的命令:# cd .(2) 显示当前所在目录。在Linux下pwd命令是最常用的命令之一,用于显示用户当前所在的目录。例如:# pwd /home/ann执行pwd命令后,系统提示当前

22、所在的目录是/home/ann。(3) 创建目录。在Linux下可以使用mkdir命令来创建一个目录,即# mkdir 新目录名例如:# mkdir /home/ann在/home/目录下创建ann子目录。(4) 删除一个目录文件。在Linux下可以使用rm命令来删除一个目录文件,即rm 选项 被删除的文件/目录对于选项的说明如下:-r:完全删除目录,其下的目录和文件也一并删除。-i:在删除目录之前要经过使用者的确认才能被删除。-f:不需要确认就可以删除,也不会产生任何错误信息。例如:# rm -rf /home/ann/tmp不必经过确认就可以把/home/ann/tmp/下的目录和文件全部

23、删除。(5) 拷贝文件/目录。在Linux下可以使用cp命令来拷贝文件/目录,即# cp 选项 源文件/目录 指定文件/目录对于选项的说明如下:-i:采用-i选项时,若指定目录下已存在被复制的文件,则系统会在复制之前要求确认是否要覆盖,如使用者的回答是y(yes),则执行复制的操作。-p:保留权限模式和更改时间。-r:此参数用来将一目录下的所有文件都复制到另一个指定目录中。例如:# cp /etc/ld.conf /拷贝/etc/目录下的ld.conf文件到系统的主目录中;# cp -r dir1 dir2将目录dir1的全部内容复制到目录dir2中。(6) 建立文件的符号链接。建立文件的符号

24、链接是Linux中一个很重要的命令,它的基本功能是为某一个文件在另外一个位置建立一个不同的链接,这个命令最常用的选项是-s,具体用法如下:# ln -s 源文件 目标文件在实际的操作过程当中,有时在不同的目录中要用到相同的文件,我们不需要在每个需要的目录下都放一个相同的文件,而是使用ln命令链接(link)它就可以了(相当于建立了一个快捷方式),这样可以避免重复占用磁盘空间,同时保证文件的同步性。例如:# ln -s /bin/test /usr/local/bin/test 为/bin/下的test文件在/usr/local/bin目录下建立一个符号链接。注意:ln命令会保持每一处链接文件的

25、同步性,也就是说,如果改动了某一文件,其他的符号链接文件都会发生相应的变化。ln命令的链接方式又有软链接和硬链接两种。上面提到的用法就是软链接,它只会在用户选定的位置上生成一个文件的镜像,不会占用磁盘空间;硬链接没有-s选项,它会在指定的位置上生成一个和源文件大小相同的文件。无论是软链接还是硬链接,文件都保持同步变化。(7) 改变文件/目录的访问权限。在Linux系统下面,一个文件有可读(r)、可写(w)、可执行(x)3种模式,chmod可以用数值来表示该文件的使用权限,其语法如下:# chmod XYZ 文件名其中,X、Y、Z各为一个数字,分别表示User(用户)、Group(同组用户)及O

26、ther(其他用户)对于该文件的使用权限。对于文件的属性,r(可读)=4,w(可写)=2,x(可执行)=1。对于每一位用户来说,若要具有rwx属性,则对应的位应为4+2+1=7;若要具有rw-属性,则对应的位应为4+2=6;若要具有r-x属性,则对应的位应为4+1=5。 比如:# chmod 751 /home/ann/test其执行结果就是使程序test对于用户可读/写/执行,对于同组用户可读/执行,对于其他用户可执行。(8) 改变文件/目录的所有权。在Linux下可使用chown命令来改变文件/目录的所有权,即# chown -R 用户名 文件/目录例如:# chown ann File1

27、将当前目录下的文件File1改为用户ann所有;# chown -R ann Dir1将当前目录Dir1改为用户ann所有。3) 用户管理命令(1) 添加/删除用户。在Linux下可使用adduser/userdel来添加/删除用户。例如:# adduser user1由具有root权限的用户添加用户user1;# userdel user2由具有root权限的用户删除用户user2。(2) 设置用户口令。为了更好地保护用户账号的安全,Linux允许用户随时修改自己的口令。修改口令的命令是passwd,它将提示用户输入旧口令和新口令,之后还要求用户再次确认新口令,以避免用户无意中按错键。4)

28、文件的打包和压缩Linux下最常用的打包程序是tar,使用tar程序打出来的包都是以“.tar”结尾的。tar命令可以为文件和目录创建档案(备份文件),也可以在档案中改变文件,或者向档案中加入新文件。使用tar命令,可以把一大堆的文件和目录全部打包成一个文件,这对于备份文件或将几个文件组合成为一个文件以便传输是非常有用的。其语法如下:# tar 选项 f targetfilename.tar 文件/目录选项后面的f是必需的,通常用来指定包的文件名。选项说明如下:-c:创建新的档案文件。如果用户想备份一个目录或是一些文件,就要选择这个选项。例如:# tar -cf test.tar /home/

29、tmp 将/home/tmp/目录下的文件打包为test.tar。-r:增加文件到已有的包,如果发现还有一个目录或是一些文件忘记备份了,这时可以使用该选项,将还需要的目录或文件添加到包文件中。例如:# tar -rf test.tar *.jpg 将所有的jpg文件添加到test.tar包里。-t:列出包文件的所有内容,查看已经备份了哪些文件。例如:# tar -tf test.tar-x:从tar包文件中恢复所有文件,事实上是一个解包的过程。例如:# tar -xf test.tar-k:保存已经存在的文件。例如把某个文件还原,在还原的过程中,遇到相同的文件,不会进行覆盖。-w:每一步都要求

30、确认。tar命令还有一个非常重要的用法,这就是tar可以在打包或解包的同时调用其他的压缩程序(如gzip、bzip2)来压缩文件。注意:打包和压缩是两个不同的概念。Linux下的压缩文件主要有以下几种格式: Z-comress 程序的压缩格式; bz2-bzip2程序的压缩格式; gz-gzip程序的压缩格式; tar.gz-由tar程序打包,并且经过gzip程序压缩的压缩格式,是Linux下最常见的压缩文件格式; tar.bz2-由tar程序打包,并且经过bzip2程序压缩的压缩格式。以下对几种常用的情况进行说明。(1) 调用gzip程序来压缩文件。gzip是GNU组织开发的一个压缩程序,g

31、zip压缩文件的后缀是.gz,与gzip相对的解压程序是gunzip。tar中使用-z这个参数来调用gzip。例如:# tar -czf test.tar.gz *.jpg这条命令是将当前目录下的所有.jpg文件打包成一个tar包,并且将其用gzip程序压缩,生成一个gzip压缩过的包,压缩包名为test.tar.gz。解开该压缩包的用法如下:# tar -xzf test.tar.gz (2) 调用bzip2程序来压缩文件。bzip2是Linux下的一个压缩能力更强的压缩程序,bzip2压缩文件的后缀是bz2,与bzip2相对应的解压程序是bunzip2。tar中使用-j这个参数来调用gzi

32、p压缩程序。例如:# tar -cjf test.tar.bz2 *.jpg该命令是将当前目录下所有.jpg的文件打包成一个tar包,并且将其用bzip2程序压缩,生成一个bzip2压缩过的包,压缩包名为test.tar.bz2,解开该压缩包的用法如下:# tar -xjf test.tar.bz25) rpm软件包的安装在使用任何操作系统的过程中,安装和卸载软件是必须的操作。Linux中有一套软件包管理器,最初由Red Hat公司推出,称为rpm(Red Hat Package Manager),它可以用来安装、查询、校验、删除、更新rpm格式的软件包。rpm软件包包含可执行的二进制程序和该

33、程序运行时所需要的文件,rpm格式的软件包文件使用.rpm为扩展名。与直接从源代码安装相比,软件包管理易于安装、更新和卸载软件,也易于保护配置文件和跟踪已安装文件。安装rpm软件包的主要格式如下:# rpm -i 选项 software.rpmrpm 命令主要有以下参数:-i:安装rpm软件包。-t:测试安装。-h:安装时输出hash记号(“#”),可以显示安装进度。-f:忽略安装过程中的任何错误。-U:升级安装rpm软件包。-e:卸载已安装的软件包。-V:检测软件包软件是否正确安装。在安装过程中,系统提示的“#”号就表示软件安装进度,当后面的百分比数字为100%时表示软件安装完成。6) 源码

34、维护基本命令diff命令是生成源代码补丁的必备工具,其命令格式如下:# diff 命令行选项 源文件 新文件diff 命令常用选项如下:-r:递归处理相应目录。-N:包含新文件到patch。-u:输出统一格式,这种格式比缺省格式更紧凑些。-a:可以包含二进制文件到patch。通常可以使用diff命令加参数-ruN来比较两个文件并生成一个补丁文件。这个补丁文件会列出这两个不同版本文件的差异。比如有两个文本文件:text1和text2,二者内容不尽相同,现在来创建补丁文件:# diff -ruN test1.txt test2.txt test.patch补丁创建好以后需要给相应文件/程序打好补丁

35、,这里就要用到patch命令,即# patch 命令行选项 patch文件patch的详细使用方法可参见patch的man help,常用的命令行选项是-pn(n是自然数)。例如采用下面的指令来打好补丁:# patch -p1 test.patch-p1选项代表patch文件名左边目录的层数,考虑到顶层目录在不同的系统上可能有所不同,要使用这个选项,就要把patch文件放在要被打补丁的目录下,然后在这个目录中运行“patch -p1 patchfile”命令。7) 配置、编译、安装源码包软件所谓源码包软件,顾名思义,就是源代码可见的软件包,在Linux系统下也经常需要用到源码包软件。大多数的源

36、码包软件是以tar.gz或tar.bz2的形式得到的,所以在配置和编译之前需要将软件包解压缩。具体的做法已经在前面提到过。配置、编译、安装的过程大多如下所示:# ./configure# make# make install./configure用来配置软件的功能。./configure比较重要的一个参数是-prefix,通过使用-prefix参数,可以指定软件的安装目录。比如,若指定软件安装到/home/tmp 目录中,则可以执行如下的指令:# ./configure -prefix=/home/tmp# make# make install8) 中断Shell命令的执行在Linux系统下,

37、一旦出现了Shell提示符,就可以键入命令名称及命令所需要的参数。Shell将执行这些命令。如果在执行过程当中想终止命令执行,则可以从键盘上按“CtrlC”组合键发出中断信号来中断它。9) 模块管理命令Linux内核采用模块化管理方式,这是Linux内核的一大特点,这也使得Linux整体结构灵活,便于精简。(1) insmod(添加模块)指令。Linux有许多功能是通过模块的方式,在需要的时候才载入Kernel,这样可使Kernel较为精简,进而提高效率。这些可动态加载的模块,通常是系统的设备驱动程序。加载模块采用insmod指令,其常用的格式如下:# insmod -fkmpsvxX -o

38、模块文件其中的参数解释如下:-f:不检查目前Kernel版本与模块编译时的Kernel版本是否一致,强制将模块载入。-k:将模块设置为自动卸载。-m:输出模块的载入信息。-p:测试模块是否能正确地载入Kernel。-s:将所有信息记录在系统记录文件中。-v:执行时显示详细的信息。-x:要汇出模块的外部符号。-X:汇出模块所有的外部符号,此为预设置。(2) rmmod(卸载模块)指令。Linux把系统的许多功能编译成一个个单独的模块,待有需要时再分别加载它们,如果不再需要这些模块,就可以使用rmmod命令来卸载这些模块。其格式如下:# rmmod -as模块名称其使用参数说明如下:-a:删除所有

39、目前不需要的模块。-s:把信息输出至syslog常驻服务,而非终端机界面。7.2.3 Shell编程实例Shell是一个命令解释器,它会解释并执行命令提示符下输入的命令。如果用户想多次执行一组命令,可以将这组命令存放在一个文件中,然后像在Linux系统中执行其他程序一样去执行这个文件,这个命令文件就叫做Shell程序或者Shell脚本程序。Shell程序的权限至少应该为可读和可执行。在Shell提示符下输入文件名就可以执行Shell程序。Shell程序可以通过环境变量、命令行参数和用户的输入3种方式接收数据。1Shell脚本的建立编辑Shell脚本文件可使用Linux下的普通编辑器,如vi、E

40、macs等。在建立Shell脚本程序的开始首先应该指明使用哪种Shell来解释所写的脚本,以Bash脚本为例,脚本以“#!”开头,后面将所使用的Shell路径明确指出。比如:Bourne Shell的路径为/bin/sh,而C Shell的路径则为/bin/csh,下面的语句就是指定Bash解释脚本:#! /bin/sh该语句说明该脚本文件是一个Bash程序,需要由/bin目录下的Bash程序来解释执行。为了增加程序的可读性,Shell脚本语句也可以像高级语言那样加注释,在Bash脚本程序中从“#”开始到行尾的部分均被看做是程序的注释语句。2Shell变量Shell编程中可使用变量,增加了程序

41、的灵活性。Shell中所有变量的取值都是一个字符串。Shell脚本中主要有系统变量、环境变量和用户变量。其中,用户变量在编程过程中使用频繁;系统变量在对参数判断和命令返回值判断中会被使用;环境变量在程序运行的时候需要设置。此外,Shell脚本的执行不需要编译,因此在Shell脚本中使用变量不必事先对变量进行定义。1) Shell系统变量以下是常用到的Shell系统变量及其含义。$#:保存程序命令行参数的数目。$?:保存前一个命令的返回值。$0:当前程序名。$*:以(“$1 $2 ”)的形式保存所有输入的命令行参数。$:以(“$1”“$2”)的形式保存所有输入的命令行参数。$n:$1为命令行的第

42、一个参数,$2为命令行的第二个参数,依此类推。2) Shell环境变量Shell环境变量是所有Shell程序都会接收的参数。Shell程序运行时,都会接收一组变量,这组变量就是环境变量。常用的环境变量如下:PATH:决定了Shell将到哪些目录中寻找命令或程序。HOME:当前用户主目录的完全路径名。HISTSIZE:历史记录数。3) Shell用户变量不管系统变量有多少,对于需求来说,总是不够的,因此,Linux允许用户自己定义变量,并对其进行修改。这些由用户自己定义的变量叫做用户变量。(1) 变量名。用户变量的变量名是以字母或下划线开头的,由字母、数字或下划线组成,并且区分大小写。(2) 变

43、量赋值。给用户变量赋值的过程也是声明一个变量的过程。变量的赋值很简单,其一般形式是:变量名=字符串/数字但要注意,等号两边不能有空格。例如:myname=jacknum=1(3) 取消变量。取消变量的命令如下:unset变量名例如:unset myname3流程控制1) 条件语句(1) if语句。if语句的语法格式如下:if 条件 then命令1命令2命令 nfiif语句执行顺序为当条件为真时执行then后的命令,否则不执行命令而直接执行fi后的命令。另外要注意:if与“”之间,条件与左右两边的“”与“”之间都要有空格。(2) case语句。case命令是一个多分支语句,其基本命令格式如下:c

44、ase命令的执行顺序是:首先变量值与值1比较,相同,则执行命令1,否则与值2比较,相同,则执行命令2,依此类推。如果都不匹配,则执行默认的命令,即“*)”内的命令。2) 循环语句循环语句要求反复执行一个操作或一组命令,直到达到某个条件为止。下面简单介绍while和for循环语句。(1) while循环语句。while循环语句的语法格式如下:while 条件 do命令1命令2donewhile循环的执行过程是:首先对条件进行判断,若条件为真,就执行do和done之间的命令;反之,则退出循环。(2) for循环语句。forin循环能根据in后面的变量数目执行循环,其命令格式如下:for 自定义变量

45、in变量1变量2变量3 do命令donefor循环的执行顺序是:先把变量1的值赋给自定义变量,然后执行do和done之间的命令;再把变量2的值赋给自定义变量,然后执行do和done之间的命令。依此类推,一直到in后面所有的变量都赋予自定义变量为止,for循环才结束。4Shell脚本的执行举一个针对系统变量使用的例子,使用Vi编辑一个脚本文件,文件名为Example,其内容如下:#! /bin/sh# Script name: Example echo “The No. of parameter is: $#”echo “The script name is: $0”echo The param

46、eters in the script are: $*保存该脚本文件后,执行时系统会提示错误,因为文件权限不够,在终端下输入命令“ls -l Example”,发现文件的权限为-rw-rr-,说明不能执行该文件。要执行该脚本文件,需要改变文件权限,输入命令“chmod 775 Example”,为文件添加可执行的属性。然后,在命令行中执行该脚本程序,输入命令:./Example Hello Linux命令行中的Hello Linux是其参数,该程序执行结果如下:The No. of parameter is: 2The script name is: ./Example The paramet

47、ers in the script are: Hello Linux7.2.4 程序编辑器编辑器是系统的重要工具之一。在各种操作系统中,编辑器都是必不可少的部件。Linux系统提供了一个完整的编辑器系列,如Ed、Ex、Vi和Emacs等,按功能它们可分为两大类:(1) 行编辑器(如Ed、Ex);(2) 全屏编辑器(如Vi、Emacs)。行编辑器每次只能对一行进行操作,使用起来不是很方便。而全屏编辑器可以对整个屏幕进行编辑,用户编辑的文件直接显示在屏幕上,修改的结果可以立即看出来,便于学习和使用。Vi(Visual Interface)和Emacs(Editing with MACros)是Li

48、nux下的两个主要的编辑器,下面以Vi为例,对其使用进行详细的介绍。Vi编辑器最初是由Sun Microsystems公司的Bill Joy在1976年开发的。一开始Bill开发了Ex编辑器,后来开发了Vi作为Ex的Visual Interface。随着技术的不断进步,基于Vi的各种变种版本不断出现,其中,移植特性最好、使用最广泛的就是Vim编辑器。相比早期的Vi,Vim编辑器增加的一项最重要的功能便是多级撤销,Vi只支持一级撤销。Vi/Vim是Linux下最普遍的文本处理器之一,使用非常广泛,Vi的命令繁多,但是功能强大,可以执行输出、删除、查找、替换、块操作等众多文本操作,而且用户可以根据

49、自己的需要对其进行定制。在终端下输入Vim命令就可以看到Vi的界面,如图7-12所示。图7-12 Vi的界面Vi有3种基本工作模式:指令模式、文本输入模式和末行模式。它们的相互关系如图7-13所示。图7-13 Vi的模式切换关系1指令模式指令模式主要使用方向键移动光标位置以进行文字的编辑。在输入模式下按【Esc】键或是在末行输入了错误命令,都会回到指令模式。表7-1列出了指令模式常用操作命令及其含义。2文本输入模式在Vim下编辑文字,不能直接插入、替代或删除文字,而必须先进入输入模式。要进入输入模式,可以在指令模式下按【a/A】键、【i/I】键或【o/O】键,它们的命令及其含义如表7-2所示。

50、3末行模式末行模式主要用来进行一些文字编辑辅助功能,比如字串搜寻、替代、保存文件等。表7-3介绍了一些常用的末行模式命令及其含义。下面以编辑一个简单的脚本程序为例来介绍Vi的简单使用方法,其主要流程如下:在终端输入命令 Vi filename 来建立一个文件名为filename的文件,可以是文本文件、C/C+程序等。例如:vi hello输入命令,表示要编辑一个文件名为hello的文件,回车后就进入了Vi的编辑界面,如图7-14所示。图7-14 Vi的编辑界面此时的Vi是指令模式,输入“:set nu”来设置行号。若此时输入末行模式,末行模式不能自己切换到文本输入模式,需要先切换到指令模式,按

51、【Esc】键进入指令模式。(1) 输入“i”进入文本输入模式。在指令模式下输入“i”进入文本输入模式,并编辑文本内容,如图7-15所示。(2) 保存、修改编辑内容并退出Vi程序。在输入模式下编辑并修改相应内容,编辑好之后需要再返回到指令模式(Esc),之后输入“:wq”就可以保存并退出刚才的编辑程序了。图7-15 输入“i”进入文本输入模式 7.3 嵌入式Linux操作系统的开发工具7.3.1 编译器GCC Linux操作系统下的GCC(GNU C Compiler)是GNU(提供全套免费软件的组织)推出的功能强大、性能优越的多平台编译器,是GNU项目的编译器组件之一。经过几十年的发展,GCC

52、不仅支持C语言,还支持C+语言、Java语言、Objective语言、Ada语言、Pascal语言、COBOL语言以及支持函数式编程和逻辑编程的Mercury语言,等等。目前的GCC已经发展成为GNU Compiler Collection(即GNU编译器家族),它是Linux下最重要的软件开发工具之一。1GCC的执行过程GCC是一个交叉平台的编译器,目前支持所有主流CPU处理器平台,可以完成从C、C+、Objective-C等源文件向运行在特定CPU硬件平台上的目标代码的转换。GCC编译器所能支持的源程序的格式如表7-4所示。GNU是一组编译工具的总称,其软件包里面包含众多的工具,按其类型,

53、主要有以下几类:(1) C编译器:cc,cc1,cclplus,gcc。(2) C+编译器:c+,cclplus,g+。(3) 源码预处理程序:cpp,cpp0。(4) 库文件:libgcc.a,libgcc_eh.a,libgcc_s.so,libiberty.a,libstdc+.a,so,libsupc+.a。GCC编译器的编译过程可以分为四个阶段,即预处理(Pre-Processing)、编译(Compiling)、汇编(Assembling)和链接(Linking)。下面以一个程序来说明编译的过程。/* sample1.c */#include int main ( )printf

54、(“Wish you Happy! ”);return 0;这个程序是要打印出一条信息。可以使用下面的命令来编译这个例子:# gcc -o sample1 sample1.c在实际编译的时候,GCC首先调用cpp命令进行预处理,主要实现对源代码编译前的预处理,比如将源代码中指定的头文件包含进来。接着调用ccl命令进行编译,作为整个编译过程的一个中间步骤,该过程会将源代码翻译生成汇编代码。汇编过程是针对汇编语言的步骤,调用as命令进行工作,生成扩展名为.o的目标文件,此例中为sample.o。当所有的目标文件都生成之后,GCC就调用连接器ld来完成最后的关键性工作链接,生成指定的目标文件samp

55、le。如果在编译的时候没有给出可执行文件的名字,则GCC将生成一个名为a.out的文件。2. GCC的基本用法和选项在使用GCC编译器的时候,必须给出一系列必要的调用参数和文件名称。GCC编译器的调用参数大约有100多个,合理地使用其命令选项可以有效提高程序的编译效率、优化代码。不过其中多数参数我们根本用不到,这里只介绍几个最基本、最常用的参数。GCC最基本的使用语法如下:gcc options | filenames对于编译C+的源程序,其基本语法如下:g+ options | filenames 其中,options就是编译器所需要的参数;filenames表示所给出的相关的文件名称。常用

56、参数如下:(1) -c:只编译,不链接成可执行文件,编译器只是由输入的.c等源代码文件生成以.o为后缀的目标文件,通常用于编译不包含主程序的子程序文件。例如执行指令:# gcc -c test.c 在当前目录下生成一个名为test.o的目标文件。(2) -S:使用该选项会生成一个后缀名为.s的汇编语言文件,但是同样不会生成可执行的程序。(3) -o:在默认的状态下,如果GCC没有指定编译选项,则会在当前目录下生成一个名为a.out的可执行文件。例如:执行命令“# gcc test.c”之后会生成一个a.out的可执行程序。因此,为了指定生成的可执行程序的文件名,就可以采用-o选项,比如下面的指

57、令:# gcc -o test test.c 在当前目录下生成一个名为test的可执行文件。(4) -g:产生符号调试工具所必要的符号信息,要想对源代码进行调试,就必须加入这个选项。这样,gdb调试器就可以根据这些调试信息来跟踪程序的执行状态。(5) -pg:编译完成之后,额外产生一个性能分析所需的信息。(6) -I :库依赖选项,将DIR所指出的目录加入到程序头文件目录列表中,是在预编译过程中使用的参数。在Linux下开发程序时,通常来讲都需要借助一个或多个函数库的支持才能够完成相应的功能。一般情况下,Linux下的大多数函数都将头文件放到系统/usr/include/目录下,而库文件则放到

58、/usr/lib/目录下。但在有些情况下并不是这样的,在这些情况下,使用GCC编译时必须指定所需要的头文件和库文件所在的路径。-I选项可以向GCC的头文件搜索路径中添加新的目录。例如,一个源程序所依赖的头文件在用户/home/include/目录下,此时就应该使用-I选项来指定:# gcc -I /home/include -o test test.c(7) -L :类似上面的情况,用来特别指定所依赖库所在的路径。如果使用了不在标准位置上的库,那么可以通过-L选项向GCC的库文件搜索路径中添加新的目录。例如,一个程序要用到的库libapp.so在/home/hzdz/lib/目录下,为了让GC

59、C能够顺利地链接该库,可以使用下面的命令:# gcc -L /home/hzdz/lib -lapp -o test test.c这里的-L选项表示GCC去链接库文件libapp.so。Linux下的库文件在命名时有一个约定,那就是应该以lib三个字母开头,由于所有的库文件都遵循了同样的规范,因此在用-L选项指定链接的库文件名时可以省去lib三个字母,也就是说,GCC在对-lapp进行处理时,会自动去链接名为libapp.so的文件。(8) -static选项:GCC在默认情况下链接的是动态库,有时为了把一些函数静态编译到程序中而无需链接动态库,就采用-static选项,它会强制程序链接静态库

60、。(9) -E:生成.i文件,让gcc在预处理后停止编译,从而生产.i文件,此文件中包含有所预处理的信息。(10) -v:在Shell的提示符下键入gcc -v,屏幕上会显示目前正在使用的GCC的版本信息。(11) -x language:强制编译器用指定的语言编译器来编译某个源程序。例如:# gcc x c+ test.c 该指令表示强制采用C+编译器来编译C程序test.c。(12) -O:对程序进行优化编译、链接,采用这个选项,整个源代码会在编译、链接过程中进行优化处理,这样产生的可执行文件的执行效率可以提高,但是,编译、链接的速度会相应慢一些。(13) -O2:比-O更好的优化编译、链

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论