收藏 分享(赏)

Linux嵌入式开发入门PPT课件.ppt

上传人:oil007 文档编号:3815890 上传时间:2018-11-19 格式:PPT 页数:68 大小:822KB
下载 相关 举报
Linux嵌入式开发入门PPT课件.ppt_第1页
第1页 / 共68页
Linux嵌入式开发入门PPT课件.ppt_第2页
第2页 / 共68页
Linux嵌入式开发入门PPT课件.ppt_第3页
第3页 / 共68页
Linux嵌入式开发入门PPT课件.ppt_第4页
第4页 / 共68页
Linux嵌入式开发入门PPT课件.ppt_第5页
第5页 / 共68页
点击查看更多>>
资源描述

1、Linux基础知识,一、Linux基础知识,1、什么是Linux GNU计划,又称革奴计划,是由Richard Stallman在1983年9月27日公开发起的。它的目标是创建一套完全自由的操作系统。Richard Stallman最早是在net.unix-wizards新闻组上公布该消息,并附带一份GNU宣言等解释为何发起该计划的文章,其中一个理由就是要“重现当年软件界合作互助的团结精神”。GNU是“GNUs Not Unix”的递归缩写。Stallman宣布GNU应当发音为Guh-NOO以避免与new这个单词混淆(注:Gnu在英文中原意为非洲牛羚,发音与new相同)。,2,一、Linux基

2、础知识,UNIX是一种广泛使用的商业操作系统的名称。由于GNU将要实现UNIX系统的接口标准,因此GNU计划可以分别开发不同的操作系统部件。GNU计划采用了部分当时已经可自由使用的软件,例如TeX排版系统和X Window视窗系统等。不过GNU计划也开发了大批其他的自由软件。为保证GNU软件可以自由地“使用、复制、修改和发布”,所有GNU软件都在一份在禁止其他人添加任何限制的情况下授权所有权利给任何人的协议条款,GNU通用公共许可证(GNU General Public License,GPL)。这个就是被称为“反版权”(或称Copyleft)的概念。,3,一、Linux基础知识,到了1990

3、年,GNU计划已经开发出的软件包括了一个功能强大的文字编辑器Emacs,C语言编译器GCC,以及大部分UNIX系统的程序库和工具。唯一依然没有完成的重要组件就是操作系统的内核(称为HURD)。1991年Linus Torvalds编写出了与UNIX兼容的Linux操作系统内核并在GPL条款下发布。Linux之后在网上广泛流传,许多程序员参与了开发与修改。1992年Linux与其他GNU软件结合,完全自由的操作系统正式诞生。该操作系统往往被称为“GNU/Linux”或简称Linux。(尽管如此GNU计划自己的内核Hurd依然在开发中,目前已经发布Beta版本。),4,一、Linux基础知识,确切

4、的讲,LINUX只是整个GNU/LINUX系统中的一个组件,即属于内核部分,该内核实现了在X86体系上的真正的多任务、多线程、多CPU运行的类UNIX操作系统,其API编程接口完全符合POSIX标准。由于其源代码开放,因此非常适合开发人员的学习、研究与研发使用。,5,一、Linux基础知识,2、Linux文件系统在Windows操作系统使用了盘符这个概念,用单一的字母来表示硬盘上的不同分区,比如,C盘,D盘等等。在Linux里边,我们没有盘符这个概念,采用目录的形式进行管理。LINUX系统为树型目录式结构,由于没有WINDOWS系统的盘号的概念,整个系统从根目录(“/”)出发,呈现倒树型,其中

5、每个目录都可以安装至一个独立的分区中,从目录界面上分辨不出各个目录具体安装是在同一个分区还是不同分区。由于是自由软件,LINUX下的文件系统多种多样,因此原则上LINUX系统可以安装在包括WINDOWS文件系统如FAT16、FAT32等在内的各种文件系统中。一般,6,一、Linux基础知识,RedHat的发行版本推荐安装为EXT3系统,也是LINUX的官方默认的文件系统。这是一种日志性文件系统,可记录系统运行中的异常状态,采用该文件系统在系统突然掉电时可保护系统数据不会丢失。LINUX下的文件命名与WINDOWS不同,其不遵循文件名扩展名的原则,也不能直接从文件名上看出其类型特点,而是通过设置

