第3章 Linux 操作系统_第1页
第3章 Linux 操作系统_第2页
第3章 Linux 操作系统_第3页
第3章 Linux 操作系统_第4页
第3章 Linux 操作系统_第5页
已阅读5页,还剩71页未读 继续免费阅读

下载本文档

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

文档简介

第3章Linux操作系统3.1Linux概述3.2嵌入式Linux3.3嵌入式实时Linux3.4Linux系统的安装3.5Linux目录结构3.6Linux常见术语和常用命令3.7Linux下的C语言编程入门13.1Linux概述---Linux的起源

Linux也被称作UNIX克隆(UNIXclone)或UNIX风格的操作系统,是UNIXOS的一个版本;在1990年,芬兰赫尔辛基大学的学生LinusTorvalds用汇编语言编写了一个在80386保护模式下处理多任务切换的程序,并从Minix得到启发,开发出0.0.1版本的Linux;Linux具有UNIX的全部特征,包括多任务、虚拟内存、共享库、需求装载、共享的写时复制程序执行、优秀的内存管理以及TCP/IP网络支持;Linux已成为Windows强劲对手。且不仅能够运行于PC平台,在嵌入式方面更显特色,逐渐可与WindowsCE抗衡。23.1.2Linux概述---Linux与GNU当前流行的软件按照提供方式可分成三种模式:商业软件(commercialsoftware);共享软件(sharesoftware);自由软件(freesoftware);开发者提供软件全部源代码,任何用户都有权利使用、拷贝、扩散、修改该软件,同时用户有义务将自己修改过的源代码公开。31984年,哈佛大学学生RichardStallman开发了一个完全基于自由软件的软件体系计划,称为GNU(Gnu’sNotUnix),是免费软件基金会(FSF,FreeSoftwareFoundation)提供了一套应用程序,用来代替UNIX操作系统,并拟定了一份称为公共版权许可(GPL,GeneralPublicLicense)的文件。GNU计划的宗旨是:消除对于计算机程序拷贝、分发、理解和修改的限制。也就是说,每一个人都可以在前人工作的基础上加以利用、修改和添加新内容,但必须公开源代码,允许其他人在此基础上继续工作。Linus发布Linux1.0版是完全按照自由发布版权来做的,而后转向了GPL版权,该版权除了规定有自由软件的各项许可以外,还允许用户出售自己的程序拷贝,并从中获利。这一转变对于Linux的发展至关重要。43.1.3Linux概述---Linux内核概况1、Linux内核在操作系统中的位置

