ImageVerifierCode 换一换
格式:DOCX , 页数:28 ,大小:257.27KB ,
资源ID:24008408      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/24008408.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(嵌入式Linux名词解析.docx)为本站会员(b****7)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

嵌入式Linux名词解析.docx

1、嵌入式Linux名词解析目录Shell 2脚本Script 2目标程序 3交叉编译 5进程 线程 和任务 7工具链 7文件系统 8什么是ioctl 8根文件系统 10分散加载 12文件系统 13Busybox 13驱动程序和内核的关系 14文件描述符 14struct file 17struct inode 19Shell文字操作系统与外部最主要的接口就叫做shell。shell是操作系统最外面的一层。shell管理你与操作系统之间的交互:等待你输入,向操作系统解释你的输入,并且处理各种各样的操作系统的输出结果。GNU/Linux由于GNU/Linux这个词太长,下面如果没有特别指明,“Lin

2、ux”就是指“GNU/Linux”。 BashBash(Bourne Again Shell)是目前大多数 Linux(Red Hat,Slackware等)系统默认使用的Shell,它由Brian Fox和Chet Ramey共同完成,内部命令一共有 40 个,它是 Bourne Shell的扩展,与Bourne Shell完全向后兼容,并且在 Bourne Shell的基础上增加了很多特性。Bash是GNU计划的一部分,用来替代Bourne Shell。Linux 下使用 Shell 非常简单,打开终端就可以到Shell的提示符了,登录系统之后,系统将执行个称为 Shell的程序, 正是S

3、hell进程提供了命令提示符。作为 Linux 默认的 Bash,对于普通用户“$”作为Shell提示符,而对于根用户(root)用“#”作提示符。如图3.2。 脚本Script动态程序一般有两种实现方式,一是二进制方式,一是脚本方式。 二进制方式是先将我们编写的程序进行编译,变成机器可识别的指令代码(如.exe文件),然后再执行。这种编译好的程序我们只能执行、使用,却看不到他的程序内容。 脚本简单地说就是一条条的文字命令,这些文字命令是我们可以看到的(如可以用记事本打开查看、编辑),脚本程序在执行时,是由系统的一个解释器,将其一条条的翻译成机器可识别的指令,并按程序顺序执行。因为脚本在执行时

4、多了一道翻译的过程,所以它比二进制程序执行效率要稍低一些。 简单地说,脚本就是指通过记事本程序或其它文本编辑器(如Windows Script Editor,EditPlus等)创建,并保存为特定扩展名(如.reg , .vbs, .js, .inf等)的文件,对于注册表脚本文件就是利用特定的格式编辑的.reg文件;对于VBScript脚本编程语言来说,脚本文件扩展名就是.vbs;对于JScript脚本编程语言来说,脚本文件扩展名就是.js;另外,.wsf格式是Microsoft定义的一种脚本文件格式,即Window Script File. 脚本同我们平时使用的VB、C语言的区别主要是: 1

5、、脚本语法比较简单,比较容易掌握; 2、脚本与应用程序密切相关,所以包括相对应用程序自身的功能; 3、脚本一般不具备通用性,所能处理的问题范围有限。 目标程序我们开始都是字符文件,就是源文件。第一步先把源文件翻译成一种中间代码,这就是目标文件,然后再把目标文件翻译为机器代码,这就是可置执行的EXE文件了。所以说,目标就是一个中间程序。Makefile这里先介绍makefile最基本的知识。假设现有三个 c 程序 main.c, mytool1.c, mytool2.c,其中主程序在 main.c中。gcc -c main.cgcc -c mytool1.cgcc -c mytool2.cgcc

6、 -o main main.o mytool1.o mytool2.o这样的话我们可以产生main程序,而且也不是很麻烦.但是我们考虑一下,如果有一天我们修改了其中的一个文件(比如说mytool1.c),那么我们难道还要重新输入上面的命令吗?也许你会说,这个很容易解决啊,我写一个SHELL脚本,让它帮我去完成不就可以了.是的对于这个程序来说,是可以起到作用的.但是当我们把事情想的更复杂一点,如果我们的程序有几百个源程序的时候,难道也要编译器重新一个一个的去编译吗?为此,聪明的程序员们想出了一个很好的工具来做这件事情,这就是make.什么是make linux系统中,提供了一个自动生成和维护目标