6、察看文件的属性来获取文件的特性。在LINUX下,任何对象均为文件,因此一个文件可能是一个文本文件,可能是对某个文件的链接,也可能某一个硬件设备,甚至还可能是某一段系统内存区域。,7,一、Linux基础知识,3、安装Linuxa、使用真实的电脑安装(推荐使用的发行版有Redhat/Mandrake/Suse等)b、使用虚拟机安装c、Cooperative Linux(简称CoLinux)是首个能在Win32平台高效率地以原生方式运行Linux的免费、开源软件。,8,一、Linux基础知识,4、Linux系统的目录结构介绍/bin该目录中存放Linux的常用命令/boot该目录下存放的都是系统启动

7、时要用到的程序/dev该目录包含了Linux系统中使用的所有外部设备,它实际上是访问这些外部设备的端口,你可以访问这些外部设备,与访问一个文件或一个目录没有区别。/sbin该目录用来存放系统管理员的系统管理程序。,9,一、Linux基础知识,/etc该目录存放了系统管理时要用到的各种配置文件和子目录,例如网络配置文件、文件系统等。/home如果建立一个名为“xx”的用户,那么在/home目录下就有一个对应的“/home/xx”路径,用来存放该用户的主目录。/lib该目录用来存放系统动态连接共享库,几乎所有的应用程序都会用到该目录下的共享库。,10,一、Linux基础知识,/lost+found

8、该目录在大多数情况下都是空的。但当突然停电、或者非正常关机后,有些文件就临时存放在这里。/mnt该目录在一般情况下也是空的,你可以临时将别的文件系统挂在该目录下。/proc可以在该目录下获取系统信息,这些信息是在内存中由系统自己产生的。/root超级用户的主目录/tmp用来存放不同程序执行时产生的临时文件,11,一、Linux基础知识,/usr用户应用程序和文件都存放在该目录下,12,一、Linux基础知识,5、Linux下文件的类型LINUX下的所有对象均表现为文件,在LINUX系统中共有有4中基本的文件类型: 普通文件;普通文件是用户大部分时间都在操作的文件,包括文本文件、程序代码源文件、

9、SHELL脚本、二进制文件等等。与WINDOWS下的文件不同,LINUX系统下的文件命名并不遵循文件名扩展名的原则(当然也可以将文件命名成文件名扩展名),区分文件类型主要通过察看和设置文件属性来进行,可以用“ls -l”命令察看文件的属性,用“chmod”命令来设置文件的属性,如“chmod +x”命令即使,13,一、Linux基础知识,一个文件具有可执行的属性。另外一个区别是隐藏文件的设置,在LINUX下通过将文件命名成“.文件名”的格式,该文件就成为了隐藏文件。在root用户模式下,系统中的所有文件均可读、写以及执行,而其他用户模式则只具有部分权限并且不能修改文件的属性与权限。 目录文件;

10、目录文件实际也是一种文本文件,其内容即记载了目录中所有文件的名称,察看目录下的文件实际上只是列出了目录文件中的文本内容。同样拷贝、移动目录也只是改变了文件中所记载的内容。,14,一、Linux基础知识,连接文件连接文件有些类似WINDOWS系统下的快捷方式,它不是实际存在的文件,而只是指向实际文件的一个连接和别名,可以像操作正常文件一样操作连接文件,使用“ls -l”可以察看一个文件是否连接文件,通过“ln -s”创建一个连接文件。 设备文件设备文件实际上是指向硬件设备的节点,是用户操作硬件设备的接口,用户可以像读写普通文件一样操作设备文件,即通过“打开读写关闭”这样的方式,就可以操作系统的硬

11、件设备了。如“ls /dev/ttyS0”命令就可以将当前目录下所显示的内容从串口1发送出去。,15,一、Linux基础知识,设备文件有两种类型:字符型设备文件(char)和块设备文件(block)。一般说来,能够以字节流方式读写的设备可以看成是字符型设备,如串行口、终端、鼠标、声卡等等。而以块方式读写的设备则为块设备,如硬盘等等。可以通过“ls -l”来察看一个文件是否设备文件,而创建一个设备文件则需要用到“mknod”命令。,16,一、Linux基础知识,6、文件的权限理解文件权限Linux文件的权限文件权限,是指对文件的访问权限,包括对文件的读、写、删除、执行。Linux 是一个多用户操