Linux操作系统由4个层次组成:用户进程、系统调用接口、Linux内核和硬件。把应用进程也纳入操作系统的范畴是由于其运行和操作系统密切相关,系统调用接口也可以说是操作系统内核的补充,硬件则是物质基础。硬件Linux内核系统调用接口用户进程Linux内核在整个操作系统中的位置52、Linux内核的抽象结构1)进程调度(Scheduling)子系统控制着进程对CPU的访问。当需要选择下一个进程时,由调度程序根据一定的算法选择最值得运行的进程。Linux使用了比较简单得基于优先级得进程调度算法。2)内存管理(MM,MemoryManagement)子系统允许多个进程安全地共享主内存区域。内存管理从逻辑上可以分为硬件无关的部分和硬件相关的部分。前者提供进程的映射和虚拟内存的交换,后者为内存管理提供了虚拟接口。Linux内核子系统及它们之间关系63)虚拟文件系统(VFS,VisualFileSystem)子系统隐藏了各种不同硬件的具体细节,为所有设备提供统一的接口。VFS可分为逻辑文件系统和设备驱动程序两部分。前者指Linux所支持的文件系统,如ext2、FAT等;后者指为某一种硬件所编写的驱动程序模块。Linux还支持数十种不同的文件系统,是Linux较有特色的一部分。4)网络子系统提供了对各种网络标准协议的存取和各种网络硬件的支持,可分为网络协议和网络设备驱动程序两部分。网络协议部分负责实现每一种可能的网络传输协议,网络设备驱动程序负责与具体的硬件设备进行通信,每种可能的硬件设备都有相应的设备驱动程序。5)进程间通信(IPC,InterprocessCommunication)子系统提供了进程间多种通信机制。多个进程为了能在同一项任务上协调工作,他们之间必须能够进行信息的交互。Linux支持许多不同形式的进程间通信机制,包括管道(pipe)、信号以及网络进程通信机制Sockets等。73.1.4Linux概述---Linux内核的微型化嵌入式应用对操作系统的要求是: 功能具有针对性,效率高,占用资源少,启动速度快,有些系统有实时性的要求等。Linux是由许多体积小且性能高的微内核和系统组成。在内核代码完全公开的前提下,用户可根据自己应用的需要有针对性地对内核进行改造,完全可以低成本地设计和开发出真正满足自己需要的嵌入式系统。通用做法是对Linux内核重新编译。由于Linux内核采用模块化地设计,内核开发人员在设计时把这些内核模块作为可选项,可以在编译系统内核时制定。83.2嵌入式Linux商业嵌入式系统的共同特点: 具有专业性、各自地源代码不公开,使得每个系统上的应用软件不容易与其他系统兼容,软件的移植性较差,对各种设备的支持方面也存在问题,且价格昂贵。嵌入式Linux(EmbededLinux)是指对Linux经过小型化剪裁后,能够固化在容量为几百KB到几十MB的存储器或单片机中,适用于特定嵌入式场合的专用Linux操作系统。9Linux应用于嵌入式系统的优势1)开放源代码,软件资源丰富2)内核功能强大3)支持多种体系结构4)完善的网络通信和成熟的文件图形系统5)丰富的驱动程序6)完善的开发工具链10Linux应用于嵌入式系统的不足1)软件开发的效率和功能没有足够的资源在本机上运行开发工具和调试设备,往往采用交叉编译调试的方法。2)软件的实时性问题Linux本身不是一种实时的操作系统,其内核不是完全可抢占的。Linux的调度时机主要有:进程状态转换的时刻,即进程终止、进程睡眠;可运行队列中新增加一个进程时;当前进程的时间片用完时;进程从系统调用返回到用户态时;内核处理完中断后,进程返回到用户态时等。113)内存及其管理问题

一个典型的Linux内核在未压缩的情况下至少要占1.5MB左右的内存,运行时可能需要超过4MB,功能强大的甚至要占用上百MB的存储空间。 标准的Linux设计时所针对的处理器都是带有内存管理单元(MMU)的,并且Linux系统充分利用了处理器的内存管理机制。但有些嵌入式处理器不带MMU。123.3嵌入式实时Linux将Linux作为底层操作系统,在其上进行实时化改造,从而构建出一个具有实时处理能力的嵌入式系统,是目前发展的趋势。为实时系统而开发的RTLinux可以让Linux支持硬实时任务。它主要是把Linux的任务作为自己的一个任务,因此,实时性要求很高的任务不受非实时的Linux干扰。另外,还提供了实时任务和Linux的基本内核和其他任务间的接口。这些接口不需要很强的实时性。这种架构的关键是将实时代码与非实时代码分开设计。RTLinux中含有时间紧要的函数,可以用中断管理器来精确控制中断处理,从而很好地保证了关键中断能够在需要时得到执行。这种方法可以满足广泛范围内的实时要求,即使没有实时扩展,Linux也能很好地处理多个事件流。133.4Linux系统的安装143.5LINUX目录结构/root/X11R6/home/dev/lib/sbin/tmp/usr/var/mnt/proc/bin/src/lib/local/man…/sbin/opt/etc/include15目录常用功能介绍:/boot:包含了操作系统的内核和在启动系统过程中所要用到的文件。/bin:存放常用的二进制可执行文件,如ls,mv,rm,mkdir,gzip,tar等。/dev区:存放与设备有关的特殊文件。UNIX或LINUX系统都把设备当作文件,如/dev/cdrom表示光驱。/etc:存放系统管理和配置文件,如LILO的参数,用户的帐号和密码,以及系统的主要设置。/home:为用户设置的目录,user的主目录就是/home/user,这个分区的大小取决于有多少用户。/lib:标准程序设计库,也称动态链接库,在LINUX执行和编译内核时,均会用到。/sbin:系统管理命令,存放的是系统管理员使用的管理程序,如fdisk,mount,ifconfig等。/tmp:用来存放临时文件。16/mnt:系统提供这个目录让用户临时装载其他的文件系统,如装载软盘的文件系统。/proc:虚拟的目录,系统内存的映射。可直接访问这个目录来获取系统信息。/opt:存放可选的安装的软件。/var:系统工作时预先设置的工作目录,如各种服务日志文件和邮件等。/usr:最庞大和最重要的目录之一,要用到的应用程序和文件几乎都在这个目录,其中包含:/usr/X11R6存放XWindow的目录/usr/bin众多的应用程序/usr/sbin

