嵌入式Linux带课后题期末复习资料docxWord文档格式.docx
《嵌入式Linux带课后题期末复习资料docxWord文档格式.docx》由会员分享,可在线阅读,更多相关《嵌入式Linux带课后题期末复习资料docxWord文档格式.docx(19页珍藏版)》请在冰豆网上搜索。
保存文件,文件应已有名字
wfilename
以文件名川enamel呆存文件
退出
q
退出,如果文件已修改则不能退出
:
不保存强行推出,无论文件是否被修改
wq
保存后退出
4gcc编译的4个步骤:
*.c预处理*.i、编译*.s、汇编*.0、链接*.exe。
5gcc中:
gcc的选项“-E”可以使编译器在预处理结束时就停止编译,选项"
-0”是指
定GCC输出的结果,其命令格式为如下所示。
gcc-E-o[目标文件][编译文件]
"
.i”文件是经过预处理的C原始程序。
$gcc-E-ohello,ihello,c
6-S编译之前停止.s汇编语言原始程序$gcc-S-ohello,shello.i
7-c可以看见汇编代码已转化为“.o”的二进制目标代码$gcc-chello,shello,o
8-c只编译汇编不连接;
-S只编译不汇编,生成汇编代码;
-E只进行预编译;
-g可执行程序中包含标准调试信息;
-ofile将file文件指定为输出文件;
-v打印出
选项
含义
-C
只编译汇编不链接,生成目标文件“Q”
-S
只编译不汇编,生成汇编代码
-E
只进行预编译,不做其他处理
-9
在可执行程序中包含标准调试信息
-0file
将川e文件指定为输出文件
9函数库:
静态库和动态库;
静态库是一系列的目标文件(.0文件)的归档文件
(libname.a);
动态库(libname.so[主版本号.次版本号.发行号])在程序编译时并不会
被链接到目标代码中,而是在程序运行时才被载入。
区别动态:
库仅当使用它的程序执行时才被链接使用,不必参与编译,一个动态库可以被
多个程序使用;
静态库将整合到程序中,程序执行是不加载静态库。
优缺点:
静态库会使程序臃肿,难以升级,容易部署动态库会使程序轻便,易于升级,部署困难
10make工程管理器:
是个自动编译管理器,能够根据文件时间戳自动发现更新过的文件
而减少编译的工作量,同时,它通过读入Makefile文件的内容来执行大量的编译工作。
11在一个makefile中通常包含的内容:
(1)需要由make工具创建的目标体(target),通常是目标文件或可执行文件;
(2)要创建的目标体所依赖的文件
(3)创建每个目标体时需要运行的命令,这一行必须以制表符“tab”键开头。
12makefile的变量定义有两种方式:
递归展开方式和简单方式
13隐式规则:
所有o”文件都可自动由c"
文件使用命令“$(CC)$(CPPFLAGS)$(CFLAGS)-cfile,c-ofile.on来生成。
14.GDB调试四项基本功能:
(1)能够运行程序,设置所有能影响程序运行的参数。
(2)能够让程序在指定的条件下停止。
(3)能够在程序停止时检查所有参数的情况
(4)能够根据指定条件改变程序的运行。
15.GDB的使用流程:
查看文件——
1
设置断点一
-b6
查看断点处情况一
-infob
运行代码一
r
查看变量值
Pn
/Pi
单步运行
n
恢复程序运行
c
观察变量一
-watch
退出GDB——
■q
第三章
1预处理:
指在进行编译的第一遍扫描之前所做的工作。
2宏:
在C语音源程序中允许用一个标识符来表示一串符号
3宏的分类:
带参数和不带参数
4无参宏定义:
无参宏的宏名(也就是标识符)后不带参数,其定义的一般形式为:
#define标识符字符串
5宏定义说明:
(1)宏定义用宏名来表示一串符号,至替换,不检查。
(2)不是声明或语句,在行末不必加分号;
(3)作用域包括从宏定义命名起到源程序结束,使用#undef命令来取消宏作用域。
(4)宏名在源程序中若用引号括起,则预处理程序不对起进行宏替换。
(5)宏定义允许嵌套(6)宏名用大写字母,区别变量
(7)对输出格式做宏定义,减少程序编写过程中麻烦。
6带参宏定义:
#define宏名(形参表)字符串
说明:
(1)带参宏定义中,宏名和形参表之间不能有空格出现;
(2)形式半数不分配内存单元,不必做类型定义;
(3)在宏定义中形参是标识符,而宏调用中的实参可以是表达式;
(4)在宏定义中,字符串内的形参通常要用括号括起来以避免出错。
7堆与栈的区别:
申请方式;
申请后系统的响应;
申请大小的限制;
申请速度的限制;
堆和栈中的存储内容。
申请方式
栈(stack):
自动分配
堆(head):
手动分配
申请后系统的响应
堆:
遍历
栈:
溢出
申请大小的限制
灵活,大
受限,小
高地址扩展,.
低地址扩展,:
申请速度的限制
malloc(),'
自动分配,快
堆和栈中的存储内容
堆大小,内容随意安排
语句地址,参数(左■右),局部变量
8内嵌汇编的语法—asm_
汇编语句模板由汇编语句序列组成,语句之间使用“;
”、“\n”或“\n\t”分开。
每条指令都必须被双引号括起来。
两条指令必须用换行或分号分开。
指令中的操作数可以使用占位符引用C语言变量,操作数占位符最多10个,名称如为:
%0,%1,%9
输出部分用来指定当前内嵌汇编语句的输出。
输入部分指定当前内嵌汇编语句的输入,每个操作数描述符由限定字符串和C语言表达式或者C语言变量组成,格式为形如“constraintw(variable)的列表。
破坏描述部分通知gcc当前内嵌汇编语句可能会对某些寄存器或内存进行修改,希望gcc在编译时能够将这一点考虑进去。
9双向链表的常见操作:
(1)增加节点
卧前
(2)删除节点
刷除前
删除后
10Linux内核链表:
(1)声明和初始化:
这里是使用LIST_HEAD()这个宏来构建的。
#defineLIST_HEAD_INIT(name){&
(name),&
(name))
#defineLIST_HEAD(name)structlist_headname=LIST_HEAD_INIT(name)构建了一个空链表staticinlineint1ist_empty(conststructlist_head*head)(returnhead->
next二二head;
}
(2)插入
staticinlinevoidlist_add(structlist_head*new,structlist_head*prev,struct
list_head*next)(next->
prev=new;
new->
next=next;
prev=prev;
prev->
next=new;
staticinlinevoidlist_add(structlist_head*new,structlist_head*head)
(list_add(new,head,head->
next);
)
staticinlinevoidlist_add_tail(structlist_head*new,structlist_head*head)
(list_add(new,head->
prev,head);
11对链表的插入操作:
在表头插入和在表尾插入12红黑树的定义:
(1)每个节点要么是红色,要么是黑色。
(2)所有的叶子节点都是空节点,并且都是黑色。
(3)如果一个节点是红色,那么它的两个子节点都是黑色。
(4)节点到其子孙节点的每条简单路径都包含相同数目的黑色节点。
(5)根节点永远是黑色的
13哈希表定义:
为了能够迅速找到所需要的记录,最为直接的方法是在记录的存储位置和它的关键字之间建立一个确定的对应关系f,使每个关键字和结构中一个唯一的存储位置相对应
14Bootloader定义:
是在操作系统运行之前执行的一段小程序,通过这段小程序,可以初始化硬件设备,建立内存空间的映像表,从而建立适当的系统软硬件环境,为最终调用操作系统内核做好准备。
15Linux内核主要功能包括:
进程管理,内存管理,文件管理,设备管理,网络管理
第四章嵌入式linux开发环境的搭建
1.tftp分为客户端和服务器两种
2.NFS文件系统:
原理:
NFS可以让不同的主机通过网络将远端的NFS服务器共享出来的文件安装到自己的系统中,从客户端看来,使用NFS的远端文件就像是使用本地文件一样。
在嵌入式中使用NFS会使应用程序的开发变得十分方便,并且不用反复地进行烧写。
过程:
NFS服务器端通过读入它的配置文件“/etc/exports”来决定所共享的文件目录。
客户端可以根据相应的权限
3.NFS服务器端通过读入它的配置文件“/etc/exports”来决定所共享的文件目录。
4.Bootloader是一段小程序,可以初始化硬件设备建立内存空间的映像表,从而建立适当的系统软硬件环境,为最终调用操作系统内核做好准备。
5.Linux内核主要功能包括:
进程管理、内存管理、文件管理、设备管理、网络管理等。
配置minicom,nfs,tftp等
1rpm-Uvh*.rpm搭建好交叉编译环境。
2vi/etc/exports修改相应的内容。
第二行改写为:
/home/nfs(rw)注意空格保存退出
3cd/etc/rc.d/init.d/
4./nfsstart启动主机下的NFS。
5终端下输minicom-s修改第三个选项
6配置波特率115200,按a修改/dev/ttySO,最后选yes。
保存退出。
7ifconfigethO192.168.0.2配置ip地址。
8ping192.168.0.3查看是否与主机相连上。
9chmod777/home/nfs改变文件夹的属性
10mkdir/mnt/yaffs
11servernfsrestart重新启动
12mount-onolock192.168.0.2:
/home/nfs/mny/yaffs完成把主机上的/home/nfs下的文件挂载到实验系统的/mnt/yaffs目录下。
第五章嵌入式文件1/0编程
1系统调用:
指操作系统提供给用户程序调用的一组“特殊”接口,用户程序可以通过
这组“特殊”接口获得操作系统内核提供的服务。
1将程序的运行空间分为内核空间和用户空间(即内核态和用户态)。
2调用内核空间程序:
用户空间的进程需要获得一定的系统服务,这时,操作系统就必须利用系统提供给用户的特殊接口一一系统调用规定用户进程进入进程进入内核空间的具体位置。
4VFS定义:
把各种具体的文件系统的公共部分抽取出来,形成一个抽象层,是系统内核的一部分。
它位于用户程序和具体的文件系统之间,对用户程序提供了标准的文件系统调用接口。
5VFS文件引入了通用文件模型,此模型的核心:
超级块对象,索引节点对象,文件对象,目录项对象
6文件描述符是一个非负的整数,它是一个索引值,并指向在内核中每个进程打开文件的记录表。
当打开一个现存文件或创建一个新文件时,内核就向进程返回一个文件描述符;
当需要读写文件时,也需要把文件描述符作为参数传递给相应的函数。
7I/O操作的系统调用,主要函数:
open()>
read()>
write()>
Jseek。
、close()□这些函数特点:
不带缓存,直接对文件或设备进行读写操作。
8文件锁:
建议性锁和强制性锁。
建议性锁要求每个上锁文件的进程都要检查是否有锁存在,并且尊重已有的锁。
强制性锁是由内核执行的锁,当一个文件被上锁进行写入操作的时候,内核将阻止其他任何文件对其进行读写操作。
9建议性锁:
要求每个上锁文件的进程都要检查是否有锁存在,并且尊重已有的锁。
强制性锁:
由内核执行的锁,当一个文件被上锁进行写入操作的时候,内核将阻止其他任何文件对其进行读写操作。
10终端的3种工作模式:
规范模式,非规范模式,原始模式
11标准I/O提供流缓冲的目的是尽可能减少使用read()和write()等系统调用的数量。
(1)全缓冲
(2)行缓冲(3)不带缓
第六章多任务编程
1.进程的特性:
并发性,动态行,交互性,独立性,异步性
2.进程的状态:
运行状态,可中断的阻塞状态,不可中断的阻塞状态,可终止的阻塞状态,暂停状态,跟踪状态,僵尸状态,僵尸撤销状态
进程中的状态:
阻塞态、暂停态、僵尸态、运行态。
进程的创建、执行和终止
3.虚拟内存管理技术,大小为4G的线性虚拟空间,4G空间会被分成两个部分:
用户空间和内核空间。
4.用户空间包括的功能区域:
只读段;
数据段;
堆;
堆栈;
共享库的内存映射区域。
4fork。
函数:
从已存在的进程中创建一个新进程。
父进程中执行fork()函数时,父进程会复制出一个子进程,而且父子进程的代码从fork()函数的返回开始分别在两个地址空间中同时运行。
从而两个进程分别获得其所属fork()的返回值,其中在父进程中的返回值是子进程的进程号,而在子进程中返回0。
6编写守护进程:
(1)创建子进程,父进程退出
(2)在子进程中创建新会话
(3)改变当前目标为根目录
(4)重设文件权限掩码
(5)关闭文件描述符
7常用的进程间通信机制(掌握)
(1)管道(Pipe)及有名管道(namedpipe):
管道可用于具有亲缘关系进程间的通信;
有名管道,除具有管道所具有的功能外,它还允许无亲缘关系进程间的通信。
(2)信号(Signal):
信号是在软件层次上对中断机制的一种模拟,它是比较复杂的通信方式,用于通知进程有某事件发生,一个进程收到一个信号与处理器收到一个中断请求效果上可以说是一样的。
(3)消息队列(MessgeQueue):
消息队列是消息的链接表,包括Posix消息队列SystemV消息队列。
它克服了前两种通信方式中信息量有限的缺点,具有写权限的进程可以按照一定的规则向消息队列中添加新消息;
对消息队列有读权限的进程则可以从消息队列中读取消息。
(4)共享内存(Sharedmemory):
可以说这是最有效的进程间通信方式。
它使得多个进程可以访问同一块内存空间,不同进程可以及时看到对方进程中对共享内存中数据的更新。
这种通信方式需要依靠某种同步机制,如互斥锁和信号量等。
(5)信号量(Semaphore):
主要作为进程之间以及同一进程的不同线程之间的同步和互斥手段。
(6)套接字(Socket):
这是一种更为一般的进程间通信机制,它可用于网络中不同机器之间的进程间通信,应用非常广泛。
9.管道,是把一个程序的输出直接连接到另一个程序的输入,Linux的管道主要包括2种:
无名管道和有名管道。
8管道通信:
无名管道和有名管道
无名管道特点:
(1)具有亲缘关系的进程之间的通信;
(2)半双工的通信模式,具有固定的读端和写端;
(3)也可以看成是一种特殊的文件,并且只存在与内存中
9有名管道特点:
(1)可以使互不相关的两个进程实现彼此通信
(2)可以通过路径名来指出
(3)FIFO严格的遵循先进先出规则。
10标准流管道:
将一系列的创建过程合并到一个函数popen()中完成。
创建一个管道;
建立一个子进程;
在父子进程中关闭不需要的文件描述符;
执行exec函数族调用;
执行函数中所指定的命令。
11信号:
可以直接进行用户空间进程和内核进程之间的交互,内核进程也可以利用它来通知用户空间进程发生了哪些系统事件。
它可以在任何时候发给某一进程,而无需知道该进程的状态。
如果该进程当前并未处于执行态,则该信号就由内核保存起来,知道该进程回复执行再传递幻它为止;
如果一个信号被进程设置为阻塞,则该信号的传递被延迟,直到其阻塞被取消时才被传递给进程。
12使用信号量通常分为4步骤:
(1)创建信号量或获得在系统已存在的信号量,此时需要调用semget()函数。
不同进程通过使用同一个信号量键值来获得同一信号量。
(2)初始化信号量,此时使用semctl()函数的SETVAL操作。
当使用二维信号量时,通常将信号量初始化为E(3)进行信号量的PV操作,此时调用semop()函数。
实现进程之间的同步和互斥的核心工作部分。
(4)如果不需要信号量,则从系统中删除它,此时使用semctl()函数的IPC_RMID操作。
此时需要注意,在程序中不应该出现对已经被删除的信号量的操作。
13共享内存的实现:
(1)创建共享内存,用函数shmget(),从内存中获得一段共享内存区域。
(2)映射共享内存,把这段创建的共享内存映射到具体的进程空间中,这里使用shmatOo
14消息队列的实现:
创建或打开消息队列,添加消息,读取消息和控制消息队列。
15PV原子操作:
对整数计数器信号量的操作
P操作:
如果有可用的资源(信号量值>0),则占用一个资源(给信号量值减去一,进入临界区代码);
如果没有可用的资源(信号量值等于0),则被阻塞到,直到系统将资源分配给该进程(进入等待队列,一直等到资源轮到该进程)。
V操作:
如果在该信号量的等待队列中有进程在等待资源,则唤醒一个阻塞进程。
如果没有进程等待它,则释放一个资源(给信号量值加一)。
16线程属性:
绑定属性;
分离属性;
堆栈属性;
堆栈大小;
优先级
17绑定属性定义:
指一个用户线程固定地分配给一个内核线程,因为CPU时间片的调度是面向内核线程的,因此具有绑定属性的线程可以保证在需要的时候总有一个内核线程与之对应。
非绑定属性:
指用户线程和内核线程的关系不是始终固定的,而是由系统来控制分配的。
第七章网络编程
1OSI模型和TCP/IP参考模型层次:
应用层;
表示层;
会话层;
传输层;
网络层;
数据链路层;
物理层
2TCP/IP分层模型中有两大边界特性:
一个是地址边界特性,它将IP逻辑地址与底层网络的硬件地址分开;
一个是操作系统边界特性,它将网络应用与协议软件分开。
3套接字类型:
流式套接字;
数据包套接字;
原是套接字
4.网络高级编程:
三种解决I/O多路复用的解决方法,分别为非阻塞和异步式处理(使用
fcntl()函数)以及多路复用处理(使用select()或poll()函数)
第八章设备驱动编程
1Linux系统的设备分类:
字符设备(像普通文件或字节流);
块设备(一些需要以块为单位随机读写的设备);
网络设备(通过网络能够与其他主机进行数据通信的设备)
2设备驱动程序的特点:
(1)内核代码;
(2)内核接口;
(3)内核机制和服务;
(4)可装载;
(5)可设置;
(6)动态性
3重要的内核数据结构:
file_operation(函数)file(表示打开的文件描述符)inode(表示文件)
课后题
L什么是嵌入式系统,它具有哪些特点?
从各方面比较嵌入式系统与通用计算器的区别:
解:
嵌入式系统是以应用为中心,以计算机控制系统为基础,并且软硬件可剪裁,适用于应用系统对功能、可靠性、成本、体积、功耗有严格要求的专用计算机系统。
特点:
(1)面向特定应用
(2)软硬件都高效的设计、剪裁适当。
(3)是将先进的计算机技术、半导体技术和电子技术与各个行业的具体应用相结合后的产物。
(4)高执行速度和可靠性。
(5)代码高质量、高可靠性。
(6)本身不具备二次开发功能。
区别:
嵌入式系统与通用计算机系统有着完全不同的技术要求和技术发展方向。
通用计算机系统的技术要求是高速、海量的数值计算,其技术发展方向是总线速度的无限提升、存储容量的无限扩大;
而嵌入式计算机系统的技术要求则是智能化控制,技术发展方向是与对象系统密切相关的潜入性能、控制能力与控制的可靠性不断提高。
嵌入式系统(简称“嵌”)和通用计算机(简称“通”)的主要区别包括以下几点:
(1)形式与类型:
“通”:
实实在在的计算机。
按其体系结构、运算速度和规模可分为大型机、中型机、小型机和微机
“嵌”:
“看不见”的计算机,形式多样,应用领域广泛
(2)按应用进行分类组成:
通用处理器、标准总线和外设、软硬件相对独立
面向特定应用的微处理器,总线和外设一般集成在处理器内部,软硬件紧密结合
(3)系统资源:
系统资源充足,有丰富的编译器、集成开发环境、调试器等
系统资源紧缺,没有编译器等相关开发工具
(4)开发方式:
开发平台和运行平台都是通用计算机
采用交叉编译方式,开发平台一般是通用计算机,运行平台是嵌入式系统
(5)二次开发性:
应用程序可重新编程
一般不能重新编程开发
(6)发展目标:
编程功能电脑,普遍进入社会
变为专用电脑,实现“普及计算”
2.嵌入式系统由哪些部分组成?
常用的嵌入式操作系统有哪些?
分别有什么特点?
羸:
由硬件设备、嵌入式操作系统和应用软件组成。
常用的嵌入式操作系统:
(1)嵌