12、作系统,它允许多个用户同时登录和工作。因此 Linux 将一个文件或目录与一个用户和组联系起来。如下面的例子: drwxr-xr-x 5 root root 1024 Sep 13 03:27 Desktop 与文件权限相关联的是第一、第三、第四个域。第三个域是文件的所有者,第四个域是文件的所属组,而第一个域则限制了文件的访问权限。在这个例子中,文件的所有者是 root,所属的组是 root,文件的访问权限是 drwxr-xr-x。,17,一、Linux基础知识,对于文件和目录讲,每个文件和目录都有一组权限标志和它们结合在一起,在上例中就是第一个域中的内容。该域由 10 个字符组成,可以把它们

13、分为四组,d|rwx|r-x|r-x表示文件类型、所有者权限标志、组权限标志、其他用户权限标志。 其中: 文件类型:第一个字符。由于 Linux 系统对与设备、目录、文件都当作是文件来处理,因此该字符表明此文件的类型,字符与对应的意义如下表:,18,一、Linux基础知识,19,权限标志: 对每个文件或目录都有 4 类不同的用户。每类用户各有一组读、写和执行 (搜索)文件的访问权限,这 4 类用户是:root:系统特权用户类,既 UID = 0 的用户。owner:拥有文件的用户。 group:共享文件的组访问权限的用户类的用户组名称。 world:不属于上面 3 类的所有其他用户。 作为 r

14、oot,他们自动拥有了所有文件和目录的全面的读、写和搜索的权限,,一、Linux基础知识,所以没有必要明确指定他们的权限。其他三类用户则可以在耽搁文件或者目录的基础上别授权或撤消权限。因此对另外三类用户,一共 9 个权限位与之对应,分为 3 组,每组 3 个,分别用 r、w、x 来表示,分别对应 owner、group、world。 权限位对于文件和目录的含义有些许不同。每组 3 个字符对应的含义从左至右的顺序,对于文件来说是:读文件的内容(r)、写数据到文件(w)、做为命令执行该文件(x)。对于目录来说是:读包含在目录中的文件名称(r)、写信息到目录中去(增加和删除索引点的连接)、搜索目录(

15、能用该目录名称作为路径名去访问它所包含的文件或子目录)。具体来说就是:1 有只读权限的用户不能用 cd 进入该目录;还必须有执行权限才能进入。 2 有执行权限的用户只有在知道文件名并拥有该文件的读权限的情况下才可以访问目录下的文件。 3 必须有读和执行权限才可以使用 ls 列出目录清单,或使用 cd 进入目录。 4 如用户有目录的写权限,则可以创建、删除或修改目录下的任何文件或子目录,既是该文件或子目录属于其他用户。,20,一、Linux基础知识,Linux文件权限三个八进制数字表示。其实文件的权限应该用四个八进制来表示,不过用“ls l”命令时,只显示三个罢了。那个没有显示的八进制数字其实是

16、第一个,它用来设定一些特殊权限。这个八进制数字的三个位是:SUID SGID sticky-bit 它们的含义是: SUID当设置了SUID 位的文件被执行时,该文件将以所有者的身份运行,也就是说无论谁来执行这个文件,他都有文件所有者的特权。如果所有者是 root 的话,那么执行人就有超级用户的特权了。这时该位将变成一个安全漏洞,因此不要轻易设置该位。,21,一、Linux基础知识,SGID与上面的内容类似。文件运行时,运行者将具有所属组的特权。sticky-bit,sticky 位要求操作系统既是在可执行程序退出后,仍要在内存中保留该程序的映象。这样做是为了节省大型程序的启动时间。但是会占用