超级用户的一些管理程序/usr/lib存放常用的动态链接库和软件包的配置文件/usr/includeLINUX下开发和编译应用程序所需的头文件/usr/man存放帮助文档/usr/src

存放LINUX的内核源码173.6Linux常见术语和常用命令3.6.1Linux常见术语GNUGNU的字面意思是角马,是南非的一种像牛的大羚羊,但它实质性的含义是强调“IsNotUnix”,因此通常说“GNU是Gnu’sNotUnix的递归所写”。它源于自由软件基金会的一个项目,该项目的目标是开发一个自由的UNIX版本,这一UNIX版本称为HURD。尽管HURD尚未完成,但GNU项目开发了许多高指令的编程工具,包括Emacs编辑器,著名的GNUC和C++编译器(gcc和g++)。所有的GNU软件和派生工作均适用GNU通用公共许可证,即GPL。Linux的开发使用大量的GNU工具,人们常说的Linux通常包括:符合POSIX标准的操作系统Shell和外围工具;C语言编译器和其他开发工具及函数库;XWindow窗口系统;各种应用软件,包括字处理软件、图像处理软件等;其他各种Internet软件,包括FTP服务器、WWW服务器;关系数据库管理系统。 18GPL GPL与软件是否免费无关,它的主要目标是保证软件对所有用户来说是自由的,GPL通过如下途径实现这一目标:它要求软件以源代码的形式发布,并规定任何用户能够以源代码的形式将软件复制或发布给别的用户;它提醒每个用户,对于该软件不提供任何形式的担保;如果用户的软件使用了受GPL保护的任何软件的一部分,那么该软件就继承了GPL;GPL并不排斥对自由软件的进行商业性质的包装和发行,也不限制在自由软件的基础上打包发行其他非自由软件;遵照GPL的软件并不是可以任意传播的,这些软件通常都有正式的版本,GPL在发布软件或复制软件时申明限制条件。193.6.2Linux基本概念

用户和组Linux是一个真正的多用户系统,为了方便使用GNU/Linux系统,必须在机器上拥有一个帐户。一个组能拥有很多用户通过组的方式可便于实现几个人之间的文件共享Linux是一个多用户系统,每个文件是一个用户和一个组的独家财产。用户和组,他们中的每一个成员都持有一个个人的目录(称为HOME目录)20一个组能拥有很多用户通过组的方式可便于实现几个人之间的文件共享三个类别用户:(1)文件的所有者(owner);(2)同组用户(是所有者组的成员,所有者组是与文件有关联的组,同组用户不是文件所有者,group)(3)其他用户(既不是所有者也不是所有者组的成员,other);有三种不同的许可操作:(1)读许可:(r)它准许用户读取文件的内容(2)写许可:(w)它准许用户修改文件的内容(3)执行许可:(x)它准许用户运行可执行文件213.6.3Linux常用命令1、ls,pwd,cd等文件处理命令ls:显示当前目录下的所有文件和目录语法:ls