7、程序的工具-make。make是一个单独工作的程序,根据程序模块的修改情况重新编译链接目标代码,以保证目标代码总是由最新的模块组成。 源程序编译链接的顺序和范围取决于模块之间的关联关系。make 从指定文件中读取说明模块之间关系的信息,然后根据这些信息维护和更新目标文件。具体地说,make 首先判断哪些文件过时了。所谓过时,就是一个文件生成以后,用来生成该文件的源文件或者所依赖的模块被修改了,而他自己没有修改。其判断依据是文件生成时间。找到过时的文件,就根据指定文件中的有关信息进行更新操作。 make 默认从GNUmakefile makefile 或者 Makefile 读取信息。可以用 -

8、f 指定文件。 我们只要执行以下make,就可以把上面的问题解决掉.在我们执行make之前,我们要先编写一个非常重要的文件.-Makefile(或 makefile).对于上面的那个程序来说,可能的一个Makefile的文件是:#这是上面那个程序的Makefile文件main:main.o mytool1.o mytool2.o gcc -o main main.o mytool1.o mytool2.omain.o:main.c mytool1.h mytool2.h gcc -c main.cmytool1.o:mytool1.c mytool1.h gcc -c mytool1.cmyt

9、ool2.o:mytool2.c mytool2.h gcc -c mytool2.c有了这个Makefile文件,不过我们什么时候修改了源程序当中的什么文件,我们只要执行make命令,我们的编译器都只会去编译和我们修改的文件有关的文件,其它的文件它连理都不想去理的.如何编写 makefile文件 在Makefile中以开始的行都是注释行.Makefile中最重要的是描述文件的依赖关系的说明. 一般的格式是:target: componentsTABrule(TAB表示tab键)第一行表示的是依赖关系.第二行是规则(命令行). 每一个命令行的开头都必须是一个tab键。比如说我们上面的那个Mak

10、efile文件的第二行 main:main.o mytool1.o mytool2.o表示我们的目标(target)main的依赖对象(components)是main.o mytool1.o mytool2.o 当倚赖的对象在目标修改后修改的话,就要去执行规则一行所指定的命令.就象我们的上面那个Makefile第三行所说的一样要执行 gcc -o main main.o mytool1.o mytool2.oMakefile有几个非常有用的变量:分别是 $、$*、$、$ 。代表的意义分别是:$ - 目标文件$* - 目标文件去掉后缀的部分$ - 所有的依赖文件$ - 比目标文件更新的依赖文件

11、如果我们使用上面几个变量,那么我们可以简化我们的Makefile文件为:# 这是简化后的Makefilemain:main.o mytool1.o mytool2.o gcc -o $ $main.o:main.c mytool1.h mytool2.h gcc -c $*.cmytool1.o:mytool1.c mytool1.h gcc -c $*.cmytool2.o:mytool2.c mytool2.h gcc -c $*.c交叉编译在一种计算机环境中运行的编译程序,能编译出在另外一种环境下运行的代码,我们就称这种编译器支持交叉编译。这个编译过程就叫交叉编译。简单地说,就是在一个平

12、台上生成另一个平台上的可执行代码。这里需要注意的是所谓平台,实际上包含两个概念:体系结构(Architecture)、操作系统(Operating System)。同一个体系结构可以运行不同的操作系统;同样,同一个操作系统也可以在不同的体系结构上运行。举例来说,我们常说的x86 Linux平台实际上是Intel x86体系结构和Linux for x86操作系统的统称;而x86 WinNT平台实际上是Intel x86体系结构和Windows NT for x86操作系统的简称。交叉编译这个概念的出现和流行是和嵌入式系统的广泛发展同步的。我们常用的计算机软件,都需要通过编译的方式,把使用高级计

13、算机语言编写的代码(比如C代码)编译(compile)成计算机可以识别和执行的二进制代码。比如,我们在Windows平台上,可使用Visual C+开发环境,编写程序并编译成可执行程序。这种方式下,我们使用PC平台上的Windows工具开发针对Windows本身的可执行程序,这种编译过程称为native compilation,中文可理解为本机编译。然而,在进行嵌入式系统的开发时,运行程序的目标平台通常具有有限的存储空间和运算能力,比如常见的 ARM 平台,其一般的静态存储空间大概是16到32MB,而CPU的主频大概在100MHz到500MHz之间。这种情况下,在ARM平台上进行本机编译就不太