17、系统资源。因此设置该位,不如把程序写好。set uid ;set gid;sticky bit区别每一个文件有所有者及组编号,set uid ;set gid可以改变用户对文件具有的权限:写和执行. setuid: 在执行时具有文件所有者的权限. setgid: 设置目录. 一个目录被标上setgid位,此目录下创建的文件继承该目录的属性. sticky bit: 该位可以理解为防删除位. 设置sticky bit位后,就算用户对目录具有写权限,但也只能添加文件而不能删除文件。,22,一、Linux基础知识,修改文件权限首先讲修改文件的所有权,使用 chown 和 chgrp 命令: chow

18、n new_user file or directory:修改文件或目录的所有者。 chgrp new_group file or directory:修改文件或目录的所属组。 这里需要注意的是:普通用户不能将文件或目录的所有权交与他人,只有 root 有这一权限。但是普通用户有权改变文件或目录的所属组。 由于每类用户的权限都是由rwx 三位组成,因此可以用三个八进制数字表示文件的访问权。一个八进制数字可以用三个二进制数字表示,那么与其对应,权值为 4 的位对应 r,权值为 2 的位对应 w,权值为 1 的位对应 x。对于一类用户,将这三位与其对应的权,23,一、Linux基础知识,值相乘求和

19、,就可以得出对该类用户的访问权限。 改变文件访问权限的命令是 chmod,格式是: chmod permission file_name 比如 chmod 764 a.txt,它表示对于文件的所有者,具有对该文件读、写、执行的权限。对于文件所属组的用户,拥有读、写的权限。对于其他用户,只有读权限。 这里需要注意的是:文件的创建者是唯一可以修改该文件访问权限的普通用户,另外一个可以修改文件访问权限的用户是 root。 还有一种表示方法,就是用字符串来设定文件访问权限。其中读用 r 表示,写用 w 表示,执行用 x,24,一、Linux基础知识,表示;所有者用 u 表示,组用户用 g 表示,其他用

20、户用 o 表示,所有用户用 a 表示。那么上面例子就写成下面的模样: chmod a+r,u+w,u+x,g+w a.txt 修改文件权限特殊标志位,操作这些标志与操作文件权限的命令是一样的,都是 chmod. 有两种方法来操作: 1)、 chmod u+s temp - 为temp文件加上setuid标志. (setuid 只对文件有效,U=用户) chmod g+s tempdir - 为tempdir目录加上setgid标志 (setgid 只对目录有效,g=组名) chmod o+t temp - 为temp文件加上sticky标志 (sticky只对文件有效),25,一、Linux基

21、础知识,2)、 采用八进制方式. 这一组八进制数字三位的意义如下, abc a - setuid位, 如果该位为1, 则表示设置setuid b - setgid位, 如果该位为1, 则表示设置setgid c - sticky位, 如果该位为1, 则表示设置sticky 设置后, 可以用 ls -l 来查看. 如果本来在该位上有x, 则这些特殊标志显示为小写字母 (s, s, t). 否则, 显示为大写字母 (S, S, T) 如:rwsrw-r- 表示有setuid标志 (rwxrw-r-:rwsrw-r-) rwxrwsrw- 表示有setgid标志 (rwxrwxrw-:rwxrwsr

22、w-) rwxrw-rwt 表示有sticky标志 (rwxrw-rwx:rwxrw-rwt),26,一、Linux基础知识,7、Linux常用命令ls 列出目录和文件cd 转换目录cp 复制文件rm 删除文件mkdir 创建目录rmdir 删除目录mv 移动文件man 获得帮助,27,一、Linux基础知识,ps 列出进程df 检查文件系统空间占用情况du 显示磁盘空间的使用情况kill 杀死进程chmod 改变文件或目录的访问权限chown 改变文件或目录的属主和组chgrp 改变文件或目录所属的组info 获得帮助,28,一、Linux基础知识,pwd 显示当前工作目录的绝对路径rpm

23、文件包管理tar 为文件和目录创建档案gzip 文件压缩clear 清屏grep 指定文件中搜索特定的内容cat 连接并显示指定的文件信息ln 创建文件链接ifconfig 察看及设置网络,29,一、Linux基础知识,8、Linux下软件的安装a)、rpm包: 1、rpm -ivh *.rpmb)、deb包: 1、输入dpkg -i *.debc)、tar.gz(tar.bz2)源代码包:1、解压tar zxvf *.tar.gz(tar jxvf *.tar.bz2)2、./configure 3、make 4、make install,30,二、编写和调试Linux程序,大家都在Wind