选项[-alFR][文件或目录]-a显示所有文件包括隐藏文件-l使用longformat长格式进行显示-F附加文件类别符号在文件名最后-R显示目录及其下的子目录内容pwd:显示当前目录路径cd

目录名:进入目录222、cp,rm,mv,mkdir等文件处理命令语法:cp-afpx[源文件或目录][目地文件或目录]-aarchive的意思相当于-dpR,也就是复制所有目录并包括子目录-f强制复制文件-p保留原始文件的日期-x指定文件复制后属于目的磁盘的文件系统,如:ext2->fat32语法:rm-irf[文件或目录]-r删除目录及其下的所有目录内容-f强制删除-i交互模式,删除前再做一次确认语法:mv–if[源文件或目录][目地文件或目录]233chmod,chown,chgrp等文件权限管理命令chmod命令英文原义:changefileordirectory’smode(改变文件或目录的权限)语法:chmod-R[mode=4,2,1or{a,u,g,o}{+,-,=,}{r,w,x,s,t}][文件或目录]示例:$chmoda+rstuff$chmod755filechown命令英文原义:Changefileordirectory'sOwner(改变文件或目录的所有者)语法:chown–R[用户][.[群组]][文件或目录]chgrp命令英文原义:Changefileordirectory'sGroup(改变文件或目录的所属群组)语法:chgrp–R[文件或目录]244、文件目录匹配搜索的使用如ARM应用程序的安装目录为:/ARM-FS2410,假设目录下没有其他ARM打头的目录和文件,则要进入这个目录,则只需输入:cd/ARM,然后按Tab键,在shell中会自动找到ARM-FS2410这个目录,而不必将目录名输入完全。5、编程时获取帮助man获得Linux系统手册的电子版,很实用!如:

manmount

256、取消root密码在终端输入命令:

vim/etc/shadow可以看到显示的第一行内容如下:root:$1$dVVd5YVP$OgZG58TL/NRExTfcr6URH.:11829:0:99999:7:-1:-1:134539236

要取消密码,需要将第一行root后第一对“:”之间的字符全部删除,删除后如下:

root::11829:0:99999:7:-1:-1:134539236然后用:w!强行存盘(由于shadow时只读的)后,用

:q退出vi就实现了取消root密码的操作。7、配置PC的IP地址ifconfigeth02将PC的IP地址配置为2。268、压缩和解压缩gzip命令语法:gzip[选项][-19r][文件]-1表示快速压缩-9表示最佳状况压缩-r压缩时包含所有子目录-d表示解压命令gunzip命令语法:gunzip:[选项][-r][文件或目录]tar命令语法:tar[选项][zcvf][文件或目录]-z使用gzip压缩.tar文件-c产生一个tar文件-v观看压缩过程-f指定压缩成的文件(或压缩到磁带设备)-x解压说明:一般都是最先的四个选项zcvf全加,这样马上可以将一个目录下所有的文件压缩成一个压缩文件。压缩后文件格式:.tar.gzor.tgz。9、查找文件命令如查找文件:main.c,使用命令find-namemain.c或者locatemain.c在一个目录下(含子目录)的所有文件中搜索含有某个字符串(如“root”)的所有文件:grep‘root'*-r2710、vi(m)用法vi是Linux/Unix世界里极为普遍的全屏幕文本编辑器。有三种状态,即编辑方式,插入方式和命令方式。在命令方式下,所有命令都要以“:”开始,对输入的字符,系统均作为命令来处理,如:q代表退出,:w表示存盘。当你进入vi时,会首先进入命令方式(同时也是编辑方式)。按下i就进入插入方式,用户输入的可视字符都添加到文件中,显示在屏幕上。按下ESC就可以回到命令状态。编辑模式和命令方式类似,都要输入命令,但它的命令不必以“:”,开始,它直接接收键盘输入的单字符或组合字符命令。在编辑模式下按下“:”就进入命令方式。