14、可能了,这是因为一般的编译工具链(compilation tool chain)需要很大的存储空间,并需要很强的CPU运算能力。为了解决这个问题,交叉编译工具就应运而生了。通过交叉编译工具,我们就可以在CPU能力很强、存储控件足够的主机平台上(比如PC上)编译出针对其他平台的可执行程序。要进行交叉编译,我们需要在主机平台上安装对应的交叉编译工具链(cross compilation tool chain),然后用这个交叉编译工具链编译我们的源代码,最终生成可在目标平台上运行的代码。常见的交叉编译例子如下:1、在Windows PC上,利用ADS(ARM 开发环境),使用armcc编译器,则可编

15、译出针对ARM CPU的可执行代码。2、在Linux PC上,利用arm-linux-gcc编译器,可编译出针对Linux ARM平台的可执行代码。3、在Windows PC上,利用cygwin环境,运行arm-elf-gcc编译器,可编译出针对ARM CPU的可执行代码。交叉编译通俗地讲就是在一种平台上编译出能运行在体系结构不同的另一种平台上,比如在我们地PC平台(X86 CPU)上编译出能运行在sparc CPU平台上的程序,编译得到的程序在X86 CPU平台上是不能运行的,必须放到sparc CPU平台上才能运行。当然两个平台用的都是linux。这种方法在异平台移植和嵌入式开发时用得非常

16、普遍。相对与交叉编译,我们平常做的编译就叫本地编译,也就是在当前平台编译,编译得到的程序也是在本地执行。用来编译这种程序的编译器就叫交叉编译器,相对来说,用来做本地编译的就叫本地编译器.动态加载和静态加载说简单,并用打比喻的方式来解释.好比有两个人a和ma代表apache,m代表module。要想让a使用m的东西一个方法是把m的东西都放到a那里去,a使用的时候就是现成的了,就是所谓的静态编译。还有一个方法,就是告诉a, m的住址,当a要使用m的东西的时候,a去找m,然后使用。不过,这种方法要注意的一个问题就是:m必须要有实际的住址,否则a会找不到m而产生错误的,我此文开始提到的 apachec

17、tl startssl产生的错误就是这个原因,应该再编译好ssl才可以的.这种方法也就是apache 的动态(DSO)编译了。静态:在使用./configure编译的时候,如果不指定某个模块为动态,即没有使用:enable-mods-shared=module或者enable-module=shared 这个2个中的一个,那么所有的默认模块为静态。 那么何谓静态? 其实就是编译的时候所有的模块自己编译进 httpd 这个文件中(我们启动可以使用这个执行文件,如: ./httpd & ),启动的时候这些模块就已经加载进来了,也就是可以使用了, 通常为: 来配置。所以大家看到的配置都是 ,很显然,

18、module.c这个东西已经存在 httpd这个文件中了。动态:就是编译的时候,使用enable-module=shared 或者enable-modules-shared=module 来动态编译。 那么什么是动态? 静态是直接编译进httpd中, 那么动态显然就不编译进去了,也就是你启动的时候根本不会加载这个模块, 而是给你一个module.so 文件,你一定要使用 loadmodule 这个语法来加载,这个模块才有效。那么区别就出来了:静态的模块通常是 来配置, 动态使用loadmoule来加载,然后再配置。首先看看编译apache的选项含义对于apache 1.3.x./configu

19、re prefix=/usr/local/apache /enable-module=so /enable-module=most /enable-shared=max /enable-module=rewrite对于apache 2.0.x./configure prefix=/usr/local/apache2 /enable-modules=most /enable-mods-shared=all /enable-so /enable-rewrite对于apache 2.2.0./configure prefix=/usr/local/apache2 /enable-mods-share