24、ows下写过程序。Windows下面有很多集成开发环境可以选择,比如微软的VisualC+,Borland公司的C+Builder等。在Windows下写程序的过程一般是:打开IDE,新建一个项目,编辑代码。然后呢,点击“编译”按钮。如果没有错误,可执行文件就生成了。这时候可以直接执行程序,有错误的话,还可以调试。这样的开发过程,可能大家都觉得很方便,很容易接受。但是在方便的同时,代价是许多底层的东西被掩盖了。你不知道在点了一个按钮之后,究竟发生了什么事情。你也不能对程序的生成做精确的控制。如果你需要一些特殊的功能而IDE不支持的话,你只能等待。,31,二、编写和调试Linux程序,在Linu

25、x下面开发,则是另外一种风格。Linux下IDE环境比较少,而且没有像VisualC+那样方便易用的。但并不意味着在Linux下做开发就很困难,效率不高。VisualC+是一个高度集成的环境,它整合了项目管理、代码编辑、编译连接、调试运行等功能。而在Linux下,这些功能都是分开的。整合在一起虽然方便一些,但分开也有分开的好处。你可以自由的选择各个部分来完成你的工作。相反,VisualC+提供什么,你就得用什么。GCC是Linux下面主要的编译器。GCC的本来是“GNU C COMPILE”的缩写。但后来GCC支持C/C+、fortran、java等语言,所以GCC就变成了“GNU,32,二、

26、编写和调试Linux程序,COMPILE COLLECTION”的缩写。GCC功能十分强大,不仅支持x86系统,还支持arm、mips、sparc、m68k等CPU。几乎所有流行的CPU都被GCC所支持。GCC也被移植到各种操作系统之上,包括Windows系统。,33,二、编写和调试Linux程序,1、gcc的体系及使用gcc是一套编译工具的统称。具体来说,gcc包括以下部分:预处理器cpp,编译器gcc,汇编器gas,连接器ld,调试器gdb,还有不少辅助工具等等。这些工具可以很好的配合使用。Linux下一个程序的编译,大概需要一下步骤:首先预处理器对程序代码扫描,主要是替换各种宏定义,包含

27、文件和条件编译等。然后gcc编译程序,输出汇编代码。接着gas把汇编代码翻译成为机器指令。最后ld负责将程序的各个模块组装在一起,完成重定位等工作,并输出可执行文件。以上工作一般由gcc调用各个模块一次完成,但也可以分开处理。,34,二、编写和调试Linux程序,Gcc编译过程中,主要会处理以下文件:*.c C语言文件*.cpp *.C C+语言文件*.s *.S 汇编语言文件*.o OBJ文件,即目标文件*.a 静态库文件*.so 动态库文件(类似于DLL文件) gcc是靠扩展名来识别各种文件的。,35,二、编写和调试Linux程序,gcc功能强大的同时,它的选项也非常多,大概有一百多个,涵

28、盖了代码生成的各个方面。但常用的选项也就是十几个左右。*预定义选项:-D-D等同于在程序里面写“#define”。-D主要用于定义一些全局的标志以及条件编译。比如可以在程序里面这样写:#ifdef DEBUG(debug code)#else(normal code)#endif,36,二、编写和调试Linux程序,然后在编译的时候,使用gcc DDEBUG c prg.c 就可以执行调试。使用gcc c prg.c 就是执行正常的代码。这样就有很大的灵活性。*编译选项:-E -c s -E告诉编译器,只执行完预处理操作就停下。有时候编译程序的时候出错,就可以先预处理一下,以便查找错误。-s

29、告诉编译器,只生成汇编代码。-c 告诉编译器,只做编译工作。输出是一个.o文件。一个大型工程往往有很多文件组成,需要先编译为目标文件,然后才统一连接。,37,二、编写和调试Linux程序,*警告选项:-W使用-W,编译器就会在编译的时候,针对代码中的不规范的地方,输出相应的提示信息。一般使用-Wall来产生所有的警告信息。产生警告信息的代码,一般都是程序中的隐患,应该及时排除。*调试与代码优化:-g O O1 O2 O3 -Os使用-g可以在生成的可执行文件中,包含调试信息。和gdb配合使用,可以在源代码级进行调试。-Ox 都是代码优化选项。-O 到 O3可以优化执行速度。一般使用-O2就可以