28vi常用操作无论是开启新档或修改旧文件,都可以使用vi,所需指令为:

vifilenamevi常用命令::q!放弃任何改动而退出vi,也就是强行退出:w存档:w!对于只读文件强行存档:wq存档并退出vi:x与wq的工作一样

GNOMEgedit文本编辑器:GNOMEgedit文本编辑器与Windows的notepad文本编辑器功能相似,快捷键也大部分相同,又有Windows的wordpad写字板的风格,比之notepad和wordpad,gedit功能更全面,操作更便利。2911、软、硬盘及光驱的使用

在Linux中对其他硬盘逻辑分区,软盘,光盘的使用与我们通常在DOS与Windows中的使用方法是不一样的,不能直接访问,因为在Linux中它们都被视为文件,因此在访问使用前必须使用装载命令mount将它们装载到系统的/mnt目录中来,使用结束,必须进行卸载。命令格式如下:

mount-t文件系统类型设备名装载目录

文件类型常用的有:msdosdos分区文件ext2Linux的文件系统swapLinuxswap分区或swap文件iso9660安装CD-ROM的文件系统vfat

支持长文件名的dos分区hpfsOS/2分区文件系统30设备名是指要装载的设备的名称,如软盘,硬盘,光盘等,软盘一般为/dev/fd0fd1,硬盘一般为/dev/hdahdb,硬盘逻辑分区一般为hda1hda2…等等,光盘一般为/dev/hdc。在装载前一般要在/dev/mnt目录下建立一个空的目录,如软盘为floppy,硬盘分区为其盘符如c,d等等,光盘为cd-rom,使用命令:mount-tmsdos/dev/fd0/mnt/floppy

;装载一个mddos格式的软盘mount-text2/dev/fd0/mnt/floppy

;装载一个Linux格式的软盘mount-tvfat/dev/hda1/mnt/c