20、d=all /enable-so /enable-rewrite举例一:编译一个apache2.2.8版本# ./configure prefix=/usr/local/apache enable-so enable-mods-shared=most enable-rewrite enable-forward说明:so模块用来提供 DSO 支持的 apache 核心模块.enable-so 选项:让 Apache 可以支持DSO模式,注意,这里采用的是 Apache2.0 的语法。如果你的Apache 是1.3版本,应改为enable-module=soenable-mods-shared=m

21、ost选项:告诉编译器将所有标准模块都动态编译为DSO模块。如果用的是 Apache1.3, 改为enable-shared=max就可以。-enable-rewrite选项:支持地址重写功能,使用1.3版本的朋友请将它改为enable-module=rewriteenable-module=most用most可以将一些不常用的,不在缺省常用模块中的模块编译进来.enable-mods-shared=all意思是动态加载所有模块,如果去掉-shared话,是静态加载所有模块.进程 线程 和任务进程和线程都是由操作系统所体会的程序运行的基本单元,系统利用该基本单元实现系统对应用的并发性。进程和线

22、程的区别在于: 简而言之,一个程序至少有一个进程,一个进程至少有一个线程. 线程的划分尺度小于进程,使得多线程程序的并发性高。 另外,进程在执行过程中拥有独立的内存单元,而多个线程共享内存,从而极大地提高了程序的运行效率。 线程在执行过程中与进程还是有区别的。每个独立的线程有一个程序运行的入口、顺序执行序列和程序的出口。但是线程不能够独立执行,必须依存在应用程序中,由应用程序提供多个线程执行控制。 从逻辑角度来看,多线程的意义在于一个应用程序中,有多个执行部分可以同时执行。但操作系统并没有将多个线程看做多个独立的应用,来实现进程的调度和管理以及资源分配。这就是进程和线程的重要区别。 简单的说,

23、你每启动一个程序,就启动了一个进程。在Windows 3.x下,进程是最小运行单位。在Windows 95/NT下,每个进程还可以启动几个线程,比如每下载一个文件可以单独开一个线程。在Windows 95/NT下,线程是最小单位。WINDOWS的多任务特性使得线程之间独立运行,但是它们彼此共享虚拟空间,也就是共用变量,线程有可能会同时操作一片内存。 所谓进程,本身不能执行,它只是一个资源的集合体,拥有地址空间,模块,内存,. 线程是真正的执行单元,一个进程如果没有线程,那么就没有存在的意义,因为不可能执行。对于操作系统而言其调度单元是线程。一个进程至少包括一个线程,通常将该线程称为主线程。一个

24、进程从主线程的执行开始进而创建一个或多个附加线程,就是所谓基于多线程的多任务。工具链机器上。两个机子有不同的机器指令。工具链:指编译、汇编、链接等一整套工具。嵌入式设备由于不具备一定的处理器能力和存储空间,程序开发一般用PC来完成,然后将可执行文件下载到嵌入式系统中运行。这是目前嵌入式程序开发的不二选择Host/target模式。但这引发了一个问题:由于Host和Target的处理器体系结构不同,我们不能直接用PC上既有的程序开发工具,必须使用跨平台开发工具,即在Host上生成能在Target上运行格式的目标文件。与在PC上进行程序开发类似,嵌入式系统开发也需要编译器、链接器、解释程序等。本文

25、讨论GNU跨平台开发工具链的建立,包括: ld, gas, ar, gcc, glibc.自己建立交叉编译环境是一件很头疼的事(处理版本的依赖性, 漫长的编译过程.),如果你不想经历这样的痛苦,可以选择网上编译好了的工具链进行安装.如果你用的是Debian/Ubuntu的发行版, 推荐使用Emdebian. 如果使用uClinux, 也可安装arm-elf-tools.内核映像内核映像就相当于内核保存成磁盘文件形式,系统启动时它会被启动程序原封不动(或仅进行解压)搬到内存中去运行。文件系统一种看待文件系统的方式是把它看作一个协议。网络协议(比如 IP)规定了互联网上传输的数据流的意义,同样,文