30、了。-Os对代码大小进行优化,可以得到最小代码。,38,二、编写和调试Linux程序,有一点注意的是,-g和-O同时使用,会对产生的调试信息有影响,使调试信息不太准确。所以-g 和-O尽量分开使用。但是同时使用不会对代码本身的执行产生影响。*头文件选项:-I -i当在文件中使用“#include ”时,gcc会从默认的目录搜索投文件。这个路径一般是“/usr/include”。我们的程序通常会有自己的头文件,而且不会放到系统目录中去。这时候就要指定头文件的目录了。使用-I指定头文件的路径。比如文件放在“/root/prg/inc”下面,就这样写:gcc I/root/prg/inc xxxxx

31、xxxxx,39,二、编写和调试Linux程序,目录可以是绝对目录,也可以是相对目录。-i可以在编译的时候,强制包含一个头文件。这等同于在程序中写“#include ”。有时候会用到这种形式。*连接库选项:-L l -L与-I一样,也是指定一个搜寻目录。-L指定库文件的搜寻。如果指定了-L,gcc会优先搜寻这个目录,如果找不到,再到系统目录中去找。-l 指定具体要连接哪一个库。Gcc所用的库,都是以“libxxxx.xx”这种形式命名的。例如我们有一个库,libmyfun.a。如果要连接这个库,就要写上“-lmyfun”。也就是把库名的前缀和后缀都去掉。,40,二、编写和调试Linux程序,2

32、、make的使用为什么要使用make?Makefile主要目的是项目管理。一个项目一般有许多源文件组成,在编译的时候都有很长且复杂的命令行。而把这些命令保存在makefile里面,就可以简化这个工作。另外,make可以减少重新编译所需要的时间。因为它可以识别出那些文件被修改过,并只编译这些文件。编写Makefilemake通过makefile来完成一系列的工作。Makefile是一个文本形式的数据文件,里面包含了很多规则来告诉make需要编译那些文件以及怎样编译这些文件。每条规则包括以下内容:,41,二、编写和调试Linux程序,一个target,即make最终要创建的目标。一个或多个depe

33、ndencies列表,通常是编译 target所需要的其他文件。要执行的一系列命令,用于创建target。Makefile的一条规则格式如下:Target:dependency1 dependency2 Command1Command2 要注意的是,每条command前面并不是空格,而是一个制表符Tab。这是makefile的特殊规定。,42,二、编写和调试Linux程序,假设我们要开发一个编辑器,命名为editor。它有三个文件组成:editor.c、screen.c、keyboard.c。为它写的一个makefile看起来是这个样子: /editor:editor.o screen.o k

34、eyboard.ogcc o editor editor.o screen.o keyboard.oeditor.o:editor.c editor.h keyboard.h screen.hgcc c editor.cscreen.o:screen.hgcc c screen.ckeyboard.o:keyboard.hgcc c keyboard.c clean:rm f editor *.o /,43,二、编写和调试Linux程序,我们在makefile所在的目录里面执行make,就可以编译editor。这个makefile文件有5个target。首先是editor,这是缺省的目标。一般

35、第一个目标就是缺省的目标,除非在make的参数里面指定一个。Editor的依赖目标有三个:editor.o screen.o keyboard.o。在编译editor时这三个文件必须存在。接下来是创建editor所需的命令。它将这三个文件编译连接,生成editor可执行文件。定义变量上面的makefile是一个很简单的例子,没有用到make的一些高级特性。为了简化编辑和维护makefile,,44,二、编写和调试Linux程序,make允许在makefile中使用变量。变量定义的一般方法是:VARNAME=something 然后,用$(VARNAME)就可以引用变量的内容。使用变量来改写上面