;装载Windows98格式的硬盘分区mount-tiso9660/dev/hdc/mnt/cd-rom;装载一个光盘3112、Linux下的硬盘分区对Linux用户来说,无论有几个分区,分给哪一目录使用,它归根结底就只有一个根目录,一个独立且唯一的文件结构;Linux中每个分区都是用来组成整个文件系统的一部分,因为它采用了一种叫“载入”的处理方法,它的整个文件系统中包含了一整套的文件和目录,且将一个分区和一个目录联系起来。这时要载入的一个分区将使它的存储空间在一个目录下获得。32对于IDE硬盘,驱动器标识符为“hdx~”,其中“hd”表明分区所在设备的类型,这里是指IDE硬盘。“x”为盘号(a为基本盘,b为基本从属盘,c为辅助主盘,d为辅助从属盘),“~”代表分区,前四个分区用数字1到4表示,它们是主分区或扩展分区,从5开始就是逻辑分区。例如,hda3表示为第一个IDE硬盘上的第三个主分区或扩展分区,hdb2表示为第二个IDE硬盘上的第二个主分区或扩展分区.对于SCSI硬盘则标识为"sdx~",SCSI硬盘是用"sd"来表示分区所在设备的类型的,其余则和IDE硬盘的表示方法一样.33Linux的分区格式只有Ext2(3)和Swap两种,Ext2(3)用于存放系统文件,Swap则作为Linux的交换分区。RedHatLinux至少需要两个专门的分区(LinuxNative和LinuxSwap),且不能将Linux安装在Dos/Windows分区。SWAP分区是LINUX暂时存储数据的交换分区,它主要是把主内存上暂时不用的数据存起来,在需要的时候再调进内存内。且作为SWAP使用的分区不用指定“MountPoint”(载入点),它的大小至少要等于系统上实际内存的量,一般来说是内存的两倍。可以创建和使用一个以上的交换分区,最多16个。LinuxNative是存放系统文件的地方,它只能用EXT2(3)的分区类型。将Linux安装在一个或多个类型为“LinuxNative”的硬盘分区,且每一个分区都必须要指定一个“MountPoint”(载入点),告诉Linux在启动时这个目录要给哪个目录使用。34至少要使用两个分区,一个是Swap分区,另一个是根分区。可以使用以下两种分区工具:DiskDruid:这是RedHatLinux提供的管理工具。可以根据用户的要求创建和删除硬盘分区,还可以为每个分区管理载入点;Fdisk:传统的Linux分区工具,比DiskDruid功能更强大,使用更加灵活,要求用户对硬盘分区有一定经验。353.6.3I/O管道和重定向I/O重定向(Redirection):大于符号>小于符号<按位或符号(|)作为管道,将前级命令的输出定向给下级的命令当输入。Linux将标准I/O分为三种stdin(Standardlnput)标准输入:键盘Linux命令后面所加的参数,例如:ls–lfile1其中的file1就是标准输入stdout(StandardOutput)标准输出:stderr(Standarderror)标准错误输出36(1)输出重定向符(>) $ls–l>list正常情况执行ls-l后,输出结果到屏幕上但经过输出重定向符>后,输出结果会存储到list文件中附加输出重定向符(>>)$catlist2>>list1将输出重定向结果附加到输出文件的后面,cat显示list2,然后将结果附加到list1的文件尾,所以这样的操作可将两个文件合并成一个文件。若只有输出重定向符(>),则1ist2会把1ist1内容覆盖。37(2)输入重定向符(<)$catlistcatlist是list当作cat的标准输入文件,结果会将list的内容显示到屏幕上$cat<list但cat<list则是cat并无标准输入文件,而是使用输入重定向(<)将文件list定向给cat当标准输入,最后才显示list的内容。(3)错误输出重定向符(&>)$ls-ldir1>file_list当目录dir1存在时,输出会保存到file_list中当目录dir1不存在时,file_list文件为空$ls-ldir1&>file_list&>则不管是正常与否都记录到file_list文件中通常应用于程序编译过程中,记录错误信息38(4)管道符(|)管道的功用是将前面程序的输出结果引导为后面一个程序的输入。ls–l/usr|more/usr目录文件众多,使用ls-l查看并无法一页显示完毕,输出结果由管道|定向给more命令,当作more命令的输入,而使得可以一页一页地观看1s的输出结果。393.7LINUX下的C语言编程入门3.7.1C语言和LINUX3.7.2gcc编译器3.7.3GNU调试器GDB3.7.4使用make403.7.1C语言和LINUX

BrianW.Kernighan,DennisM.Rithie开发了C语言。

C语言的特点:(1)语言简洁、紧凑、使用方便灵活;(2)运算和数据结构丰富;(3)C语言允许直接访问物理地址,可以进行位操作,能实现汇编语言的大部分功能;(4)可移植性好;41C语言在嵌入式系统中编写应用程序至少有以下一些好处:(1)系统可以在其他的计算机上仿真(2)应用程序有较好的可移植性(3)便于程序的调试(4)C语言库函数丰富42gcc是GNU的C和C++编译器,它是Linux中最重要的软件开发工具。gcc能够编译三种语言:C,C++和ObjectC(C语言的一种面向对象扩展)。利用gcc命令可同时编译并连接C和C++源程序。汇编语言的编译器为as。编译器被成功的移植到不同的处理器平台上,标准PCLINUX上的gcc是FORINTELCPU的。

3.7.2gcc编译器43

gcc的基本用法:gcc[option][filename](1)gcc-cdemo.c

“-c”表示对文件进行编译和汇编,但不连接。(2)gcc–odemodemo.o将得到名为demo的可执行文件,当使用-o选项时,-o后面必须跟一个文件名(3)也可以上两步并为一步

gcc–odemodemo.c(4)运行可执行文件./demo(./表示当前目录下执行)(5)gcc-v

显示版本44gcc的使用使用gcc,程序员能够对编译过程有更多的控制。编译过程一般分为四个阶段:预处理编译汇编链接45hello.c程序清单#include<stdio.h>voidmain(){charmsg[80]="Hello,world!";printf("%s",msg);}46hello.c运行结果在命令行上键入以下命令编译和运行这段程序

