第五章Linux编程新修改教学教材_第1页
第五章Linux编程新修改教学教材_第2页
第五章Linux编程新修改教学教材_第3页
第五章Linux编程新修改教学教材_第4页
第五章Linux编程新修改教学教材_第5页
已阅读5页,还剩105页未读 继续免费阅读

下载本文档

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

文档简介

第5章Linux编程基础5.1开发环境的建立5.2Linux常用命令5.3Shell程序设计5.4Vi编辑器开发环境的建立进行项目开发前,首先要做的是搭建一套基于Linux操作系统的应用开发环境,一般由目标板和宿主机所构成。目标板用于运行操作系统和系统应用软件,而目标板所用到的操作系统的内核编译、应用程序的开发和调试则需要通过宿主机来完成。开发环境对硬件没有特殊的要求,但是为了双方之间建立连接关系,关键的接口包括串口、以太网口和USB口等是必不可少的。传统的嵌入式开发环境需要单片机的仿真器,包含C语言、汇编语言、调试工具等的集成开发环境IDE和实时操作系统等,整个开发系统建立起来至少需要几万元。由于Flash技术的发展,特别是一些CPU可以用JTAG接口下载调试,故仿真器已可以省去。

个人用Linux开发嵌入式应用程序,可以在自己的PC机上安装一套Linux操作系统,使用Linux中的XWindows打开若干个窗口用于编译、下载、调试等。如果整个研发小组由多名工程师组成,常采用的办法是:用1台PC机运行Linux作为服务器;开发小组中每个成员都通过局域网用Telnet登录到这台Linux服务器上去;被开发的目标板也挂在网上。在服务器的Linux环境下,各个工程师用GNUgcc编译生成目标代码,再用FTP传回到自己的PC机上,然后通过串行口或网络下载到目标机上。Linux常用命令shell是一种命令行解释程序(Command-LanguageInterpreter),负责用户和操作系统的沟通。在终端方式的shell提示窗口如图4.1所示。图4.1shell提示窗口进入与退出命令1.进入系统Linux是多用户操作系统,它允许多个用户同时使用一台计算机,这是它与MicrosoftWindows的最大区别之一,因此Linux有比MicrosoftWindows严格得多的用户管理。在字符终端界面环境下,终端屏幕上出现如下登录提示行:

login:在它的后面输入自己的登录名。如果是新用户,那么要与系统管理员联系,取得一个合法的登录名。输入登录名、并按【Enter】键后,在屏幕上出现