26、件系统会给出特定存储媒体上数据的意义挂装在 Linux 中将一个文件系统与一个存储设备关联起来的过程称为挂装(mount)。使用 mount 命令将一个文件系统附着到当前文件系统层次结构中(根)。在执行挂装时,要提供文件系统类型、文件系统和一个挂装点。伪文件proc文件系统是一个伪文件系统,它只存在内存当中,而不占用外存空间。它以文件系统的方式为访问系统内核数据的操作提供接口。用户和应用程序可以通过proc得到系统的信息,并可以改变内核的某些参数。由于系统的信息,如进程,是动态改变的,所以用户或应用程序读取proc文件时,proc文件系统是动态从系统内核读出所需信息并提交的。什么是ioctli

27、octl是设备驱动程序中对设备的I/O通道进行管理的函数。所谓对I/O通道进行管理,就是对设备的一些特性进行控制,例如串口的传输波特率、马达的转速等等。它的调用个数如下:int ioctl(int fd, ind cmd, );其中fd就是用户程序打开设备时使用open函数返回的文件标示符,cmd就是用户程序对设备的控制命令,至于后面的省略号,那是一些补充参数,一般最多一个,有或没有是和cmd的意义相关的。二、 ioctl的必要性如果不用ioctl的话,也可以实现对设备I/O通道的控制,但那就是蛮拧了。例如,我们可以在驱动程序中实现write的时候检查一下是否有特殊约定的数据流通过,如果有的话

28、,那么后面就跟着控制命令(一般在socket编程中常常这样做)。但是如果这样做的话,会导致代码分工不明,程序结构混乱,程序员自己也会头昏眼花的。所以,我们就使用ioctl来实现控制的功能。要记住,用户程序所作的只是通过命令码告诉驱动程序它想做什么,至于怎么解释这些命令和怎么实现这些命令,这都是驱动程序要做的事情。ioctl如何实现在驱动程序中实现的ioctl函数体内,实际上是有一个switchcase结构,每一个case对应一个命令码,做出一些相应的操作。怎么实现这些操作,这是每一个程序员自己的事情,因为设备都是特定的,这里也没法说。关键在于怎么样组织命令码,因为在ioctl中命令码是唯一联系

29、用户程序命令和驱动程序支持的途径。命令码的组织是有一些讲究的,因为我们一定要做到命令和设备是一一对应的,这样才不会将正确的命令发给错误的设备,或者是把错误的命令发给正确的设备,或者是把错误的命令发给错误的设备。这些错误都会导致不可预料的事情发生,而当程序员发现了这些奇怪的事情的时候,再来调试程序查找错误,那将是非常困难的事情。所以在Linux核心中是这样定义一个命令码的:_| 设备类型 | 序列号 | 方向 |数据尺寸|-|-|-|-| 8 bit|8 bit |2 bit |814 bit|-|-|-|-|这样一来,一个命令就变成了一个整数形式的命令码。但是命令码非常的不直观,所以Linux

30、 Kernel中提供了一些宏,这些宏可根据便于理解的字符串生成命令码,或者是从命令码得到一些用户可以理解的字符串以标明这个命令对应的设备类型、设备序列号、数据传送方向和数据传输尺寸。这些宏我就不在这里解释了,具体的形式请读者察看Linux核心源代码中的和,文件里给除了这些宏完整的定义。这里我只多说一个地方,那就是幻数。幻数是一个字母,数据长度也是8,所以就用一个特定的字母来标明设备类型,这和用一个数字是一样的,只是更加利于记忆和理解。就是这样,再没有更复杂的了。四、 cmd参数如何得出这里确实要说一说,cmd参数在用户程序端由一些宏根据设备类型、序列号、传送方向、数据尺寸等生成,这个整数通过系

31、统调用传递到内核中的驱动程序,再由驱动程序使用解码宏从这个整数中得到设备的类型、序列号、传送方向、数据尺寸等信息,然后通过switchcase结构进行相应的操作。要透彻理解,只能是通过阅读源代码,我这篇文章实际上只是一个引子。Cmd参数的组织还是比较复杂的,我认为要搞熟它还是得花不少时间的,但是这是值得的,驱动程序中最难的是对中断的理解。五、 小结ioctl其实没有什么很难的东西需要理解,关键是理解cmd命令码是怎么在用户程序里生成并在驱动程序里解析的,程序员最主要的工作量在switchcase结构中,因为对设备的I/O控制都是通过这一部分的代码实现的。根文件系统根文件系统首先是一种文件系统,但是相对于普通的文件

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1