$gcchello.c–ohello$./helloHello,World!47gcc步骤gcc首先运行预处理程序cpp来展开hello.c中的宏并在其中插入#include文件所包含的内容;然后把预处理后的源代码编译成目标代码最后,调用链接程序ld创建一个名为hello的二进制文件48函数库和包含文件(1)如果需要链接函数库或不在标准位置下的包含(include)文件,可以使用-L{DIRNAME}和-I{DIRNAME}选项指定文件所在的目录,以确保该目录的搜索顺序在标准目录之前。例如,如果读者把自定义头文件放置在/usr/local/include/someapp目录下,则为了使gcc能够找到这些文件,其命令行应与下面类似:

$gcc–csomeapp.c-I/usr/local/include/someapp

49函数库和包含文件(2)若需要测试在/home/someuser/lib目录下的新函数库libnew.so(.so是共享库文件的标准扩展名),同时所有需要的头文件在/home/someuser/include目录下。为了链接该函数库与定位头文件,相应的命令行应与下面类似:

$gcc-cmyapp.c–L/home/someuser/lib–I/home/someuser/include–lnew

-l选项使得链接程序使用指定的函数库中的目标代码,也就是本例中的libnew.so。如果忘了使用-l选项,则与库的链接将失败,并且gcc发出错误说明程序中引用了未定义的函数名。50gcc命令的常用选项有:

-c只编译并生成目标文件.

-oFILE生成指定的输出文件.用在生成可执行文件时.

-E只运行C预编译器.

-g生成调试信息.GNU调试器可利用该信息.

-IDIRECTORY指定额外的头文件搜索路径DIRECTORY.

-LDIRECTORY指定额外的函数库搜索路径DIRECTORY.

-lLIBRARY连接时搜索指定的函数库LIBRARY.

-O或-O1优化生成代码.

-O2进一步优化.

-O3比-O2更进一步优化,包括inline函数.

-shared生成共享目标文件.通常用在建立共享库时.

-static禁止使用共享连接.

-w不生成任何警告信息.

-Wall生成所有警告信息.51C预处理器cppcpp命令用来完成宏求值,条件编译,以及其它一些需要把代码传递到编译器前完成的工作。通常带#的语句都将有cpp进行预处理。预处理的过程就是展开宏的过程。gcc编译器通常自动调用cpp。也可以使用gcc–E调用cpp,或者在命令行中使用cpp。52GNU连接器ld实际上程序员编写的任何程序,都包含有许多部分,必须把它们组合起来形成可执行的文件。即使如同前面所见到的例子,程序只有一个模块,也必须使用连接器(ld)。诸如C函数库,程序初始化代码等等将被包含进去。如果没有C函数库,将不能使用strcpy()或者getpwnam()等函数。如果要写一个大程序,很多时候要把它分成几个独立的模块。这时候需要连接器把所有模块组合起来,结合C函数库和初始化代码,产生最后的可执行文件。通常,ld被编译器所调用,产生可执行代码。53GNU汇编器asas的任务就是处理汇编代码,并生成目标(二进制)代码,而目标代码将用来形成.o文件、库或者最终的可执行文件。as程序很少被单独使用,而基本上是被gcc调用。要注意的是由于汇编代码是低级别的代码,在不同平台上,甚至在相同的操作系统中,它也是不同的。比如在32位的x86平台上的用于计算的汇编代码,与在64位的Alpha平台上进行相同计算的汇编代码,就不一样。54文件处理器ar当要建立静态库的时候,就需要使用ar程序。这个程序用来把几个小文件组合成一个大文件。在建立静态库时,必须要用到把多个.o文件组合成一个单独的.a文件。553.7.3GNU调试器GDBLinux包含了一个叫gdb的GNU调试程序。gdb是一个用来调试C和C++程序的强力调试器。可以说,gdb不是创建工作的一部分,而是开发工作的一部分。使用它可以在程序运行时观察程序的内部结构和内存的使用情况,例如,监视程序中变量的值,设置断点以使程序在指定的代码行上停止执行,支持单步执行等。56GDB介绍(1)用gcc-gos.c-oos,产生的可执行文档叫os.

