嵌入式学习linux基础入门教程_第1页
嵌入式学习linux基础入门教程_第2页
嵌入式学习linux基础入门教程_第3页
嵌入式学习linux基础入门教程_第4页
嵌入式学习linux基础入门教程_第5页
已阅读5页,还剩36页未读 继续免费阅读

下载本文档

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

文档简介

①初识LINUX--PC上LINUX系统常 /BIN(二进制 /BOOT(启动 /DEV(设备 /ETC /LIB(库 /MNT(挂接 /OPT(选项 /PROC(进程 /SBIN(系统二进制文件 /TMP(临时 /USR(用户 /VAR(变量 ②Linux的 命 命 ③LINUX上的GCC编译器和GDB调试 前 ④使用在ARM系统的miziLinux简 ⑤PC上Linux与Windows的文件共 Explorer2fs....................................................................................................................... 当然,不想真正安装Linux而要进行Linux开发的话也有很多选择,比如用VirtualPC安装模拟Linux9.0)+WindowsXP、Fedora+Windows2003等,都是没有问题的。击运行,输入一个s的名称并回车,比如bash。通常的结构。你可以一边阅读下文,一LinuxGUI许有些地方有出入,但是大体结构 根在文件系统层次的顶部,我们知Windows喜欢用反斜杠LINUX正斜杠(/)表示。它包含一些标准文件和,从某种意义上说,它就是个包括所有文件夹和文件的柜子。/BIN二进制也称二进制,/bin包含大多数LINUX/UNIX令的二进制(可执行)映象,这些命令供系统管理员和用户使用。这个中有一些通用命令,包括bashcatodcpdateechokilllnls、gunzip、zcat。/bin还包含一些必要的网络命令,包括name(或nisname)、hostname、netstat以及。/usr/bin包含大多数用户命令。/BOOT启动 包含了启动LINUX时需要的绝大部分文件,它包括LINUX内核的二进制映象f一些系统将配 RedHatLINUX6.1,内核是文件/boot/vmlinux-/DEV(设备/dev也称为设备,它一般最少包5文件,这些文件对应于连接到计算机的设备(终端、磁特殊文件和块特殊文件。这个中的一些文件有:cdromf针对CD-ROM动器)、console(针对控制台)、设备。在我使用的的系统上,/dev下有2447文件。/dev/null为Linux洞,在流重定向的时候/ETC/etc包含许多于主机的文件和,这些文件和包含了系统配置文件;但不包含任何二进制文件。该中的文件主要由系统管理员使用;但是有读权限的一般用户也可以使用其中大多数文件。该中有一些普通文件和,包括:X11、bashrc、csh.10gincrontab,、group、inittab、lilo.conf.1inuxconf、localtime、motd、passwd、pine.conf、profile、securetty、ss、skel、syslog.conf、ttytypezshrc。X11xWindow置文件。/etc下有一些与网络相关的文件和:exportsftpusersgatewayshost.confhostshosts.allowhosts.deny/home包含用户的主 包含用户的主 比如/home/bobk。在大型系统上,主机通过使用NFS协议共享主 户组,比如/home/admin/home/facultyhome/staff和/home/students。这个方案有许多变化。在笔者所用的系统中,/home下有43子 ,/home木录包含了用户的主 ,每一个子 administration、staff,students、faculty的主 /LIB(库lib包含给定语言的相关目标映象文件的集合,这些集合在一个单独的文件中,称为一个归档文用程序。这就允许软件开发者在他们的软件中使用预先写好和测试好的函数。lib中的库映象对于启动系统和运行某些命令是必需的。特别是它包含了标c/lib/libc.so.*,数学libm.so.*,共享动态链接程序/lib/ld/so,和其他/bin/sbin所使用的共享库。/lib/modules包含了可加载的内核模块。其余大多数库放在/usr/lib下,而/lib了所有重要的库。 有一个工具fsck(filesystemcheck,文件系统检查)可以找到这些文件,系统管理员可用它检查一个文/MNT(挂接/mnt来由系统管理员用命令mount时加载文件系统。系统上的该包含了cdrom、磁盘和软盘加载点。加载设备时,比如CD-ROM驱动器,CD-ROM中的文件就像在/mnt/cdrom下文/OPT选项 /PROC(进程包 /SBIN系统二进制文件sbin中的一般根用户命令包括gettyinitupdmemkswapswapon和swapoff。用于暂停系统令是:haltreboot和shutdown。文件系统管理实用程序包括fdiskfsckfsck.minixmkfsmkfs.ext2、mkfs.minix、mkfs.msdos和mkfs.vfat。/sbin的网络命令最少,它们ifconng和route。 (临时 了粘滞位,这样只有文f-$的所有者才能从该 /USR(用户/usr是LINUX/UNIX文件系统中最大的一个包含了主机之间可以共享的只读数在多数share、src和tmp。表中给出了这些所含内容的简短说明。 XWindows11版,第6次发布,以及与之相关的文 LINUX/UNIX的源代码和包管理软件的源代码(比如RPM,即RedHatPackage/VAR(变量/var用于放置变量数据(当系统运行时这些数据不断变化)。该数据在若干个子中,其中大多数子的讨论不在本书范围之内。其中一个是/Var/sp00l/mail,它存放着传入邮件。您阅读的新邮件就是该下的一个文件。一旦您阅读完了该邮件,它就会以一个文件的方式被放进您的主,该称为mbox。login_name是登录名,系统通过它了解用户,同时登录名也了用户类型。dummyorencrypted_password字段包含伪x(或。)或的加密版本。如果伪放在文件/etc/passwd中。那0-99之间的数也被保留。userinfo字段包含用户的相关信息,一般是用户全名。home_directory字段包含 系统时,相应于该字段所指定路径名令就会被系统执行。如果冒号是紧连的,意味着该字段缺少字段值,有时user info字段会出现这种情况下面一行来自于我们系统中的文件/etc/passwd,它是描述用户davis的davis:x:134:105:JamesA全名JamesADavis,主 是/home/student/davis,登录s是/bin/bash。 blogRH9i386PC启动的中文叙述:在 LINUX的 s是一个重要的LINUX和UNIX的人机接口,因为早期没有图形用户界面的广泛应用。听起来有点像dos,但是dos是简单的单线程系统,而LINUX如今是一个多进程多用户操作系统。s本身是LINUX上的一个进程,他接收你输入令来执行。即使你不理会你在使用哪种s问题也不大。如果没有特别的说明,幻羽科技的文档中的s都指Bash,因为这是我最常用的一个ss命令和dos命令一样,有内部命令和外部命令,文的系统结构介绍中,已经提到了一些在bin中的外部命令。 看命令的详细说明,请自己看man。下面是man各小节的内容:如当您使用LINUX或UNIX系统时,自然会用编辑器和编译器之类的工具创建一般文件。比如在特定的编译(如使用gcc)并生成可执行二进制代码。您可以通过s对您创建的所有这些文本和二进制文件进如为了系统地组织工作,应该在主下创建一个层次结构,并应很好地。这就需要进的创建移动和删除操作这样就能遍历您的层次,您就能进入一个浏览它的内容LINUX有图形用户界面了,还需要用s命令吗?当然,并不必须用s命令完成这些工作,但是充分的了解s命令,可以使您更加容易驾御LINUX。比如,如果不了解s命令,在自己建立一个交叉编译环境或书写各种配置文件或编辑系统s 的时候,可能会遇到一些。当然,从长远来看,s命令的使用必然减少,如果所有的地方都有友好的GUI了,谁还去越来越多的在GUI上的快速开发工具。文件系统相关令是最常用的,主要有rm(删除文件或树)、rmdir(删除)、mkdir(创建目man自行学习。如果现在你的Linux底几0,对本文以上描述仍有很多困惑,则建议你阅读幻羽写在本文之前的Linux文档,仍然有问题,请去幻羽提问。 格式:apropos$apropos注:类似令有man-k。man-k其实就是执行 在某一特定时间执行指定格式:atV][-q列][-f件][-m]- - - - 子演示了20053112134执行一at$at21:34commandswillbeexecutedusing(inorder)a)$Sb)loginsc)/bin/sh。然后就出现用可以使用at,这是默认配置。在。不管这两个文件是不是存在,root用户都可以执行at命令。 格式:cat[-b][-A][-E][-T][-n][-s][-v]文件- - 相当于-v-E-T(-vET)- - - - - $cat-n od选项文件 增 $oda+rw 格式:chown[-R][-c][用户名][组名]文件 - - 改 下 令演示了如何改变 $chown-Rbugboy 格式:cp文件名标文件- - - 下面令演示了如何把file文件到当前用户的 $cpfile 命令格式:crontab[-uusername][-l][-e][- 辑并保存后文件被当前用户的crontab安装。- - -u 分钟(0- 小时(0-23)日(1-31)月(1-12)星期(0-6)要执行日到星期四晚上23:30分关机。3023**0-4halt- 15 **1-5find$HOME-namecore2>/dev/null|xargsrm-S3023**0-4halt-经正确编辑,保存退出后会得到一条"crontab:installingnewcrontab"的信息。 能使用 格式:df[-t][-x][-k][-p][-a][-- - - - <!--[if!supportLists <!--[endif]-->格式:fdisk-l[-u][device<!--[if!supportLists]-- fdisk-s- - -s 格式:file件 格式:find路径][匹配表-name -user -group - -sizen 号“ncn字符的文件,同样的也有符号“+nc”。-inum -atimen -mtime 类似于atime,但是检查的是文件内容被修改的-ctime -perm -newer -execcommand -ok 的 $find.-name"*.bak"-execrm{}注:这里*.bak成\*.bak - - 格式:kill[-s|p][-a]- - - - 格式:less件 格式:ln[-b][-d][-F][-f][-i][-n][-s][-v]源文 - - - 与b- - - - 用符号代替硬(建立符号)- 格式:ls选项- - - - - 将 格式:more选项件 格式:mount或分区的设备文件- 文件系统类型(fat32- - #mount-tvfat/dev/hda5/mnt/wind-o 格式:mvb][-f][-i][-u][-v]文标文件或- - - - - 格式:oggenc$oggenc 格式:ps选项- - - - - - - - 格式:quotag][-u][-v][-p]户名- - - 格式:renamefromto $rename.rm.rmvb$rename'tr/A-Z/a-z/' 格式:rpm项|软件-- - - - - - --相当于--recepkgs,--repalcefiles,--oldpackage-- -- -- -- --prefix --relocateOLDPATH=NE 软件包软件包-- - - - 平台+后辍构成。比个文件名为bugboy-1.01-1.i386.rpm,那么它的软件包名称是bugboy,版本号是1.0.1,号是1,平台是in386。 格式:rm[-d][-i][-r][-v][-f]文件名 - - - - - 格式:sox[选项from项- - $soxfile1.wav$sox-r10000file1.wav-r5000$soxfile1.wavfile1.voclowp 格式:tail选项件- - - - -- - - - - - - - Acdrtux的一个或多 格式:top-d -p 格式:type$type 磁 格式:useradd选-c -d - -e -f - -kskel_dir 下的文件都被 - - - -ss指定用户的登录s-u 例:#useradd-m-gusers-GWheel,student-s/bin/sh-c"YanDingcheng" 格式:userdel- 文件。下面这条命令删除bugboy用户的所有文件:#find/-userbugboy-execrm{} 例:$whatis 格式:whereis[-bmsu] 名-f]文件- - - - - - - 格式:w[-hsfV][- - - - 格式:who[-i][-u][-- - - 以往在为Linux开发应用程序时,大多数情况下使用的都是C语言,这是古Unix历史决定的因此几乎每一位Linux程序员的首要问题都是如何灵活运用C编译器。目前Linux下最常用的C语言编能够编译用C、C++和ObjectC等语言编写的程序。GCC不仅功能非常强大,结构也异常灵活。最值得称道还是老样子使用,因此我们的讨论以为目标,忽略一些PC领域的进展。开放、自由和灵活是Linux的所在,而这一点在GCC上的体现就是程序员通过它能够更好地编译过程。在使用GCC编编译汇编▲Linux程序员可以根据自己的需要让GCC在编译的任何阶段结束,以便检查或使用编译器在该阶段GCC还对标准的C和C++语言进行了大量的扩展,提高程序的执行效率,有助于编译器进行代码优化,在学习使用GCC之前,下面的这个例子能够帮助用户迅速理解GCC的工作原理,并将其立即运用到实际的项目开发中去。首先用熟悉的编辑器输入1所示的代码:1:o.cintmain(void){printf(" return0;}然后执行下面s命令编译和运行这段程序#gcc o.c-o #./ oworld,Linux从程序员的角度看,只需简单地执行一条GCC命令就可以了,但从编译器的角度来看,却需要完成一系列非常繁杂的工作。首先,GCC需要调用预处理程序cpp,由它负责展开在源文件中定义的宏,并向其中插入"#include"语句所包含的内容;接着,GCC会调用ccl和as将处理后的源代码编译成目标代码;最后,GCC会调用程序ld,把生成的目标代码成一个可执行程序。第一步是进行预编译,使用-E参数可以让GCC在预处理结束后停止编译过程:#gcc- o.c- o.cpp文件中的内容,会发现stdio.h的内容确实都插到文件里去了,而其它应当被预处理 o.i编译为目标代码,这可以通过使用-c参数来完成:#gcc- o.i- GCC默认将.i文件看成是预处理后C语言源代码,因此上述命令将自动跳过预处理步骤而开始执行编译#gcco.o-o为了对它们进行编译,并最终生成可执行程序foo,可以使用下面这条命令:#gccfoo1.cfoo2.c-o#gcc-cfoo1.c-ofoo1.o#gcc-cfoo2.c-ofoo2.o#gccfoo1.ofoo2.o-o在编译一个包含许多源文件的工程时,若只用一条GCC命令来完成编译是非常浪费时间的。假设项目中有100个源文件需要编译,并且每个源文件中都包含10000行代码,如果像上面那样仅用一条GCC命令Make这样的工具。读读2所示的程序,这段代码写得很糟糕,仔细检查一下不难挑出很多毛病:2:illcode.cvoidmain(void){longlongintvar=printf("ItisnotstandardC}GCC是如何帮助程序员来发现这些GCC在编译不符合ANSI/ISOC语言标准的源代码时,如果加上了-pedantic选项,那么使用了扩展语法的地方将产生相应的警告信息:#gcc-pedanticillcode.c-oillcodeillcode.c:Infunction`main':illcode.c:9:ISOC89doesnotsupport`longlong'illcode.c:8:returntypeof`main'isnot`int'需要注意的是,-pedantic编译选项并不能保证被编译程序与ANSI/ISOC标准的完全兼容,它仅仅只能用来帮助Linux程序员离这个目标越来越近。或者换句话说,-pedantic选项能够帮助程序员发现一些不符合ANSI/ISOC标准的代码,但不是全部,事实上只ANSI/ISOC语言标准中要求进行编译器诊断的那些情况,才有可能被GCC发现并提出警告。除了-pedantic之外,GCC还有一些其它编译选项也能够产生有用的警告信息。这些选项大多以-W开头,其中最有价值的当数-Wall了,使用它能够使GCC产生尽可能多的警告信息:#gcc-Wallillcode.c-oillcode.c:8:warning:returntypeof`main'isnot`int'illcode.c:Infunction`main':illcode.c:9:warning:unusedvariable在处理警告方面,另一个常用的编译选项是-Werror,它GCC将所有的警告当成错误进行处理,这在#gcc-Wall-Werrorillcode.c-oillcodecc1:warningsbeingtreatedaserrorsillcode.c:8:warning:returntypeof`main'isnot`int'illcode.c:Infunction`main':illcode.c:9:warning:unusedvariable对Linux程序员来讲,GCC给出的警告信息是很有价值的,它们不仅可以帮助程序员写出更加健壮的程序,而且还是和调试程序的有力工具。建议在用GCC编译源代码时始终带上-Wall选项,并把它逐渐培养在Linux下开发软件时,完全不使用第函数库的情况是比较少见的,通常来讲都需要借助一个或文件(.so或者.a)的集合Linux下的大多数函数都默认将头文件放到/usr/include/下,而库文件则放到/usr/lib/下,但并不是所有的情况都是这样。正因如此,GCC在编译时必须有自己的办法来查找GCC采用搜索的办法来查找所需要的文件,-I选项GCC的头文件搜索路径中添加新的目录。例如,如果在/home/xiaowp/include/下有编译时所需要的头文件,为了让GCC能够顺利地找到它们,就可以使用-I选项:#gccfoo.c-I/home/xiaowp/include-o同样,如果使用了不在标准位置的库文件,那么可以通过-L选项向GCC的库文件搜索路径中添加新的目录。例如,如果在/home/xiaowp/lib/下有时所需要的库文件libfoo.so,为了让GCC能够顺利地找到它,可以使用下面令:#gccfoo.c-L/home/xiaowp/lib-lfoo-o那就是应该以lib三个字母开头,由于所有的库文件都遵循了同样的规范,因此在用-l选项指定的库Linux下的库文件分为两大类分别是动态库(通常以.so结尾)和静态库(通常以.a结尾),两者在时优先使用动态库,只有当动态库不存在时才考虑使用静态库,如果需要的话可以在编译时加上-static选项,强制使用静态库。例如,如果在/home/xiaowp/lib/下有时所需要的库文件libfoo.so和libfoo.a,为了让GCC在时只用到静态库,可以使用下面令:#gccfoo.c-L/home/xiaowp/lib-static-lfoo-o代码优化指的是编译器通过分析源代码,找出其中尚未达到最优的部分,然后对其重新进行组合,C-n中n一的C来n02或。进行的优化类型虽然取决于目标处理器,但一般都会包括线程跳转(ThreadJump)和延迟退栈(Deferred#include<stdio.h>intmain(void){doublecounter;doubleresult;doubletemp;counter<2000.0*2000.0*2000.0/20.0+counter+=(5-1)/{temp=counter/1979;result=counter;}printf("Resultis%lf\n",result);return0;}#gcc-Walloptimize.c-o#timeResultis real0m14.942suser0m14.940ssys0m0.000s#gcc-Wall-Ooptimize.c-o#timeResultis real0m3.256suser0m3.240ssys0m0.000s对比两次执行的输出结果不难看出,程序的性能的确得到了很大幅度的改善,由原来的14秒缩短到了3管GCC的代码优化功能非常强大,但作为一名优秀的Linux程序员,首先还是要力求能够手工编写出高只有到软件或开发结束的时候,才考虑对最终生成的代码进行优化。紧张(如一些实时嵌入式设备),那就不要对代码进行优化,因为由这带来的影响可能会产生非常严进行重组,从而使和调试变得异常。一个功能强大的调试器不仅为程序员提供了程序执行的,而且还可以帮助程序员找到解决默认情况下,GCC在编译时不会将调试符号插入到生成的二进制代码中,因为这样会增加可执行文-g12或3-g)3-g)21-g)关调信,此能用回溯和栈储。溯的监程在行程的试。GCC产生的调试符号具有普遍的适应性,可以被许多调试器加以利用,但如果使用的GDB,那么的调试工作,但缺点是可能导致其它调试器(如DBX)无法进行正常的调试。选项-ggdb能够接受的调试级别和-g是完全一样的,它们对输出的调试符号有着相同的影响。需要注意的是,使用任何一个调试选项都会使最终生成的二进制文件的大小急剧增加,同时增加程#gccoptimize.c-ooptimize#lsoptimize-l-rwxrwxr-x1xiaowpxiaowp11649Nov2008:53optimize未加调试选项)#gcc-goptimize.c-ooptimize#lsoptimize--rwxrwxr-x1xiaowpxiaowp15889Nov2008:54optimize加入调试选项虽然调试选项会增加文件的大小,但事实上Linux中的许多软件在测试版本甚至最终版本中仍然使用4:crash.cintmain(void){intinputscanf("%d",input);printf("Theintegeryouinputis%d\n",input);return0;}#gcc-gcrash.c-ocrash##gdbGNUgdbRedHatLinux(5.3post- GDB提示符GDB已经做好准备进行调试了,现在可以通过run命令让的下运行(gdb)Startingprogram:/home/xiaowp/thesis/gcc/code/crashInputaninteger:10ProgramreceivedsignalSIGSEGV,Segmentationfault. bin_IO_vfscanf_internal()from/lib/libc.so.6仔细分析一GDB给出的输出结果不难看出,程序是由于段错误而导致异常中止的,说明内存操作出了问题,具体发生问题的地方是在调用_IO_vfscanf_internal()的时候。为了得到更加有价值的信息,可以使用GDB提供的回溯命令backtrace,执行结果如下:(gdb)#00x bin_IO_vfscanf_internal()from/lib/libc.so.6#10xbffff0c0in??()#20x4008e0bainscanf()from/lib/libc.so.6#30x inmain()atcrash.c:11#4 in_libc_start_main()from跳过输出结果中的前面三行,从输出结果的第四行中不难看出,GDB已经将错误定位到crash.c中的(gdb)frame#30x inmain()atcrash.c:1111scanf("%d",input);(gdb)#gcc-save-tempsfoo.c-ofoo#lsfoo*foofoo.cfoo.iGCC支持的其它调试选项还包括-p和-pg,它们会将剖析(Profiling)信息加入到最终生成的二进制代码时加入-p选项会在生成的代码中加入通用剖析工具(Prof)能够识别的统计信息,而-pg选项则生成只有GNU剖析工具(Gprof)才能识别的统计信息。提醒一点,虽GCC允许在优化的同时加入调试符号信息,但优化后的代码对于调试本身而言将是一个很大

温馨提示

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

评论

0/150

提交评论