Password:要求在其后输入口令。输入的口令字符串并不在屏幕上显示,以利于保密。输入完口令并按【Enter】键后,系统就对登录名和口令进行验证。如果确认无误,则在屏幕上显示若干行信息,最后一行出现:$_$是一般用户的shell提示符,其后是闪烁的光标条(root用户的提示符是“#”)。2.退出系统当完成工作后,需要从系统中退出。退出系统的过程很简单,在$提示符出现后,输入logout命令,然后按下【Enter】键或同时按下【Ctrl】和【D】键,屏幕上会再次出现

login:表示已经从系统中退出。如果想再次进入系统,必须重新登录。系统询问命令1.询问当前日期和时间的date命令例如$date。2.询问当前用户的who命令who命令可列出当前每一个处在系统中的用户的登录名、终端名和登录进入时间。3.显示当前目录路径名的pwd命令文件操作命令Linux命令行的一般格式为命令名[选择项][参数]1.登录和退出Linux启动后,给出login命令,等待用户登录。Login:<输入用户名>Password:<输入密码>使用logout命令退出外壳。2.更改账号密码使用passwd命令来设置新用户的口令。在设置口令之后,账号即能正常工作。语法:passwdOldpassword:<输入旧密码>Newpassword:<输入新密码(最好为6~8字,英文字母与数字混合)>Retypenewpassword:<再输入一次密码>3.联机帮助系统上几乎每条命令都带有相关的Manpage。在有困难时,可以立刻找到文件。语法:man命令例如,如果使用ls命令时遇到困难,可以输入:manls4.远程登录用来连接到其他机器执行工作。在Linux上,由于对TCP/IP协议的完全支持,用户可以很容易的从Linux主机连接其他的计算机系统。语法:rlogin主机名[-l用户名]

例如:

rlogindoc-luser使用user账号登录到工作站doc中。语法:telnet主机名或telnetIP地址例如:

telnet515.列出文件或目录语法:ls[-atFlgR][name]其中name是文件名或目录名。ls命令用来浏览文件与目录,对于每个目录,该命令将列出其中所有的子目录与文件。6.改变工作目录语法:cd[name]其中name是目录名、路径或目录缩写。cd除了有切换目录的功能外,还有一个功能就是,不管在哪个目录内,只要输入cd命令,不加任何参数,即可回到用户目录内。7.复制文件语法:cp[-r]源地址目的地址带目录的拷贝,相当于DOS内的xcopy。8.移动或更改文件、目录名称语法:mv源地址目的地址可以为文件或目录改名,也可以将文件由一个目录移入另一个目录。9.建立新目录语法:mkdir目录名10.删除目录语法:rmdir目录名或rm目录名11.删除文件语法:rm文件名12.列出当前所在的目录位置语法:pwd13.查看文件内容语法:cat文件名14.分页查看文件内容语法:more文件名或cat文件名|more15.查看目录所占磁盘容量语法:du[-s]目录16.文件传输(1)拷贝文件或目录至远程工作站。语法:rcp[-r]源地址目的主机名:目的地址。(2)自远程工作站拷贝文件或目录。语法:rcp[-r]源主机名:源地址目的地址。(3)本地工作站与远程工作站之间的文件传输,必须拥有远程工作站的账号及密码,才可进行传输工作。语法:ftp主机名或ftpip地址。17.文件权限的设定(1)改变文件或目录的读、写、执行权限。语法:chmod[-R]modenamename:文件名或目录名。mode:3位8进制数字或rwx的组合。r-read(读),w–write(写),x–execute(执行),u–user(当前用户),g-group(组),o-other(其他用户)。(2)改变文件或目录的所有权。语法:chown[-R]用户名name18.检查自己所属的工作组名称语法:groups19.改变文件或目录工作组所有权语法:chgrp[-R]工作组名name20.改变文件或目录的最后修改时间语法:touchname21.文件的链接同一文件,可拥有一个以上的名称,也就是把一个文件进行链接。语法:ln老文件名新文件名22.文件中字符串的查找语法:grepstringfile23.查寻文件或命令的路径语法:whereiscommand显示命令的路径。语法:whichcommand显示命令的路径,及使用者所定义的别名。语法:whatiscommand显示命令功能的摘要。语法:findsearch-path-namefilename-print搜寻指定路径下某文件的路径。24.比较文件或目录的内容语法:diff[-r]name1name225.文件打印输出用户可用.login文件中的setenvPRINTER命令来设定打印机名。26.一般文件的打印语法:lpr[-P打印机名]文件名27.ptroff文件的打印语法:ptroff[-P打印机名][-man][-ms]文件名28.打印机控制命令(1)检查打印机状态、打印作业顺序号和用户名。语法:lpq[-P打印机名](2)删除打印机内的打印作业(用户仅可删除自己的打印作业)。语法:lprm[-P打印机名]用户名或作业编号29.进程控制(1)查看系统中的进程。语法:ps[-aux](2)结束或终止进程。语法:kill[-9]PIDPID:利用ps命令所查出的进程号。(3)在后台执行进程的方式。语法:命令&(4)查看正在后台中执行的进程。语法:jobs(5)结束或终止后台中的进程。语法:kill%nn:利用jobs命令查看出的后台作业号30.外壳变量(1)查看外壳变量的设定值。语法:set查看所有外壳变量的设定值。语法:echo$变量名显示指定的外壳变量的设定值。(2)设定外壳变量。语法:setvar=value(3)删除外壳变量。语法:unsetvar31.环境变量(1)查看环境变量的设定值。语法:setenv查看所有环境变量的设定值。语法:echo$NAME显示指定的环境变量NAME的设定值。(2)设定环境变量。语法:setenvNAMEword(3)删除环境变量。语法:unsetenvNAME32.别名(1)查看所定义的命令的别名语法:alias查看自己目前定义的所有命令,以及所对应的别名。语法:aliasname查看指定的name命令的别名。(2)定义命令的别名。语法:aliasname'commandline'(3)删除所定义的别名。语法:unaliasname33.历史命令(1)设定命令记录表的长度。语法:sethistory=n(2)查看命令记录表的内容。语法:history(3)使用命令记录表。语法:!!重复执行前一个命令。语法:!nn:命令记录表的命令编号。语法:!string重复前面执行过的以string为起始字符串的命令。(4)显示前一个命令的内容。语法:!!:p(5)更改前一个命令的内容并执行。语法:^oldstring^newstring将前一个命令中oldstring的部分改成newstring并执行。34.文件的压缩(1)压缩文件。语法:compress文件名压缩文件语法:compressdir目录名压缩目录(2)解压缩文件。语法:uncompress文件名解压缩文件语法:uncompressdir目录名解压缩目录35.管道命令的使用语法:命令1|命令2将命令1的执行结果送到命令2,作为命令2的输入。36.输入/输出控制(1)标准输入的控制。语法:命令<文件文件作为命令的输入。例如:mail-s"mailtest"weisongzhou@<file1将文件file1当做信件的内容,主题名称为mailtest,送给收信人。(2)标准输出的控制。语法:命令>文件将命令的执行结果送至指定的文件中。例如:ls-l>list将执行“ls-l”命令的结果写入文件list中。37.查看系统中的用户语法:who或finger语法:w语法:finger用户名或finger用户名@域名38.改变用户名语法:su用户名例如:suuser进入用户user的账号,passwrod:<输入用户user的密码>39.查看用户名语法:whoami查看登录时的用户名。语法:whoami查看当前的用户名。若已执行过su命令,则显示出此用户的用户名。40.检查远程系统是否正常语法:ping主机名或pingIP地址例如:pingdocShell程序设计Shell是Linux系统中的一个重要的层次,它是用户与系统交互作用的界面。Shell除了作为命令解释程序以外,还是一种高级程序设计语言。利用Shell程序设计语言可以编写出功能很强、但代码简单的程序。Shell概述1.Shell的特点和主要版本在Linux系统中通常提供多种不同的Shell,常用的有Bourneshell(简称sh)、C-shell(简称csh)、Kornshell(简称ksh)和BourneAgainshell(简称bash)。bash是Linux中一个默认的shell,本节主要介绍bash。2.Shell程序示例Shell程序也可存放在文件上,下面是两个shell程序示例。【例4.1】由3条简单命令组成的shell程序(文件名为ex1)。datepwdcd..3.Shell过程的建立和执行称作Shell文件或者Shell脚本(Shellscript)。建立Shell过程的步骤同建立普通文本文件相同,利用编辑器(如vi或gedit)进行程序录入和编辑加工。执行Shell过程的方式主要有以下3种。(1)输入定向到Shell过程(2)以过程名作为参数(3)将Shell过程改为可执行文件Shell变量Shell有两种变量:环境变量和临时变量。环境变量是永久性变量,其值不会随Shell过程执行结束而消失。而临时变量是在Shell程序内部定义的,其使用范围仅限于定义它的程序,出了本程序就不能再用它;而且当程序执行完毕,它的值也就不存在了。在Shell过程中临时变量又分为两类:用户定义的变量和位置参数。1.用户定义的变量定义变量并赋值的一般形式是变量名=字符串例如,myfile=/home/lcd/ff/m1.c。2.输入/输出命令(1)read命令可以利用read命令由标准输入读取数据,然后赋给指定的变量。其一般格式是

read变量1[变量2…](2)echo命令在前面例子中已使用过echo命令,它将其后的参数在标准输出上输出。各参数间以空格隔开,以换行符终止。Shell中的特殊字符Shell中除使用普通字符外,还使用了一些特殊字符,它们有特定的含义,在使用时应注意它们表示的意义和作用范围。1.通配符通配符用于模式匹配,如文件名匹配、路径名搜索、字符串查找等。2.引号在Shell中引号分为2种:单引号、双引号。(1)双引号由双引号括起来的字符,除$、倒引号和反斜线(\)仍保留其特殊功能外,其余字符通常作为普通字符对待。(2)单引号由单引号括起来的字符都作为普通字符出现。3.输入输出重定向符执行一个Shell命令时通常会自动打开3个标准文件,这就是:标准输入文件(stdin),通常对应终端的键盘;标准输出文件(stdout)和标准出错输出文件(stderr),这两个文件都对应终端的屏幕。在Shell中,这3个文件都可以通过重新定向符进行重新定向。(1)输入重定向符输入重定向符“<”的作用是把命令(或可执行程序)的标准输入重新定向到指定文件。(2)输出重定向符输出重定向符“>”的作用是把命令(或可执行程序)的标准输出重定向到指定文件。这样,该命令的输出就不在屏幕上显示,而是写入指定文件中。例如,$who>abc命令who的输出重新定向到abc文件中,在屏幕上看不到执行who的结果。4.注释、管道线和后台命令(1)注释如前所述,Shell程序中以#开头的正文行表示注释。(2)管道线在Linux系统中管道线是由竖杠(|)隔开的若干个命令组成的序列,例如,

ls–l$HOME|wc−l在管道线中,每个命令运行时都有一个独立的进程。前一个命令的输出正是下一个命令的输入。而管道线中有一类命令也称作“过滤器”,过滤器首先读取输入,然后将输入以某种简单方式进行变换(相当于过滤),再将处理结果输出,例如grep、tail、sort和wc等命令就称为过滤器。一个管道线中可以包括多条命令,例如,

ls|grepm?.c|wc–l打印出当前目录文件名是以m打头、后随一个字符的所有C文件的数目。(3)后台命令通常,在主提示符之后输入的命令都立即得到执行。在执行过程中,用户和系统可以发生交互作用—用户输入数据,系统进行处理,并输出运行结果。这种工作方式就是前台方式。但是有些程序的运行要花费较长时间,如调用C编译对C程序进行编译。如果想在编译的同时做别的事情,那么就输入命令$ccm1.c&即在一条命令的最后输入“&”符号,Shell就在后台启动该程序,并且马上显示主提示符,提醒输入新的命令。Linux编程基础Linux软件开发一直在Internet环境下讲行。这个环境是全球性的,编程人员来自世界各地。只要能够访问Web站点,就可以启动一个以Linux为基础的软件项目。Linux开发工作经常是在Linux用户决定共同完成一个项目时开始的。当开发工作完成后,该软件就被放到Internet站点上,任何用户都可以访问和下载它。由于这个活跃的开发环境,新的以Linux为基础的软件功能日益强大,而且呈现爆炸式的增长态势。大多数Linux软件是经过自由软件基金会(FreeSoftwareFoundation)提供的GNU(GNU即GNU’snotUNIX)公开认证授权的,因而通常被称作GNU软件。GNU软件免费提供给用户使用,并被证明是非常可靠和高效的。许多流行的Linux实用程序如C编译器、shell和编辑器都是GNU软件应用程序。

Linux程序需要首先转化为低级机器语言即所谓的二进制代码以后,才能被操作系统执行。例如编程时,先用普通的编程语言生成一系列指令,这些指令可被翻译为适当的可执行应用程序的二进制代码。这个翻译过程可由解释器一步步来完成,或者也可以立即由编译器明确地完成。交叉编译环境的建立

交叉编译就是在一个平台上生成可以在另一个平台上执行的代码。在宿主机上对即将运行在目标机上的应用程序进行编译,生成可在目标机上运行的代码格式。交叉编译环境是一个由编译器、连接器和解释器组成的综合开发环境。交叉编译工具主要包括针对目标系统的编译器gcc、目标系统的二进制工具binutils、目标系统的标准c库glibc和目标系统的Linux内核头文件。在建立交叉编译环境之前,首先需要下载包括binutils、gcc、glibc及Linux内核在内的源代码,尽量选用较新版本,glibc和内核源代码的版本必须与目标机上实际使用的版本保持一致,并设定shell变量PREFIX指定可执行程序的安装路径。(1)编译binutils。运行configure文件,并使用--prefix=$PREFIX参数指定安装路径,使用--target=arm-linux参数指定目标机类型,然后执行makeinstall。(2)配置Linux内核头文件。执行makemrproper进行清理工作,然后执行makeconfigARCH=arm(或makemenuconfig/xconfigARCH=arm)进行配置。(3)第一次编译gcc。configure的运行参数设置:--prefix=$PREFIX--target=arm-linux--disable-threads--disable-shared--enable-languages=c执行makeinstall,将生成一个最简单的gcc。由于编译整个gcc是需要目标机的glibc库的,它现在还不存在,因此需要首先生成一个最简单的gcc,它只需要具备编译目标机glibc库的能力即可。(4)交叉编译glibc。由于这一步骤生成的代码是针对目标机cpu的,因此它属于一个交叉编译过程。又因为该过程要用到Linux内核头文件,默认路径为$PREFIX/arm-linux/sys-linux,因而需要在$PREFIX/arm-linux中建立一个名为sys-linux的软连接,使其指向内核头文件所在的include目录;也可以在接下来要执行的configure命令中使用--with-headers参数指定linux内核头文件的实际路径。

configure的运行参数设置如下,因为是交叉编译,所以要将编译器变量CC设为arm-linux-gcc:

CC=arm-linux-gcc./configure--prefix=$PREFIX/arm-linux--host=arm-linux--enable-add-ons

最后,按以上配置执行configure和makeinstall,glibc的交叉编译过程就算完成了,这里需要指出的是,glibc的安装路径设置为$PREFIXARCH=arm/arm-linux,如果此处设置不当,第二次编译gcc时可能找不到glibc的头文件和库。(5)第二次编译gcc。运行configure,参数设置为--prefix=$PREFIX--target=arm-linux--enable-languages=c,c++。运行makeinstall。到此为止整个交叉编译环境就完全生成了。

交叉编译工具做完后,简单验证一下。首先用文字输入软件建立一个helloworld.c文件:#include

<stdio.h>int

main(void){

printf("hello

world\n");

return

0;}然后在命令行执行:$arm-linux-gcc

helloworld.c

-o

helloworld$file

helloworld如果输出以下信息,说明成功建立了编译工具。helloworld:

ELF

32-bit

LSB

executable,

ARM,

version

1,

dynamically

linked

(uses

shared

libs),

not

strippedLinux及开发工具的使用

GNU提供的编译工具包括汇编器as、C编译器gcc、C++编译器g++、链接器ld和二进制转换工具objcopy。基于ARM平台的工具分别为arm-linux-as、arm-linux-gcc、arm-linux-g++、arm-linux-ld和arm-linux-objcopy。GNU的所有开发工具都可以从上下载,基于ARM的工具可以从获得。GNU工具的开发流程如下:编写C、C++语言或汇编源程序,用gcc或g++生成目标文件,编写链接脚本文件,用链接器生成最终目标文件(elf格式),用二进制转换工具生成可下载的二进制代码。

Linux下的GNU调试工具主要是gdb、gdbserver和kgdb。其中gdb和gdbserver可完成对目标板上Linux应用程序的远程调试。gdbserver是一个很小的应用程序,运行于目标板上,可监控被调试进程的运行,并通过串口与上位机上的gdb通信。开发者可以通过上位机的gdb输入命令,控制目标板上进程的运行,查看内存和寄存器的内容。

gdb5.1.1以后的版本加入了对ARM处理器的支持,在初始化时加入-target==arm参数可直接生成基于ARM平台的gdbserver。gdb工具可以从/pub/gnu/gdb/上下载gcc编译器的使用

gcc最基本的用法是:gcc[options]file...其中的option是以“-”开始的各种选项,file是相关的文件名。在使用gcc的时候,必须要给出必要的选项和文件名。gcc的整个编译过程分别是:预处理,编译,汇编和链接。gcc编译器几个最常用的选项:

-o表示要求编译器生成指定文件名的可执行文件;

-c表示只要求编译器进行编译,而不要进行链接,生成以源文件的文件名命名但把其后缀由.c或.cc变成.o的目标文件;

-g要求编译器在编译的时候提供以后对程序进行调试的信息;

-E表示编译器对源文件只进行预处理就停止,而不做编译、汇编和链接;

-S表示编译器只进行编译,而不做汇编和链接;

-O是编译器对程序提供的编译优化选项,在编译的时候使用该选项,可以使生成的执行文件的执行效率提高;

-Wall指定产生全部的警告信息。$gcc-ohellohello.cgcc编译器就会生成一个hello的可执行文件。在hello.c的当前目录下执行./hello就可以看到程序的输出结果,在屏幕上打印出“Hellotheworld”的字符串来。GNU编译器生成的目标文件默认格式为elf(executivelinkedfile)格式,这是Linux系统所采用的可执行链接文件的通用文件格式。elf格式由若干个段(section)组成,如果没有特别指明,由标准c源代码生成的目标文件中包含以下段:

.text(正文段)包含程序的指令代码,

.data(数据段)包含固定的数据,如常量,字符串等,

.bss(未初始化数据段)包含未初始化的变量和数组等。Makefile文件和Make命令

Makefile文件描述了目标文件之间的依赖关系,以及指定编译过程中使用的工具。一个工程中的源文件按其类型、功能、模块分别放在若干个目录中。Makefile定义了一系列的规则来指定,哪些文件需要先编译,哪些文件需要后编译,哪些文件需要重新编译。Makefile就像一个Shell脚本一样,其中也可以执行操作系统的命令。Makefile带来的好处就是“自动化编译”,一旦写好,只需要一个Make命令,整个工程完全自动编译,极大地提高了软件开发的效率。

Makefile的作用是根据配置的情况,构造出需要编译的源文件列表,然后分别编译,并把目标代码链接到一起,最终形成可执行的二进制文件。

Makefile中一般包含如下内容:

需要由make工具创建的项目,通常是目标(target)文件和可执行文件。

要创建的项目依赖于哪些文件。

创建每个项目时需要运行的命令。

例如:

example.o:example.cexample.hg++-c-gexample.c

从上面的例子可以看出,第一行指定example.o为目标,并且依赖于example.c和example.h文件。随后的行指定了如何从目标所依赖的文件建立目标。当example.c或example.h文件在编译之后又被修改,则make工具可自动重新编译example.o,如果在前后两次编译之间,example.c和example.h均没有被修改,而且example.o还存在的话,就没有必要重新编译。1.Makefile中的变量顶层Makefile定义并向环境中输出了许多变量,为各个子目录下的Makefile传递一些信息。有些变量,比如,SUBDIRS,不仅在顶层Makefile中定义并且赋初值,而且在arch/arm/Makefile还做了扩充。常用的变量有以下几类:

版本信息版本信息有VERSION、PATCHLEVEL、SUBLEVEL、EXTRAVERSION和KERNELRELEASE等变量,用来定义当前内核的版本。比如,VERSION=2,PATCHLEVEL=4,SUBLEVEL=18,EXTRAVERSION=-rmk7,共同构成内核的发行版本KERNELRELEASE:2.4.18-rmk7。

CPU体系结构:ARCH在顶层Makefile的开头,用ARCH定义目标CPU的体系结构,比如,ARCH:=arm。许多子目录的Makefile中,要根据ARCH的定义选择编译源文件的列表。

路径信息:TOPDIR和SUBDIRSTOPDIR定义了Linux内核源代码所在的根目录。SUBDIRS定义了一个目录列表,在编译内核或模块时,顶层Makefile就是根据SUBDIRS来决定进入哪些子目录。SUBDIRS的值取决于内核的配置。

内核组成信息:HEAD,CORE_FILES,NETWORKS,DRIVERS,LIBS。Linux内核文件vmlinux是由以下规则产生的:vmlinux:$(CONFIGURATION)init/main.oinit/version.olinuxsubdirs$(LD)$(LINKFLAGS)$(HEAD)init/main.oinit/version.o\--start-group\$(CORE_FILES)\$(DRIVERS)\$(NETWORKS)\$(LIBS)\--end-group\-ovmlinux

编译信息:CPP,CC,AS,LD,AR,CFLAGS,LINKFLAGS在Rules.make中定义的是编译的通用规则,具体到特定的场合,需要明确给出编译环境,编译环境就是在以上的变量中定义的。针对交叉编译的要求,定义了CROSS_COMPILE。比如:CROSS_COMPILE

=

arm-linux-CC

=

$(CROSS_COMPILE)gccLD

=

$(CROSS_COMPILE)ld由于CROSS_COMPILE定义了交叉编译器前缀arm-linux-,表明所有的交叉编译工具都是以arm-linux-开头的,所以在各个交叉编译器工具之前,都加入了$(CROSS_COMPILE),以组成一个完整的交叉编译工具文件名,比如,arm-linux-gcc。

配置变量CONFIG_*.config文件中有许多的配置变量等式,用来说明用户配置的结果。例如,CONFIG_MODULES=y表明用户选择了Linux内核的模块功能。.config被顶层Makefile包含后,就形成许多的配置变量,每个配置变量具有确定的值:y表示本编译选项对应的内核代码被静态编译进Linux内核;m表示本编译选项对应的内核代码被编译成模块;n表示不选择此编译选项;如果没有赋值,那么配置变量的值为空。2.Rules.make变量Rules.make定义了所有Makefile共用的编译规则。Linux把共用的编译规则统一放置到Rules.make中,并在各自的Makefile中通过语句“includeRules.make”包含Rules.make。这样就避免了在多个Makefile中重复同样的规则。Rules.make文件定义了许多变量,最为重要的是编译、链接列表变量。

O_OBJS、L_OBJS、OX_OBJS和LX_OBJS:这些变量代表的是本级目录下需要编译进Linux内核vmlinux的目标文件列表,其中OX_OBJS和LX_OBJS中的“X”表明目标文件使用了EXPORT_SYMBOL输出符号。

M_OBJS和MX_OBJS:定义本级目录下需要被编译成可装载模块的目标文件列表。同样,MX_OBJS中的“X”表明目标文件使用了EXPORT_SYMBOL输出符号。

O_TARGET和L_TARGET:每个子目录下都有一个O_TARGET或L_TARGET,Rules.make首先从源代码编译生成O_OBJS和OX_OBJS中所有的目标文件,然后使用$(LD)-r把它们链接成一个O_TARGET或L_TARGET。O_TARGET以.o结尾,而L_TARGET以.a结尾。3.子目录Makefile子目录Makefile用来控制本级目录下源代码的编译规则。#

Makefile

for

the

linux

kernel.#

All

of

the

(potential)

objects

that

export

symbols.#

This

list

comes

from

'grep

-l

EXPORT_SYMBOL

*.[hc]'.export-objs

:=

tc.o#

Object

file

lists.obj-y

:=obj-m

:=obj-n

:=obj-

:=obj-$(CONFIG_TC)

+=

tc.oobj-$(CONFIG_ZS)

+=

zs.oobj-$(CONFIG_VT)

+=

lk201.o

lk201-map.o

lk201-remap.o#

Files

that

are

both

resident

and

modular:

remove

from

modular.obj-m

:=

$(filter-out

$(obj-y),

$(obj-m))#

Translate

to

Rules.make

lists.L_TARGET

:=

tc.aL_OBJS

:=

$(sort

$(filter-out

$(export-objs),

$(obj-y)))LX_OBJS

:=

$(sort

$(filter

$(export-objs),

$(obj-y)))M_OBJS

:=

$(sort

$(filter-out

$(export-objs),

$(obj-m)))MX_OBJS

:=

$(sort

$(filter

$(export-objs),

$(obj-m)))include

$(TOPDIR)/Rules.make4.makemake是一个命令工具,是一个解释Makefile中指令的命令工具。一般来说,大多数的IDE都有这个命令,比如:Delphi的make,VisualC++的nmake,以及Linux下GNU的make。make命令执行时,需要一个Makefile文件,以告诉make命令怎么去编译和链接程序。一般来说,最简单的就是直接在命令行下输入make命令,make命令会找当前目录的Makefile来执行,一切都是自动的。GNU的make工作时的执行步骤入下:(1)读入所有的Makefile。(2)读入被include的其他Makefile。(3)初始化文件中的变量。(4)推导隐含规则,并分析所有规则。(5)为所有的目标文件创建依赖关系链。(6)根据依赖关系,决定哪些目标要重新生成。(7)执行生成命令。

1~5步为第一个阶段,6~7步为第二个阶段。第一个阶段中,如果定义的变量被使用了,那么,make会把其展开在使用的位置。但make并不会完全马上展开,make使用的是拖延战术,如果变量出现在依赖关系的规则中,那么仅当这条依赖关系被决定要使用了,变量才会在其内部展开。配置文件在Linux内核中,配置命令有多种方式:Make configMake oldconfig

scripts/Configure

Make menuconfig

scripts/Menuconfig

Make xconfig

scripts/tkparse

以字符界面配置(makeconfig)为例,顶层Makefile调用scripts/Configure,按照arch/arm/config.in来进行配置。命令执行完后产生文件.config,其中保存着配置信息。下一次再做makeconfig将产生新的.config文件,原.config被改名为.config.old。下面对配置文件所支持的配置语句做简要的说明。1.顶层菜单mainmenu_name

/prompt/

/prompt/

其中/prompt/是一串提示符,mainmenu_name设置最高层菜单的名字,只在makexconfig时才会显示。2.询问语句bool

/prompt/

/symbol/hex

/prompt/

/symbol/

/word/int

/prompt/

/symbol/

/word/string

/prompt/

/symbol/

/word/tristate

/prompt/

/symbol/询问语句首先显示一串提示符/prompt/,等待用户输入,并把输入的结果赋给/symbol/所代表的配置变量。不同的询问语句的区别在于它们接受的输入数据类型不同,比如,bool接受布尔类型(y或n),hex接受16进制数据。有些询问语句还有第三个参数/word/,用来给出默认值。

3.定义语句define_bool

/symbol/

/word/define_hex

/symbol/

/word/define_int

/symbol/

/word/define_string

/symbol/

/word/define_tristate

/symbol/

/word/不同于询问语句的等待用户输入,定义语句显式的给配置变量/symbol/赋值/word/。4.依赖语句dep_bool

/prompt/

/symbol/

/dep/

...dep_mbool

/prompt/

/symbol/

/dep/

...dep_hex

/prompt/

/symbol/

/word/

/dep/

...dep_int

/prompt/

/symbol/

/word/

/dep/

...dep_string

/prompt/

/symbol/

/word/

/dep/

...dep_tristate

/prompt/

/symbol/

/dep/

...

与询问语句类似,依赖语句也是定义新的配置变量。不同的是,配置变量/symbol/的取值将依赖于配置变量列表/dep/…。这就意味着,被定义的配置变量所对应功能的取舍取决于依赖列表所对应功能的选择。5.选择语句choice

/prompt/

/word/

/word/choice语句首先给出一串选择列表,供用户选择其中一种。比如,LinuxforARM支持多种基于ARM核的CPU,Linux使用choice语句提供一个CPU列表,供用户选择:choice

‘ARM

system

type’

\"Anakin

CONFIG_ARCH_ANAKIN

\……SA1100-based

CONFIG_ARCH_SA1100

6.if语句if

[

/expr/

]

then/statement/

...

fi

if

[

/expr/

]

then

/statement/

...

else

/statement/

...

fi

if语句对配置变量进行判断,并做出不同的处理。判断条件/expr/可以是单个配置变量或字符串,也可以是带操作符的表达式。操作符有:=,!=,-o,-a等。7.菜单块(menublock)语句mainmenu_option

next_commentcomment

'…endmenu8.Source语句source

/word//word/是文件名,source的作用是调入新的文件。Vi编辑器的使用

1.工作模式Vi是“Visualinterface”的简称,可以执行输出、删除、查找、替换、块操作等众多文本操作,而且用户可以根据自己的需要对其进行定制。Vi有三种基本工作模式:命令行模式、文本输入模式和末行模式。

命令行模式任何时候,不管用户处于何种模式,只要按一下键,即可使Vi进入命令行模式;我们在shell环境(提示符为$)下输入启动命令“vi”,进入编辑器时,也是处于该模式下。在该模式下,用户可以输入各种合法的Vi命令,用于管理自己的文档。此时从键盘上输入的任何字符都被当做编辑命令来解释,若输入的字符是合法的Vi命令,则Vi在接受用户命令之后完成相应的动作。但需注意的是,所输入的命令并不在屏幕上显示出来。若输入的字符不是Vi的合法命令,Vi会响铃报警。

文本输入模式

在命令模式下输入插入命令i、附加命令a、打开命令o、修改命令c、取代命令r或替换命令s都可以进入文本输入模式。在该模式下,用户输入的任何字符都被Vi当做文件内容保存起来,并将其显示在屏幕上。在文本输入过程中,若想回到命令模式下,按Esc键即可。

末行模式

在命令模式下,用户按“:”键即可进入末行模式下,此时Vi会在显示窗口的最后一行,显示一个“:”作为末行模式的提示符,等待用户输入命令。多数文件管理命令都是在此模式下执行的。末行命令执行完后,Vi自动回到命令模式。2.进入在提示符“$”后键入Vi和想要编辑的文件名,便可进入Vi。例如:$

vi

example.c如果只键入Vi,而不带文件名,也可以进入Vi,之后在光标处键入文件内容。进入Vi后,首先进入的就是命令模式,进入Vi时,用户不仅可以指定一个待编辑的文件名,而且还有许多附加操作。如果希望在进入Vi之后,光标处于文件中特定的某行上,可在Vi后加上选项+n,其中n为指定的行数。例如:$

vi

+5

example1.c3.退出在命令模式中,连按两次大写字母Z,若当前编辑的文件曾被修改过,则Vi保存该文件后退出,返回到shell;若当前编辑的文件没被修改过,则Vi直接退出,返回到shell。在末行模式下,输入命令:

:wVi保存当前编辑文件,但并不退出,而是继续等待用户输入命令。在使

w命令时,可以再给编辑文件起一个新的文件名。

:w

newfile

此时Vi将把当前文件的内容保存到指定的newfile中,而原有文件保持不变。

在末行模式下,输入命令:

:q

系统退出Vi返回到shell。若在用此命令退出Vi时,编辑文件没有被保存,则Vi在显示窗口的最末行显示如下信息:

No

write

since

last

change

(use

!

to

overrides)提示用户该文件被修改后没有保存,然后Vi并不退出,继续等待用户命令。若用户就是不想保存被修改后的文件而要强行退出Vi时,可使用命令:

:q!应用程序的调试在开发环境和操作系统建立后,就可以开始应用程序的开发了。应用程序的开发一般先在宿主机上调试完成,然后下载到目标板。为保证正常下载,必须建立可靠的连接。建立连接应用程序的调试是在保证宿主机与目标机正确连接的基础上进行的,连接的方式主要有串口连接、网络连接和JTAG口连接等方式。1.串口连接在Linux下以root身份运行Minicom,加-s选项配置Minicom,如图所示。然后从菜单中选择SerialPortSetup,按回车键,进入如图所示的界面。此时按“A”以设置“SerialDevice”。如果使用串口1,则输入/dev/ttyS0。如果使用串口2,则输入/dev/ttyS1。

按“E”键进入设置“bps/par/Bits”(波特率)界面,如图所示。再按“I”以设置波特率为115200。然后按回车退回到上一级菜单,按“F”键设置“HardwareFlowControl”为“NO”,其他选项使用默认值。设置完成后,按回车键返回到串口设置主菜单,选择“Savesetupasdfl”,按回车键保存刚才的设置,如图所示。再选择“Exit”退出设置模式。刚才的设置被保存到“/etc/minirc.dfl”。设置完毕,如果此时启动目标板,就会看到vivi的启动信息,当Linux启动以后,Minicom就相当于虚拟终端,就能通过它来操作目标板了。要退出Minicom,同时按下“Ctrl+A”键,松开后紧接着再按下“Q”键,在跳出的窗口中,选择“Yes”即可。Minicom设置好后就可以用来下载程序了。2.网络连接文件传输协议(FileTransferProtocol,FTP)是一种广泛应用的协议,是通过网络从一台计算机向另一台计算机传输文件。为了实现Linux环境下的FTP服务器配置,绝大多数的Linux发行套装中都选用的是性能优秀的服务器软件Wu-Ftpd(WashingtonUniversityFTP)。以下我们以RedHatLinux为例来说明Wu-FTP的安装设置。

(1)安装。根据服务对象的不同,FTP服务可以分为两类:一类是系统FTP服务器,它只允许系统上的合法用户使用;另一类是匿名FTP服务器,它允许任何人登录到FTP服务器,与服务器连接后,在登录提示中输入Anonymous,即可访问服务器。针对这两种服务,可以通过RedHat的第一张光盘安装Wu-Ftpd的RPM包,安装时只需以Root身份进入系统并运行下面的命令即可:

Rpm-ivhanonftp-x.x-x.i386.rpmRpm-ivhwu-ftpd-x.x.x-x.i386.rpm

其中-x.x-x和-x.x.x-x是版本号。

(2)启动。与Apache一样,Wu-Ftpd也可以配置为自动启动:执行RedHat附带的Setup程序,在“SystemService”选项中选中Wu-Ftpd,按下[OK]按钮确定退出即可。自动启动固然方便,但是,当我们更改了Wu-Ftpd的配置文件后,需要用到手动启动:启动:/usr/sbin/ftprestart

关闭:/usr/sbin/ftpshut(3)FTP服务器的配置。为了满足用户的需要,可以使用存放在/etc目录中的配置文件来进行FTP服务器的配置。这些文件都是以FTP开头的。/etc/ftpusers:该文件夹中包含的用户不能通过FTP登录服务器,有时将需要禁止的用户账号写入文件/etc/ftpuser中,这样就可以禁止一些用户使用FTP服务。/etc/ftpconversions:用来配置压缩/解压缩程序。/etc/ftpgroups:创建用户组,这个组中的成员可以访问FTP服务器。/etc/ftpphosts:用来禁止或允许远程主机对特定账户的访问。/etc/ftpaccess:是非常重要的一个配置文件,用来控制存取权限,文件中的每一行定义一个属性,并对属性的值进行设置。利用这些文件,能够非常精确地控制不同用户、在不同时间、从不同地点连接服务器,并且可以对他们连接后所做的工作进行检查跟踪。(4)验证。安装、配置好FTP服务器后,就可以进行验证,用图形工具和命令行均可访问FTP服务器。在宿主机端Linux启动后需要配置IP地址:#ifconfigeth0

启动超级终端,配置目标板以太网IP地址:#ifconfigeth0192.168.0.***

配置以太网广播地址和子网掩码:ifconfigeth0broadcast55netmask

配置网关:r

温馨提示

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

评论

0/150

提交评论