然后打gdbos,就可进入gdb,屏幕提示:

GDBisfreesoftwareandyouarewelcometodistributecopiesofitundercertainconditions;type"showcopying"tosee

theconditions.

ThereisabsolutelynowarrantyforGDB;type"showwarranty"

fordetails.

GDB4.16,Copyright1995FreeSoftwareFoundation,Inc...

(gdb)

(gdb)是提示符,在这提示符下可以输入命令,直到退出。(退出命令是q/Q)

57GDB介绍(2)设置gdb的屏幕大小。键入:(gdb)setwidth70就是把标准屏幕设为70列。58GDB介绍(3)设置断点:

break或简单打b后面加行号或函数名

可以在main函数上设断点

(gdb)breakmain或(gdb)bmain

系统提示:Breakpoint1at0x8049552:fileos.c,line455.

然后运行这个程序,当程序运行到main函数时程序就会停止返回到gdb的提示符下。59GDB介绍(4)运行命令运行的命令是run或r打入r或run后,程序就开始运行直到进入main的入口停止,显示:

Startingprogram:<路径>/os

Breakpoint1,main()atos.c:455

455

Initial();

这里455Initial();是将要执行的命令或函数。60GDB介绍(5)gdb提供两种跟踪调试方式:1.单步进入,stepinto就是跟踪到函数内。命令是step或s2.单步,next,就是简单的单步,不会进入函数。命令是next或n61GDB介绍(6)gdb基本命令:file装入想要调试的可执行文件kill终止正在调试的可执行文件list列出产生可执行文件的源代码的部分next执行下一行源代码但不进入函数内部step执行下一行源代码而且进入函数内部run执行当前被调试的程序quit终止gdbwatch能监视一个变量的值而不管它何时被改变(在break断点设定以后采用)print显示表达式的值break在代码里设置断点,这将使程序执行到这里被挂起make不退出gdb就可以重新产生可执行文件shell不退出gdb就可执行UNIXshell命令62依赖库显示lddldd(LibraryDependencyDisplay)工具用来显示一个可执行文件需要使用的共享函数库。对于简单的C程序来说,显示清单中通常只有两项:C函数库libc和动态库的装载器ld-linux。比如:$ldd./myprogramlibc.so.6:=>/lib/libc.so.6(0x40004000)/lib/ld-linux.so.2=>/lib/ld-linux.so.2(0x2aaaa000)633.7.4使用make大程序通常包含有十几个甚至几百个单独的模块。如果手工调用gcc编译每一个模块的话,这个过程不但冗长了,而且非常乏味,也容易引进错误。64Makefile使用make,一个叫Makefile的文件将被创建。在这个文件里,描述了如何使用一套规则来创建系统的各个组件。这些规则定义了创建组件所需要的命令(比如对gcc和ar的调用)以及相互的依赖关系。比如,要修改一个为许多C源代码所包含的头文件,需要对这些文件重新编译,以使用新的头文件,然而为了节省时间,不需要再编译和此头文件无关的其他模块。GNUmake可以根据Makefile中指定的规则进行工作,这样只要编译那些需要重新编译的文件就可以了,并且生成新的可执行代码。由Makefile自动维护,使程序员从繁杂的维护工作中解脱出来。65格式target:dependencyfile1dependencyfile2[....] command1 command2 [....]Makefile66一个简单使用Makefile的例子main.o(main.clib1.h)prog1.o (prog1.clib1.h)prog2.o(prog2.c)prog3.o(prog3.clib2.h)67#Thisisourfirstmakefilemyprog:main.oprog1.oprog2.oprog3.o gcc–omyprogmain.oprog1.oprog2.oprog3

温馨提示

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

评论

0/150

提交评论