36、的makefile里面的editor规则:OBJS=editor.o screen.o keyboard.oEditor:$(OBJS)Gcc o editor $(OBJS)可见使用了变量后,makefile变得更加清晰、简单了。,45,二、编写和调试Linux程序,隐含规则除了我们在makefile里面写上的规则之外,make已经与定义了很多隐含规则。使用隐含规则可以大大简化makefile。比如editor的makefile可以这样写: /OBJS=editor.o screen.o keyboard.oEditor:$(OBJS)Gcc o editor $(OBJS)clean:rm

37、 f editor *.o /这个makefile里面并没有生成三个.o文件的规则。Make有一条隐含规则,可以自动从file.c编译生成file.o。于是make就用这条规则先生成三个.o文件,然后编译生成editor。,46,二、编写和调试Linux程序,如果项目不太复杂,就可以使用隐含规则。比较大的项目,最好使用显式规则。 3、调试程序如何调试如果我们的程序编译后运行正常,那是最好的了。但是大多数情况下并不是这样。这时候就需要对程序进行跟踪调试。在linux下面,主要的调试工具 是gdb。调试程序的时候,最好不要过分依赖调试工具。因为一个大型的项目,可能会有几十个源文件,这样的调试是很复

38、杂的工作。调试的关键是,一定要对自己的程序的整体结构比较了解。这样出问题的时候,首先能估计出可能是在哪一部分有问题,然后逐个排除,最终解决问题。,47,二、编写和调试Linux程序,使用gdb用gdb调试程序,必须在程序里面包含调试信息。编译程序的时候,加上-g就可以包含调试信息。要启动gdb,只需要键入“gdb filename”就可以了。其中filename是要调试的程序名。也可以不加这个参数,进入gdb后,再用其他命令加载。下面介绍一些gdb常用的命令:*filefile命令加载一个模块进入gdb。模块可以是可执行文件,也可以是.o文件。当一个程序有多个.o编译而成时,可以用file命令

39、在各个模块中间切换。,48,二、编写和调试Linux程序,*listlist命令列出源文件的内容。输入简化的“l”也可以。比如“l 32”就是列出源文件32行开始的内容。*printprint检查变量的值。比如程序中有一个变量count,输入“p count”就可以知道count现在的值。Print命令默认的输出是十进制格式的。如果要输出十六进制,执行“p/x count”即可。*breakbreak命令在程序中设置断点。断点的设置有两种方式。第一种是行号。比如“b 24”,“b 120”等。第二种是函数名。比如“b main”, “b myfun”。,49,二、编写和调试Linux程序,除此

40、之外,“info b”命令可以列出当前已经设置的断点。 “d n”可以清除编号为n断点。*runrun命令开始运行当前程序。Run后面可以带参数,这些参数作为命令行参数,传递给当前要运行的程序。*continue当程序因为断点而停下来之后,可以用continue命令从断点继续运行。Continue命令可以简化为“c”。*nextnext命令单步执行一行程序。这条命令不会跟踪到函数调用里面去。next命令可以简化为“n”。,50,二、编写和调试Linux程序,*stepstep命令也是单步执行一行程序。与next不同的是,step命令可以跟踪到函数点用里面去。Step命令简写为“s”*backt

41、race有时候希望知道当前的函数被谁调用,这时可以用backtrace命令,或者“bt”。它可以显示当前函数被顺序调用的情况。*quitquit命令结束当前的调试,退出gdb。简写为“q”。,51,二、编写和调试Linux程序,gdb命令行有一个特点,就是在提示符下直接按回车键,gdb会执行上一次执行的命令。这在调试的时候会很方便。也许gdb这种终端界面下的调试方式大家不太习惯,这样就需要用到DDD, 它是命令行调试器的图形前端,除了一般的程序调试功能以外,还具有互动式图形数据显示的功能。它在嵌入式应用开发中十分出色。DDD的功能非常强大,可以调试用CC+、Ada、Fortran、Pascal

42、、Modula-2和Modula-3编写的程序;可以超文本方式浏览源代码;能够进行断点设置、回溯调试和历史纪录编辑;具有程序在终端运行的仿真窗口,并在远程主机上进行调试的能力。,52,二、编写和调试Linux程序,2、Hello World! #include main(intargc, char *argv) Int i;for ( i=0; i10; i+) printf(“hello i=%dn“, i);return 0; ,53,二、编写和调试Linux程序,gcc -o hello hello.c /用gcc编译出程序可在pc上运行 arm-linux-gcc -g o hello

