基于ARM9和Linux嵌入式系统设计.ppt

上传人:max****ui 文档编号:11497439 上传时间:2020-04-25 格式:PPT 页数:127 大小:437.50KB
返回 下载 相关 举报
基于ARM9和Linux嵌入式系统设计.ppt_第1页
第1页 / 共127页
基于ARM9和Linux嵌入式系统设计.ppt_第2页
第2页 / 共127页
基于ARM9和Linux嵌入式系统设计.ppt_第3页
第3页 / 共127页
点击查看更多>>
资源描述
第6章基于ARM9和Linux嵌入式系统设计,6.1嵌入式Linux的开发环境6.2嵌入式Linux操作系统常用命令6.3Linux开发工具GUNgcc的使用6.4GNUmake命令和makefile文件6.5GDB调试器简介6.6嵌入式Linux下C语言编程文件的操作6.7嵌入式Linux引导程序6.8Linux系统在ARM平台上的移植6.9综合训练Linux系统及应用程序的烧,6.1嵌入式Linux的开发环境,6.1.1嵌入式Linux开发环境建立嵌入式LINUX开发环境有几个方案:1、基于PC机WINDOWS操作系统下的CYGWIN;2、在WINDOWS下安装虚拟机后,再在虚拟机中安装LINXUX操作系统;3、直接安装LINUX操作系统。,6.1.2嵌入式Linux开发的一般过程,1.了解硬件;2.准备需要使用的Linux工具以及其他工具;3.安排内存地址;4.编写启动代码和机器相关代码;5.编写驱动程序;6.C库、GUI和系统程序的移植;7.调试.,6.2嵌入式Linux操作系统常用命令,命令形式如下:commandoptionsourcefile(s)targetfile1登录和退出Linux启动后,给出login命令,等待用户登录。Login:Password:使用logout命令退出外壳。2关机或重新启动的shutdown命令$shutdownhnow要求系统立即关机$shutdownnow要求系统立即关机$shutdown+5要求5分钟后关机$shutdownrnow要求立即关机系统并重新启动,3联机帮助(1)显示帮助手册man选项命令名称常用选项说明-S根据章节显示,由于一个命令名称可能会有很多类别;-f只显示出命令的功能而不显示其中详细的说明文件;-w不显示手册页,只显示将被格式化和显示的文件所在位置;-a显示所有的手册页,而不是只显示第一个;-E在每行的末尾显示$符号。例如:要了解关于这个命令的更多信息,可以使用:$manecho,(2)系统帮助文档help命令用于查看所有Shell命令。用户可以通过该命令寻求Shell命令的用法,只需在所查找的命令后输入help命令,就可以看到所查命令的内容了。例如:查看cd命令的使用方法。$cd-help,(3)whereis命令whereis命令来查询某个命令存在哪一个目录下。命令格式:whereis选项命令名。说明:不加选项可直接使用whereis命令。whereis命令的常用选项如下:章节说明-b只查找二进制文件-m查找主要文件-s查找来源-u查找不常用的记录文件例如:查找cd命令二进制文件在什么目录下。命令:$whereis-bcd,4更改账号密码使用passwd命令来设置新用户的口令。在设置口令之后,账号即能正常工作。语法:passwdOldpassword:Newpassword:Retypenewpassword:,5列出文件或目录ls选项文件目录列表ls命令中的常用选项如下:-a:显示所有文件及目录,包括以“.”开始的隐藏文件在内的所有文件名;-c:按列输出,纵向排序;-x:按列输出,横向排序;-l:列出目录下文件权限、所有者、文件大小、修改时间及名称;lg同上,并显示出文件的所有者工作组名;-t:根据文件建立时间的先后次序列出;-A:同-a,但不列出.(目前目录)及.(父目录);-R:递归显示下层子目录即显示出目录下以及所有子目录文件名;-help:显示帮助信息;-version:显示版本信息。,6改变工作目录语法:cdname其中name是目录名、路径或目录缩写。cd除了有切换目录的功能外,还有一个功能就是,不管在哪个目录内,只要输入cd命令,不加任何参数,即可回到用户目录内。$cdtony切换到当前目录下的tony子目录$cd.切换到上一层目录$cd/切换到系统根目录$cd切换到用户主目录(或运行cd命令也可以)$cd/usr/bin切换到/usr/bin目录,7.建立新目录mkdir的命令格式如下:mkdir-m模式-p目录名目录命令中的参数说明如下:m模式:在建立目录时把按模式指定设置目录权限。该目录的权限分为:目录所有者的权限、组中其他人对目录的权限和系统中其他人对目录的权限。这三个权限分别用三个数字之和来表示:对目录的读权限是4、写权限是2、执行权限是1。-p目录名:建立所有不存在父目录的目录。目录:要建立的目录。,8删除文件或目录rm选项文件列表常用选项说明-r删除文件列表中指定的目录,若不用此标志则不删除目录-I指定交互模式。在执行删除前提示确认。任何以Y开始的响应都表示肯定;其他则表示否定。-f指定强行删除模式。本标志强迫删除,不用提示。-V在删除前回显文件名。-指明所有选项结束。用于删除一个文件名与某一选项相同的文件。例如:假定偶然建立了名为-f的文件,又打算删除它,命令rm-f不起任何作用,因为-f被解释成标志而不是文件名;而命令rm-f能成功地删除文件。,9删除目录的rmdir命令rmdir命令是用来删除目录的,一般情况下要删除的目录必须为空目录,如果所给的目录不为空,系统会报告错误。该命令的语法格式如下:rmdir-p目录列表命令中的参数说明如下:-p:在删除目录表指定的目录后,若父目录为空,则rmdir也删除父目录。状态信息显示什么被删除,什么没被删除。目录列表:空格分隔的目录名列表。要删除的目录必须为空。,10显示当前目录执行pwd命令形式如下:pwd11改变当前工作目录该命令使用的语法格式如下:Cd目录名命令中的参数说明如下:目录名:改变到所指定的目录名。若没有指定目录,就返回到用户主目录(在HOME环境变量中指定)。,12复制文件的cp命令Cp选项源文件目标文件Cp选项源文件组目标目录源文件:要拷贝的文件。目标文件:目标名。也可以是目录名,这种情况下,源文件名作为目标文件名,而文件放在该目录下。源文件组:要拷贝文件的由空格分隔的列表。目标目录:目标目录。常用命令的选项如下:常用选项说明-a在备份中保持尽可能多的源文件结构和属。-b将要覆盖或删除文件的备份。-f删除已存在的目标文件。-I提示是否覆盖已存在的目标文件。-p保持原先文件的所有者、组权限和时间标志-r递归拷贝目录,把所有非目录文件当普通文件拷贝。-R递归拷贝目录。,13.移动或更改文件、目录名称mv-f-i文件1文件2mv-f-i目录1目录2mv-f-i文件列表目录命令中的参数说明如下:-f:通常情况下,目标文件存在但用户没有写权限时,mv会给出提示。本选项会使mv命令执行移动而不给出提示。-i:交互模式,当移动的目录已存在同名的目标文件名时,用覆盖方式写文件,但在写入之前给出提示。文件1:源文件名。文件2:目标文件名(新文件名)。目录1:源目录名。目录2:目标目录名(新目录名)。文件列表:用空格分隔的文件名列表。把列表中的文件移动到一个新目录。目录:目标目录。,14分页查看文件内容用户可以使用more命令,让画面显示满一页时暂停,此时可按空格键继续显示下一个画面,或按Q键停止显示。其命令格式如下:more文件名显示文字文件的内容;或cat文件名|more逐页显示文字文件的内容;或lsal|more显示满一个画面便停止,按空格键继续显示下一画面,按Q键跳离。,15查看文件内容显示文本文件内容的命令是cat命令,用来将文件的内容显示到终端上,其命令语法如下:cat选项文件列表命令中的参数说明如下:-b计算所有非空输出行,开始为1。-e在每行末尾显示$符号。-n计算所有输出行,开始为1。-s将相连的多个空行用单一空行代替。,16.查找文件内容grep选项匹配字符串文件列表文件列表:需查找的文件列表匹配字符串:希望在文件中查到的串。选项:说明-v列出不匹配串或正则表达式的行。-c对匹配的行计数。-l只显示包含匹配的文件的文件名。-h抑制包含匹配文件的文件名的显示。-n每个匹配行只按照相对的行号显示。-i产生不区分大小写的匹配,缺省状态是区分大小写。,17排序命令命令的语法格式如下:sort选项文件说明:sort命令对指定文件中所有的行进行排序,并将结果显示在标准输出上。如不指定输入文件或使用“-”,则表示排序内容来自标准输入。,18.比较文件内容的命令(1)comm命令如果想对两个有序的文件进行比较,可以使用comm命令。该命令的使用语法如下:comm-123file1file2说明:该命令是对两个已经排好序的文件进行比较。其中file1和file2是已排序的文件。comm读取这两个文件,然后生成三列输出:仅在file1中出现的行;仅在file2中出现的行;在两个文件中都存在的行。如果文件名用“-”,则表示从标准输入读取。,(2)diff命令diff命令用于比较两个文件内容的不同,其命令语法格式如下:diff参数原文件目标文件参数说明a将所有文件当做文本文件来处理b忽略空格造成的不同B忽略空行造成的不同q只报告什么地方不同,不报告具体的不同信息H利用试探法加速对大文件的搜索I忽略大小写的变化L用pr对输出进行分页R在比较目录时比较所有的子目录S两个文件相同时才报告v在标准输出上输出版本信息并退出,19.命令的输入和输出(1)输入重定向输入重定向是指把命令(或可执行程序)的标准输入重定向到指定的文件中。重定向操作符使用“文件名可以使用追加重定向操作符“”,其使用语法形式为:命令文件名,(3)管道管道是把一系列命令连接起来,即第一个命令的输出会作为第二个命令的输入通过管道传给第二个命令,第二个命令的输出又会作为第三个命令的输入,以此类推。显示在屏幕上的是管道行中最后一个命令的输出(如果命令行中未使用输出重定向)。(4)命令替换命令替换和重定向有些相似,但区别在于命令替换是将一个命令的输出作为另外一个命令的参数。常用命令格式为:command1command2其中,command2的输出将作为command1的参数。需要注意的是这里的符号,被它括起来的内容将作为命令执行,执行后的结果作为command1的参数。,例如:$cdpwd该命令将pwd命令列出的目录作为cd命令的参数,结果仍然是停留在当前目录下。重导与管道举例:$lsaldir.txt将lsal命令执行结果输出到dir.txt文件;$catdata1.txtdata2.txt将data1.txt内容附加到data2.txt文件之后;$ls|grepconf搜索并显示ls命令运行结果中含有“conf”字符串的行;$yes|rmrmydir利用yes命令重复输出“y”字符的特性,将结果传给rm命令,如此即可避免重复输入“y”。,20.链接文件的命令ln选项目标链接名ln选项目标目录链接有两种,一种被称为硬链接(HardLink),另一种被称为符号链接(SymbolicLink)。建立硬链接时,链接文件和被链接文件必须位于同一个文件系统中,并且不能建立指向目录的硬链接。而对符号链接,则不存在这个问题。默认情况下,ln产生硬链接。例:$ln-slunch/home/xu用户为当前目录下的文件lunch创建了一个符号链接/home/xu。,21.改变文件或目录权限chmod选项文件和目录列表chmod命令的常用选项如下:-c表示只有在文件的权限确实改变时才进行详细说明;-v表示详细说明权限的变化;-R表示递归改变目录及其内容的权限。chmod命令支持两种文件权限设定的方法:(1)使用字符串设置权限;(2)使用八进制数设置权限另外,文件和目录的权限还可用八进制数字模式来表示。三个八进制数字分别代表ugo的权限。执行权、读权和写权所对应的数值分别是1,2和4。若要rwx属性则4+2+1=7;若要rw-属性则4+2=6;若要r-x属性则4+1=5。,22改变文件和目录的所有权chown选项用户文件和目录列表用户:是用户号或文件/etc/passwd中出现的用户名。文件和目录列表:用于重新指定所有权的用空格分隔的文件和目录列表。chown命令的常用选项如下:常用选项说明-c只有在文件的权限确实改变时才进行详细说明。-v详细说明权限的变化。-R递归改变目录及其内容的权限。,23文件压缩(1)gzip压缩文件gzip选项压缩(解压缩)的文件名gzip命令各选项的说明如下:常用选项说明-c将输出写到标准输出上,并保留原有文件。-d将压缩文件解压。-l对每个压缩文件,显示压缩文件的大小、未压缩文件的大小、压缩比、未压缩文件的名字等详细信息-r递归式地查找指定目录并压缩其中的所有文件或者是解压缩。-t测试,检查压缩文件是否完整。-v对每一个压缩和解压的文件,显示文件名和压缩比。,(2)文件打包tartar主选项+辅选项文件或者目录常用选项说明-c创建新的档案文件。备份一个目录或是一些文件。-x从档案文件中释放文件。-r把要存档的文件追加到档案文件的未尾。-t列出档案文件的内容,查看已经备份了哪些文件。tar命令的辅助选项的常用选项如下:F使用档案文件或设备,这个选项通常是必选的。K保存已经存在文件。在还原时,遇到相同文件,不进行覆盖。M在还原文件时,把所有文件的修改时间设定为现在。V报告tar处理的文件信息。如无此选项,tar不报告文件信息。Z用gzip来压缩/解压缩文件,(3)unzip命令unzip命令用于解扩展名为“.zip”的压缩文件。命令格式如下:unzip选项压缩文件名.zipupzip命令的常用选项如下:-x文件列表解压缩文件,但不包括指定的file文件-v查看压缩文件目录,但不解压。-t测试文件有无损坏,但不解压。-d目录把压缩文件解到指定目录下。-z只显示压缩文件的注解。-n不覆盖已经存在的文件。-o覆盖已存在的文件且不要求用户确认。-j不重建文档的目录结构,把所有文件解压到同一目录下。,24加载的mount命令(1)加载光盘rootfreeroot#mount/dev/cdrom/mnt/cdrom1若要显示中文,可执行以下命令:rootfreeroot#mountoiocharset=cp936/dev/cdrom/mnt/cdrom1其中:“oiocharset=cp936”是显示中文的参数。(2)加载硬盘可以加载硬盘分区、ZIP磁盘驱动器等。例如/dev/hda1(IDE0第1个硬盘的第1个主分区)是采用Windows的FAT32文件系统,可执行以下命令加载:rootfreeroot#mounttvfat/dev/hda1/mnt/winC若要显示中文,可以执行以下命令:rootfreeroot#mounttvfatoiocharset=cp936/dev/hda1/mnt/winC,(3)加载U盘或USB设备与光盘一样,存取U盘前,必须先将其加载到系统中。只不过,Linux会将USB视为SCSI装置,其设备名称为/dev/sd?(?代表az,若您的系统中只有这一项SCSI装置,则设备名称会是/dev/sda)。先自行创建一个新的加载目录,如在/mnt目录下创建一个usb子目录。然后插入U盘,并打开文字模式窗口如下操作,加载U盘:rootfreeroot#mounttvfatoiocharset=cp936/dev/sda/mnt/usbUSB设备(如:数码相机)的加载同上,只是在加载时注意您的USB设备是插入到哪个usb口,确定其设备名称/dev/sd?(?代表az)。,25卸载的umount命令如果不需要使用加载的光盘或U盘,则需先执行卸载命令之后,才能将光盘或U盘退出:rootfreeroot#umount/mnt/cdrom将光盘卸载;rootfreeroot#umount/mnt/usb将U盘卸载;,6.3Linux开发工具GUNgcc的使用,GCC常用模式及选项gcc最基本的用法是:gccoptionsfile.gcc的整个编译过程分别是:预处理,编译,汇编和链接。gcc编译器几个最常用的选项:-o表示要求编译器生成指定文件名的可执行文件;-c表示只要求编译器进行编译生成.o的目标文件,而不要进行链接;-g要求编译器在编译的时候提供以后对程序进行调试的信息;-E表示编译器对源文件只进行预处理就停止,而不做编译、汇编和链接;-S表示编译器只进行编译,而不做汇编和链接;-O表示编译器优化生成可执行文件;-Wall生成所有的警告信息。例如:$gcc-ohellohello.c,GNU编译器生成的目标文件默认格式为elf(executivelinkedfile)格式,由标准c源代码生成的目标文件中包含以下段:.text(正文段)包含程序的指令代码,.data(数据段)包含固定的数据,如常量,字符串等,.bss(未初始化数据段)包含未初始化的变量和数组等。这里介绍GCC常用的两种模式:编译模式和编译连接模式。$gcc-otest源文件是test.c,生成的可执行代码存放在一个名为test的文件中。$gcc-ctest.c默认情况下,生成的目标文件名为test.o,$gcc-ctest.comytest.o下面的命令将同时编译三个源文件,即first.c、second.c和third.c,然后将它们连接成一个可执行程序test。命令如下:$gcc-otestfirst.csecond.cthird.c,3其他常用选项的使用$gcctest.cI./inc-otest此命令告诉GCC包含文件存放在./inc目录下,在当前目录的上一级。若在编译时需要的包含文件存放在多个目录下,可使用多个-I来指定各个目录:$gcctest.cI./incI././inc2-otest上面命令告诉GCC包含文件存放在./inc目录下,在当前目录的上一级。若在编译时需的包含文件存放在多个目录下,可使用多个-I来指定各个目录:$gcctest.cI./incI././inc2-otest这里指出了另一个包含子目录inc2,较之前目录它还要在再上两级才能找到.另外,我们还可以在编译命令行中定义符号常量。为此,我们可以简单的在命令行中使用-D选项即可,如下例所示:$gcc-DTEST_CONFIGURATIONtest.c-otest上面的命令与在源文件中加入下列命令是等效的:#defineTEST_CONFIGURATION,4.警告功能当GCC在编译过程中检查出错误的话,它就会中止编译;但检测到警告时却能继续编译生成可执行程序。在众多的警告选项之中,最常用的就是-Wall选项。该选项能发现程序中一系列的常见错误警告,该选项用法举例如下:$gcc-Walltest.c-otest该选项相当于同时使用了下列所有的选项:unused-function:遇到仅声明过但尚未定义的静态函数时发出警告。unused-label:遇到声明过但不使用的标号的警告。unused-parameter:从未用过的函数参数的警告。,6.4GNUmake命令和makefile文件,显式规则。此规则说明了,如何生成一个或多个目标文件。这是由Makefile的书写者明显指出,要生成的文件,文件的依赖文件,生成的命令。隐晦规则。由于make有自动推导的功能,所以隐晦的规则可以让我们比较粗糙地简略地书写Makefile,这是由make所支持的。变量的定义。在Makefile中可定义一系列的变量,变量一般是字符串,这个有点象C语言中的宏,当Makefile被执行时,其中的变量都会被扩展到相应的引用位置上。文件指示。其包括了三个部分,一个是在一个Makefile中引用另一个Makefile,就像C语言中的include一样;另一个是指根据某些情况指定Makefile中的有效部分,就像C语言中的预编译#if一样;还有就是定义一个多行的命令。注释。Makefile中只有行注释,和UNIX的Shell脚本一样,其注释是用“#”字符,Makefile中使用“#”字符,可以用反斜框进行转义,如:“#”。,6.4.1Makefile文件的规则,1Makefile书写规则一个Makefile文件含有一系列的规则,规则包含以下内容。一个目标(target),即make最终需要创建的文件,如可执行文件和目标文件;目标也可以是要执行的动作,如“clean”。一个或多个依赖文件(dependency)列表,通常是编译目标文件所需要的其他文件。一系列命今(command),是make执行的动作,通常是把指定的相关文件编译成目标文件的编译命令,每个命令占一行,且每个命令行的起始字符必须为TAB字符。Makefile规则的一般形式如下:target:dependencydependency(tab),例如,有以下的Makefile文件:#一个简单的Makefile的例子test:prog.ocode.ogccotestprog.ocode.oprog.o:prog.cprog.hcode.hgcccprog.coprog.ocode.o:code.ccode.hgccccode.cocode.oclean:rmf*.o,一般情况下,调用make命令可输入:#maketargettarget是Makefile文件中定义的目标之一,如果省略target,make就将生成Makefile文件中定义的第一个目标。在上面Makefile的例子中,还定义了一个目标clean,它是Makefile中常用的一种专用目标,即删除所有的目标模块。在顶层Makefile中的语句:includearch/$(ARCH)/Makefile,配置文件.config包含由用户选择项,用来存放内核配置后的结果(如makeconfig)。规则文件Rules.make,则被所有的Makefile使用。用户通过makeconfig配置后,产生了.config。顶层Makefile读入.config中的配置选择。顶层Makefile有两个主要的任务:产生压缩的内核镜像vmlinux文件和内核模块module。位于各个子目录下的Makefile同样也根据.config给出的配置信息,构造出当前配置下需要的源文件列表,并在文件的最后有include$(TOPDIR)/Rules.make。,2.在规则中使用通配符三种通配符:“*”,“?”和“.”。这是和Unix的B-Shell相同。波浪号(“”)字符在文件名中有特殊的用途。如“test”表示当前用户的$HOME目录下的test目录。而“hchen/test”则表示用户hchen的宿主目录下的test目录。通配符“*.c”表示所以后缀为c的文件。例如:print:*.clpr-p$?touchprint上面这个例子说明目标print依赖于所有的.c文件。其中的“$?”是一个自动化变量。,3.文件搜寻Makefile文件中的特殊变量“VPATH”就是完成这个功能的。VPATH=src:./headers上面的定义指定两个目录,“src”和“./headers”。目录由“冒号”分隔。另一个设置文件搜索路径的方法是使用make的“vpath”关键字(注意,它是全小写的),这不是变量,是一个make的关键字,和上面提到的那个VPATH变量很类似,但是它更为灵活。它可以指定不同的文件在不同的搜索目录中。此功能使用方法有三种:(1)vpath;为符合模式的文件指定搜索目录。(2)vpath;清除符合模式的文件的搜索目录。(3)vpath;清除所有已被设置好了的文件搜索目录。vapth使用方法中的需要包含“%”字符。“%”的意思是匹配零或若干字符。,例如:“%.h”表示所有以“.h”结尾的文件。指定了要搜索的文件集,而则指定了的文件集搜索的目录。例如:vpath%.h./headers该语句表示,要求make在“./headers”目录下搜索所有以“.h”结尾的文件。可连续地使用vpath语句,以指定不同搜索策略。如连续的vpath语句中出现了相同的,或是被重复了的,那么,make会按照vpath语句的先后顺序来执行搜索。如:vpath%.cfoovpath%blishvpath%.cbar其表示“.c”结尾的文件,先在“foo”目录,然后是“blish”,最后是“bar”目录。,4.伪目标伪目标又称假想目标,如:clean:rm*.otemp可使用一个特殊的标记“.PHONY”来指明一个目标是“伪目标”,向make说明,不管是否有这个文件,这个目标就是“伪目标”。.PHONY:clean只要有这个声明,不管是否有“clean”文件,要运行“clean”这个目标,只有“makeclean”这样。整个过程可以这样写:.PHONY:cleanclean:rm*.otemp伪目标一般没有依赖的文件。但是,可以为伪目标指定所依赖的文件。伪目标同样可以作为“默认目标”,只要将其放在第一个。,如果Makefile需要生成若干个可执行文件,可把所有的目标文件都写在一个Makefile中,可声明了一个“all”的伪目标,例如:all:prog1prog2prog3.PHONY:allprog1:prog1.outils.occ-oprog1prog1.outils.oprog2:prog2.occ-oprog2prog2.oprog3:prog3.osort.outils.occ-oprog3prog3.osort.outils.o上面的Makefile中的第一个目标“all”会被作为其默认目标,其依赖于其它三个目标。由于伪目标的特性是,总是被执行的,所以其依赖的那三个目标就总是不如“all”这个目标新。所以,其它三个目标的规则总是会被决议。也就达到了我们一口气生成多个目标的目的。“.PHONY:all”声明了“all”这个目标为“伪目标”。从上面的例子可看出,目标也可以成为依赖,伪目标同样也可成为依赖。,5.多目标Makefile的规则中的目标可能有多个目标同时依赖于一个文件,且生成的命令大体类似,因此可把其合并起来。若多个目标的生成规则的执行命令是同一个时,可能会带来麻烦,这时可以使用自动化变量“$”,这个变量表示着目前规则中所有的目标的集合。例如:bigoutputlittleoutput:text.ggeneratetext.g-$(substoutput,$)$上述规则等价于:bigoutput:text.ggeneratetext.g-bigbigoutputlittleoutput:text.ggeneratetext.g-littlelittleoutput其中,-$(substoutput,$)中的“$”表示执行一个Makefile的函数,函数名为subst,后面的为参数。此函数是截取字符串的意思,“$”表示目标的集合,就像一个数组,“$”依次取出目标,并执行命令。,6.静态模式静态模式可以更加容易地定义多目标的规则,可以让规则变得更加的有弹性和灵活。其语法::.targets定义了一系列的目标文件,可以有通配符,是目标的一个集合。target-parrtern是指明了targets的模式,也就是的目标集模式。prereq-parrterns是目标的依赖模式,它对target-parrtern形成的模式再进行一次依赖目标的定义。,若定义成“%.o”,则集合中都是以“.o”结尾的;若定义成“%.c”,则所形成的目标集进行二次定义,其计算方法是,取模式中的“%”(也就是去掉了.o这个结尾),并为其加上.c这个结尾,形成的新集合。所以,“目标模式”或是“依赖模式”中都应该有“%”这个字符,如果文件名中有“%”,那么可以使用反斜杠“”进行转义,来标明真实的“%”字符。例如:objects=foo.obar.oall:$(objects)$(objects):%.o:%.c$(CC)-c$(CFLAGS)$-o$上例中,指明了目标从$object中获取,“%.o”表明要所有以“.o”结尾的目标,也就是“foo.obar.o”;而依赖模式“%.c”则取模式“%.o”的“%”,也就是“foobar”,并为其加上“.c”的后缀,于是,依赖目标就是“foo.cbar.c”。而命令中的“$”和“$”则是自动化变量,“$”表示所有的依赖目标集(也就是“foo.cbar.c”),“$”表示目标集(也就是“foo.obar.o”)。,上面的规则展开后等价于下面的规则:foo.o:foo.c$(CC)-c$(CFLAGS)foo.c-ofoo.obar.o:bar.c$(CC)-c$(CFLAGS)bar.c-obar.o如果“%.o”有几百个,那种只要用这种很简单的“静态模式规则”,就可以写完一堆规则,实在是太有效率了。“静态模式规则”的用法很灵活,如果用得好,那会是一个很强大的功能。再看一个例子:files=foo.elcbar.olose.o$(filter%.o,$(files):%.o:%.c$(CC)-c$(CFLAGS)$-o$(filter%.elc,$(files):%.elc:%.elemacs-fbatch-byte-compile$loadflashkernelx,装载压缩映像文件zImage到flash存储器中,地址是kernel分区,并采用xmodem传输协议。也可以指定地址和大小,例如:viviloadflash0 x800000 xc0000 x。,(2)part命令操作MTD分区信息,比如,显示、增加、删除、复位、保存MTD分区等。partshow:显示mtd分区信息。partadd:增加新的mtd分区,其中为新mtd分区名称,是mtd器件的偏移,表示mtd分区的大小,表示分区类型,可选项有JFFS2、LOCKED和BONFS。partdel:删除一个mtd分区。partreset:恢复mtd分区为默认值。partsave:在flash中永久保存参数值和分区信息。(3)param命令用来设置或者察看参数。例如:改变“linuxcommandline”,使用viviparamsetlinux_cmd_lineyouwish.。也可以改变引导程序启动的时间,使用viviparamsetboot_delay100000实现。,(4)boot命令用来引导存储在flash存储器或者ram中的linux内核。命令格式:boot|参数设定存储linux内核映像的位置,可选项有ram、nor和smc。参数或描述存储内核的地址,如果有提前定义的mtd分区信息,可以只输入分区名称,否则需要指定地址和大小。例如:vivibootnor0 x80000表示从flash存储器中读出linux内核,偏移是0 x80000。(5)flash命令存储器管理命令,例如:flasherase|,表示擦除flash存储器。,2VIVI的目录树VIVI包括下面几个目录:(1)arch:此目录包括了所有VIVI支持的目标板的子目录,本书附带的代码中只包含S3C2410X。(2)Documentation:存放了许多文档,其中包括VIVI的使用指南。(3)drivers:其中包括了引导内核所需的MTD设备和串口驱动程序。MTD目录下分maps、nand和nor三个目录,实现对NandFlash和NorFlash的读写控制。Serial目录下的文件实现对串口的控制,并支持xmodem和ymodem协议。(4)include:头文件的公共目录,其中的S3C2410.h定义了处理器的一些寄存器,以及NANDFlash的一些寄存器等。Platform/smdk2410.h定义了与目标板相关的资源配置参数,修改波特率、引导参数和物理内存映射等参数即可配置目标板。(5)init:此目录只有main.c和version.c两个文件。与普通的C程序一样,VIVI将从main函数开始执行。(6)lib:一些平台公共的接口代码,比如,time.c里的udelay()和mdelay()。(7)scripts:此目录存放了配置所需的脚本文件,如Menuconfig和Configure文件,以方便对VIVI的配置。,6.8Linux系统在ARM平台上的移植,Linux系统实际上由两个比较独立的部分组成,即内核部分和系统部分。通常一个Linux系统的启动过程如下:首先一个不隶属于任何操作系统的加载程序将Linux部分内核调入内存,并将控制权交给内存中Linux内核的第一行代码,加载程序的工作就完成了。此后Linux要将自己的剩余部分全部加载到内存、初始化所有的设备、在内存中建立好所需的数据结构(有关进程、设备、内存等)。到此为止,Linux内核的工作告一段落,内核已经控制了所有硬件设备。至于操作和使用这些硬件设备,则轮到系统部分登场了。内核加载设备并启动init守护进程,init守护进程会根据配置文件加载文件系统、配置网络、服务进程、终端等。也就是说,内核部分初始化并控制大部分硬件设备,为内存管理、进程管理、设备读、写等工作做好一切准备;系统部分加载必需的设备,配置各种环境以便用户可以使用整个系统。,6.8.1Linux内核结构,Linux内核主要由五个子系统组成:进程调度内存管理虚拟文件系统网络接口进程间通信,各个子系统之间的依赖关系如下:进程调度与内存管理之间的关系:这两个子系统互相依赖。在多道程序环境下,程序要运行必须为之创建进程,而创建进程的第一件事情,就是将程序和数据装入内存。进程间通信与内存管理的关系:进程间通信子系统要依赖内存管理支持共享内存通信机制,这种机制允许两个进程除了拥有自己的私有空间,还可以存取共同的内存区域。虚拟文件系统与网络接口之间关系:虚拟文件系统利用网络接口支持网络文件系统(NFS),也利用内存管理支持RAMDISK设备。内存管理与虚拟文件系统之间的关系:内存管理利用虚拟文件系统支持交换,交换进程(swapd)定期由调度程序调度,这也是内存管理依赖于进程调度的唯一原因。,Linux内核源代码位于/usr/src/linux-*.*.*(*.*.*代表内核版本,如2.4.18)目录下。其中:/include子目录包含了建立内核代码时所需的大部分包含文件,这个模块利用其他模块重建内核。/init子目录包含了内核的初始化代码,这是内核工作的开始的起点。/arch子目录包含了所有硬件结构特定的内核代码。如:i386,alpha和ARM。/drivers子目录包含了内核中所有的设备驱动程序,如:块设备和SCSI设备。/fs子目录包含了所有的文件系统的代码。如:ext2,vfat等。/net子目录包含了内核的连网代码。/mm子目录包含了所有内存管理代码。/ipc子目录包含了进程间通信代码。/kernel子目录包含了主内核代码。,在Linux内核的实现中,有一些数据结构使用非常频繁,他们是:task_struct:Linux内核利用task_struct数据结构代表一个进程,用task_struct指针形成一个task数组。当建立新进程的时候,Linux为新的进程分配一个task_struct结构,然后将指针保存在task数组中。调度程序维护current指针,它指向当前正在运行的进程。mm_struct:每个进程的虚拟内存由mm_struct结构代表。该结构中包含了一组指向vm-area_struct结构的指针,vm-area_struct结构描述了虚拟内存的一个区域。inode:虚拟文件系统(VFS)中的文件、目录等均由对应的索引节点(inode)代表。每个VFS索引节点中的内容由文件系统专属的例程提供。VFS索引节点只存在于内核内存中,实际保存于VFS的索引节点高速缓存中。如果两个进程用相同的进程打开,则可以共享inade的数据结构,这种共享是通过两个进程中数据块指向相同的inode完成。,6.8.2内核移植,下面简述Linux内核移植与编译过程:1Linux移植准备Linux移植其实质是获取某一版本的Linux内核源码。下面以Linux2.6.0为例来说明这一过程:先到ftp:/ftp.arm.linux.org.uk上下载Linux2.6.0内核及其关于ARM平台的补丁(如:Patch-2.6.0-rmk1.gz)。给Linux2.6.0打补丁:zcat./patch-2.6.0-rmk1.gz|patchp1(前面./表示补丁文件放在内核文件上一层目录)准备交叉编译环境。交叉编译环境工具链一般包括binutils(含AS汇编器,LD链接器等),arm-gcc,glibc等。修改内核目录下的makefile文件,主要是以下几行:注释掉ARCH:=$(shellunamem|sedes/i.86/i386/-es/sun4u/sparc64/-es/arm.*/arm/-es/sa110/arm/)这一行。ARCH:=改为ARCH:=armCROSS_COMPILE:=改为CROSS_COMPILE=交叉编译工具中arm-linux所在目录/arm-linux-例如:CROSS_COMPILE=/usr/local/arm/2.95.3/bin/arm-linux-此后就可以进行编译。,2交叉编译环境的搭建交叉编译环境的建立最重要的就是要有一个交叉编译器。所谓的交叉编译就是:利用运行在某机器上的编译器编译某个源程序生成在另一台机器上运行的目标代码的过程。在嵌入式ARM系统中主要用到的编译器是arm-linux-gcc,它是gcc的arm改版。gcc是个功能强大的c语言编译工具。下面介绍GCC交叉编译器的生成过程:(1)取得Binutils、GCC、Glibc的源码。可以到相关网站去获得,网上这方面资源比较丰富。你把这三个文件解压到你自己的目录如:/toolchain/gcc,/toolchain/bu,/toolchain/glibc。,(2)配置并编译Binutils,得到下一步要用到的汇编器和连接器。在配置Binutils之前先把Linux内核中GCC所必需的头文件拷到GCC可以找到的目录。如下操作:cpdrinclude/asm-arm/toolchain/gcc/arm-linux/include/asmcpdrinclude/linux/toolchain/gcc/arm-linux/include/linux然后进入Binutils目录:./configure-target=arm-linux-prefix=/toolchain/armmakeallinstall,(3)配置并编译GCC源代码,生成GCC编译器。编译之前先修改gcc的t-linux文件,此文件放在gcc/config/arm目录下。在t-linux文件中的TARGET_LIBGCC2_CFLAGS后加上_gthr_posix_hinhibit_libc,操作如下:进入gcc/config/arm目录mvt-linuxt-linux-orig/备份原来的t-linux文件修改如下:seds/TARGET_LIBGCC2_CFLAGS=/TARGET_LIBGCC2_CFLAGS=-D_gthr_posix_h-Dinhibit_libc/t-linux-corecp./t-linux-core./t-linux,然后进入GCC安装目录进行编译,如下操作:(是行连接符号)./configure-target=arm-linux-prefix=/toolchain/gcc-enable-languages=c-with-local-prefix=/toolchain/gcc/arm-linux-without-headers(不编译头文件)-with-newlib-disable-sharedmakeallinstall这里首先生成的是C编译器。,(4)配置Glibc编译生成Glibc的C函数库。编译Glibc之前先要把编译器改为我们刚刚生成的交叉编译器arm-linux-gcc,同时要指定编译所需要的头文件。操作如下:CC=arm-linux-gccAR=arm-linux-arRANLIB=arm-linux-ranlib然后进入Glibc的安装目录,进行配置如下:./configure-host=arm-linux-prefix=/toolchain/gcc/arm-linux-enable-add-ons-with-headers=/toolchain/gcc/arm-linux/includemakeallinstall,(5)再次配置并编译GCC源代码,生成其它语言的编译器如:C+等。恢复t-linux文件用备份的t-linux-orig覆盖改动后的t-linuxcp/toolchian/gcc/config/arm/t-linux-orig/toolchian/gcc/config/arm/t-linux重新编译./configure-target=arm-linux-prefix=/toolchian/gcc-enable-languages=c,c+-with-local-prefix=/toolchian/gcc/arm-linuxmakeallinstall,3修改Linux内核源码在ARM的子目录下可找到一个boot目录,在boot下有一个用ARM汇编语言编写的init.S文件。这个init.S就是引导Linux内核在Arm平台上启动的初始化代码。其中定义了一个全局符号_start,它定义了默认的起始地址,也是整体内核二进制镜像的起始标志。init.S主要完成以下功能:定义数据段、代码段、bbs(未初始化数据段)起始地址变量并对bbs段进行初始化。设置寄存器以初始化系统硬件。关
展开阅读全文
相关资源
相关搜索

当前位置:首页 > 图纸专区 > 课件教案


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!