43、 hello.c /使用交叉编译器编译程序,编译的程序在目标板上执行,(-g)带调试信息编译程序. /hello /执行程序执行程序 gdb hello /调试程序调试程序,54,二、编写和调试Linux程序,55,程序运行结果,二、编写和调试Linux程序,调试程序,56,二、编写和调试Linux程序,57,三、嵌入式Linux软件系统的构成,1.BootLoader2.Kernel3.FileSystem4.GUI5.Application,三、嵌入式Linux软件系统的构成,BootLoader1.PC机的系统引导过程系统加电跳转到固定地址BIOSMBRKernel2.嵌入式系统中的bo

44、otloader与PC机的引导程序是类似的系统加电跳转到固定的地址读入bootloader程序初始化系统加载kernel,将系统的控制权转到kernel.3.bootloader与机器硬件紧密相关。4.有一定通用性的bootloader程序uboothttp:/ 4 MTD partitions on “PXA Cerf Flash“: 0x00000000-0x00040000 : “Bootloader“ 0x00040000-0x000c0000 : “Partition Tables“ 0x000c0000-0x001c0000 : “Kernel“ 0x001c0000-0x0200

45、0000 : “Filesystem“,三、嵌入式Linux软件系统的构成,Multi Stage BootLoader由于 Boot Loader 的实现依赖于 CPU 的体系结构,因此大多数 Boot Loader 都分为 stage1 和 stage2 两大部分。依赖于 CPU 体系结构的代码,比如设备初始化代码等,通常都放在 stage1 中,而且通常都用汇编语言来实现,以达到短小精悍的目的。而 stage2 则通常用C语言来实现,这样可以实现给复杂的功能,而且代码会具有更好的可读性和可移植性。,三、嵌入式Linux软件系统的构成,BootLoader Stage1Boot Loade

46、r 的 stage1 通常包括以下步骤(以执行的先后顺序):硬件设备初始化。为加载 Boot Loader 的 stage2 准备 RAM 空间。拷贝 Boot Loader 的 stage2 到 RAM 空间中。设置好堆栈。跳转到 stage2 的 C 入口点。,三、嵌入式Linux软件系统的构成,BootLoader Stage2Boot Loader 的 stage2 通常包括以下步骤:初始化本阶段要使用到的硬件设备。检测系统内存映射(memory map)。 将 kernel 映像和根文件系统映像从 flash 上读到 RAM空间中。为内核设置启动参数。调用内核。,三、嵌入式Linux

47、软件系统的构成,BootLoader 调用内核Boot Loader 调用 Linux 内核的方法是直接跳转到内核的第一条指令处开始执行如果系统显示Uncompressing Linux. done,booting the kernel.则说明Bootloader已成功加载了kernel,Kernel开始启动,三、嵌入式Linux软件系统的构成,三、嵌入式Linux软件系统的构成,Kernel 启动过程检查root device mount root file system.如果root file system中,/linuxrc存在的话,就会被执行。/linuxrc就是一般所说的linux

48、的启动脚本#!/bin/shexport PATH=/bin:/sbin:/usr/binecho “Setting up RAMFS, please wait. “mount tmpfs /mnt/ramfs -t tmpfstar zxvf /.ramfs.tar.gz -C /mnt/ramfs /dev/null 2&1mount -n /proc /proc -t procecho -en “show the pictures “/usr/local/bin/fbctl 2& /setup background lightecho “done“echo “Executing,三、嵌入式Linux软件系统的构成,Kernel 启动过程exec /sbin/initInit根据/etc/inittab中的内容启动相应的程序这里有一个重要参数:RunLevel例:id:2:initdefault:则RunLevel为2,执行的内容为:/etc/rc2.d下面的内容,实际上rc*.d下的内容都是符号链接,都指向/etc/init.d下面的内容,Rc*.d下的程序是按字母顺序执行的。,

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 网络科技 > linux/Unix相关

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报