嵌入式Linux应用程序开发过程考核【附答案】 下载本文

嵌入式Linux应用程序开发过程考核【附答案】

过程考核一

1、①ARM7采用采用3级流水线,而ARM9采用5级流水线,其时钟频率更高,指令执行效率也有了较大提高②ARM7采用冯诺依曼结构,而ARM9采用哈佛结构,支持指令Cache与数据Cache ,具有更高的数据处理能力③ARM9支持MMU,能够真正实现内存保护,所以比ARM7具有更强的稳定性与可靠性

2、在一种计算机平台运行的编译程序,能编译出在另外一平台上执行的代码,我们就称这种编译器支持交叉编译。这个编译过程就叫交叉编译、原因:由于一般通用计算机拥有非常丰富的系统资源、使用方便的集成开发环境与调试工具等,而嵌入式系统的系统资源非常紧缺,无法在其上运行相关的编译工具,因此,嵌入式系统的开发需要借助宿主机(通用计算机)来编译出目标机的可执行代码。 3、假设现有三个 c 程序 main、c, mytool1、c, mytool2、c, 其中主程序在 main、c中,编译命令如下,试编写makefile文件。gcc -c main、c

gcc -c mytool1、c gcc -c mytool2、c gcc -o main main、o mytool1、o mytool2、o 要求:使用自定义变量及自动变量 解:OBJS := main、o mytool1、o mytool2、o CC :=gcc main:$(OBJS) $(CC) -o $@ $∧

main、o:main、c mytool1、h mytool2、h $(CC) -c $< mytool1、o:mytool1、c mytool1、h $(CC) -c $< mytool2、o:mytool2、c mytool2、h $(CC) -c $< 4、文件比较命令:diff[选项] 文件1 文件2

补丁命令:patch [选项] [待patch的文件[patch文件]]

关系:patch命令跟diff配合使用,把生成的补丁文件应用到现有代码上。 5、列出gcc编译器常用参数,并举例说明其用法。 -c选项:只编译不链接,生成目标文件“、o” -S选项:只编译不汇编,生成汇编代码, -E选项:只进行预编译,不进行其她处理 -o file:将file文件指定为输出文件 -g :在可执行程序中包含便准调试信息 例如: gcc –o Test Test、c

执行该指令会在当前目录下生成一个名为Test的可执行文件

过程考核二

1、bootloader第二阶段主要工作有哪些?①用汇编语言跳转到main()入口函数②初始化本阶段要使用到的硬件设备③检测系统的内存映射④加载内核映像与根文件系统映像⑤设置内核的启动参数

2、列出底层文件I0及标准IO的主要函数,并说明这两种IO操作的区别。

底层文件IO:open(),read(),write(),lseek(),close() 标准IO: fopen(),fread(),fwrite(),fclose()

底层文件I/O一般没有采用缓冲,而标准I/O默认采用了缓冲机制;

从操作的设备上来区分,底层文件I/O主要针对文件操作,读写硬盘等,它操作的就是文件描述符,标准I/O针对的就是控制台,打印输出到屏幕等,它操作的就是字符流。 3、守护进程的编写流程。①创建子进程,父进程退出②在子进程中创建新会话③改变当前目录为根目录④重设文件权限掩码⑤关闭文件描述符 5、管道及有名管道的区别。(1)无名管道只能用于具有亲缘关系的进程之间通信,

嵌入式Linux应用程序开发过程考核【附答案】

而有名管道可以使互不相关的两个进程间彼此通信(2)无名管道不属于其她任何文件系统,并且只存在于内核的内存空间中;有名管道可以通过路径名来指出,并且在文件系统中就是可见的(3) 一个进程向无名管道中写的内容被管道另一端的进程读出。写入的内容每次都添加在管道缓冲区的末尾,并且每次都就是从缓冲区的头部读出数据;FIFO严格遵循先进先出,对有名管道及FIFO的读总就是从开始处返回数据,对它们的写则把数据添加到末尾

6、wait函数与waitpid函数的区别。(1)wait可能阻塞调用者直到一个子进程终止,而waitpid则可以通过选项不会阻塞。(2)waitpid并不等待第一个终止的进程,它有选项可以控制它所等待的进程。 2、嵌入式系统的定义:嵌入式系统就是以应用为中心,以计算机技术为基础,采用可剪裁软硬件,适用于对功能、可靠性、成本、体积、功耗等有严格要求的专用计算机系统,用于实现对其她设备的控制、监视或管理等功能 3、嵌入式系统与桌面通用系统的区别(列出来两个)(1)嵌入式系统中运行的任务就是专用而确定的,而桌面通用系统需要支持大量的、需求多样的应用程序(2) 嵌入式系统往往对实时性提出较高的要求。(3)嵌入式系统中使用的操作系统一般就是实时操作系统(4)嵌入式系统运行需要高可靠性保障,比桌面系统的故障容忍能力弱很多

8、linux 目录结构下面放什么(了解常用)

/bin 该目录中存放Linux的常用命令/boot 该目录下存放的都就是系统启动时要用到的程序/dev 该目录包含了Linux系统中使用的所有外部设备/usr 用户应用程序与文件都存放在该目录下/etc该目录存放了系统管理时要用到的各种配置文件与子目录/home 用来存放该用户的主目录。/lib 该目录用来存放系统动态连接共享库/mnt可以临时将别的文件系统挂在该目录下

10、文件比较命令diff:比较两个不同的文件或不同目录下的两个同名文件功能,并生成补丁文件。 格式:diff[选项] 文件1 文件2

diff比较文件1与文件2的不同之处,并按照选项所指定的格式加以输出。diff的格式分为命令格式与上下文格式,其中上下文格式又包括了旧版上下文格式与新版上下文格式,命令格式分为标准命令格式、简单命令格式及混合命令格式,它们之间的区别会在使用实例中进行详细地讲解。当选项缺省时,diff默认使用混合命令格式。

11、网络相关命令ifconfig:查瞧与配置网络接口的参数;ifconfig [选项] [网络接口];ftp:利用ftp协议上传与下载文件;telnet:利用telnet协议浏览信息;telent [选项] [IP地址/域名]

12、GCC编译器能编译哪些程序?编译的四个过程?

可以编译如C、C++、Object C、Java、Fortran、Pascal、Modula-3与Ada等多种语言 四个过程:预处理,编译,汇编,链接 9、静态库、a与动态库、so的比较

动态库只有在使用它的程序执行时才被链接使用,而不就是将需要的部分直接编译入可执行文件中,并且一个动态库可以被多个程序使用故可称为共享库,而静态库将会整合到程序中,因此在程序执行时不用加载静态库 23、进程与程序区别与联系:程序就是静态的,它就是一些保存在磁盘上的指令的有序集合,没有任何执行的概念;而进程就是一个动态的概念,它就是程序执行的过程,包括了动态创建、调度与消亡的整个过程。它就是程序执行与资源管理的最小单位。

嵌入式Linux应用程序开发过程考核【附答案】

17、主机环境变量配置

/etc/profile就是系统启动过程执行的一个脚本,对所有用户都生效。~/、bash_profile就是用户的脚本,在用户登录时生效。~/、bashrc也就是用户的脚本,在~/、bash_profile中调用生效。

把下述命令添加到其中一个文件中,之后再注销重新登录即可。 PATH=$PATH :/usr/share/jdk1、5、0_05jdk export PATH

注解:a、将/usr/share/jdk1、5、0_05jdk 改为您的应用程序安装目录。b、linux下用冒号“:”来分隔路径。c、$PATH / $CLASSPATH / $JAVA_HOME 就是用来引用原来的环境变量的值,在设置环境变量时特别要注意不能把原来的值给覆盖掉了,这就是一种常见的错误。d、export就是把个变量导出为全局变量。 18、串口命令台:串行通讯接口很适合作为控制台,在各种操作系统上一般都有现成的控制台程序可以使用。Linux系统通常使用minicom串口通讯工具。Minicom的配置界面就是菜单方式。在Shell下执行“minicom –s”命令,出现配置菜单。 19、bootloader的作用:初始化硬件设备、建立内存空间的映射图,下载操作系统映像文件到SDRAM中,从而将系统的软硬件环境带到一个合适的状态,以便为最终调用操作系统内核或用户应用程序准备好正确的环境。常见:u-boot,vivi,blob

21、文件描述符:就是一个非负的整数,它就是一个索引值,并指向在内核中每个进程打开文件的记录表。对于Linux而言,所有对设备与文件的操作都就是使用文件描述符来进行的。当打开一个现存文件或创建一个新文件时,内核向进程返回一个文件描述符;当需要读写文件时,也需要把文件描述符作为参数传递给相应的函数。一个进程启动时,都会打开3个文件:0:标准输入1:标准输出2、标准出错

27、进程的执行模式:1)用户模式:运行的就是用户程序/应用程序或者内核之外的系统程序;2)内核模式:运行操作系统核心程序。用户程序执行过程中出现系统调用或者发生中断事件,用户模式切换成内核模式。

29、exec作用exec函数族就提供了一个在进程中启动另一个程序执行的方法。(它可以根据指定的文件名或目录名找到可执行文件,并用它来取代原调用进程的数据段、代码段与堆栈段,在执行完之后,原调用进程的内容除了进程号外,其她全部被新的进程替换了。) 35、阻塞式通信就是指, 当试图对文件描述符进行读写时, 如果当时没有东西可读,或者暂时不可写, 程序就进入等待状态, 直到有东西可读或者可写为止。非阻塞状态, 如果没有东西可读, 或者不可写, 读写函数马上返回, 而不会等待。 34、accept函数等待并接受客户请求:函数原型:int accept(int sockfd, struct sockaddr* addr, socklen_t* len)返回:非负描述字——成功, -1——失败。参数sockfd就就是上面解释中的监听套接字,这个套接字用来监听一个端口,当有一个客户与服务器连接时,它使用这个一个端口号。参数addr ,就是一个结果参数,它用来接受一个返回值,这返回值指定客户端的地址,如果对客户的地址不感兴趣,那么可以把这个值设置为NULL。参数len ,也就是结果的参数,用来接受上述addr的结构的大小的,它指明addr结构所占有的字节个数。同样的,它也可以被设置为NULL。 如果accept成功返回,则服务器与客户已经正确建立连接了此时服务器通过accept返回的套接字来完成与客户的通信。

嵌入式Linux应用程序开发过程考核【附答案】

30、进程间通信:通信的种类:1)管道及有名管道2)信号3)消息队列4)共享内存

5)信号量6)套接字

信号来源:硬件的原因(比如我们按下了键盘);软件的原因(比如我们使用系统函数或者就是命令发出信号)、

信号的种类:SIGTRMIN:不可靠信号;SIGTRMAX:可靠信号

信号生命周期:一个完整的信号生命周期可以分为3个重要阶段,这3个阶段由4个重要事件来刻画的:信号产生、信号在进程中注册、信号在进程中注销、执行信号处理函数

信号处理方式:1忽略信号,即对信号不做任何处理,但就是有两个信号不能忽略,即SIGKILL及SIGSTOP。2捕捉信号,定义信号处理函数,当信号发生时,执行相应的自定义处理函数。3执行缺省操作,Linux对每种信号都规定了默认操作。 38、Linux系统的设备分为三类:字符设备、块设备与网络设备。Linux设备驱动程序与外界的接口可以分为如下3个部分:1)驱动程序与操作系统内核的接口:这就是通过数据结构来完成的。2)驱动程序与系统引导的接口:这部分利用驱动程序对设备进行初始化3)驱动程序与设备的接口:这部分描述了驱动程序如何与设备进行交互,这与具体设备密切相关。

39、模块在调用insmod命令时被加载,此时的入口点就是init_module()函数,通常在该函数中完成设备的注册。同样,模块在调用rmmod命令时被卸载,此时的入口点就是cleanup_module()函数,在该函数中完成设备的卸载。

40、为什么就是释放设备而不就是关闭?因为可能有其她应用程序还使用该设备。当一个进程释放设备时,其她进程还能继续使用该设备,而当一个进程关闭设备时,其她进程必须重新打开此设备才能使用它。

20、系统调用与API:系统调用就是指操作系统提供给用户程序调用的一组“特殊”接口,用户程序可以通过这组“特殊”接口来获得操作系统内核提供的服务。在实际使用中程序员调用的通常就是用户编程接口——API 42、/* copy_file、c */ #include #include #include #include #include #include #define BUFFER_SIZE 1024 #define SRC_ \#define OFFSET 10240 int main() { int src_file, dest_file;

unsigned char buff[BUFFER_SIZE]; int real_read_len; src_file = open(SRC_, O_RDONLY); dest_file = open(DEST_,

S_IRUSR|S_IWUSR|S_IRGRP|S_IROTH); if (src_file < 0 || dest_file < 0) { printf(\lseek(src_file, -OFFSET, SEEK_END);

while ((real_read_len = read(src_file, buff, sizeof(buff))) > 0) { write(dest_file, buff, real_read_len); }

close(dest_file); close(src_file); return 0; } 33、socket编程: 在Linux中的网络编程就是通过socket接口来进行的。socket就是一种特殊的I/O接口,它也就是一种文件描述符。它就是一种常用的进程之

嵌入式Linux应用程序开发过程考核【附答案】

间通信机制,通过它不仅能实现本地机器上的进程之间的通信,而且通过网络能够在不同机器上的进程之间进行通信。表示方法:每一个socket都用一个半相关描述{协议、本地地址、本地端口}来表示。类型:1、流式socket(使用TCP协议)2、数据报socket(使用UDP协议)3、原始socket(使用IP或ICMP进行直接访问)。两个数据结构:

struct sockaddr {

unsigned short sa_family; /*地址族*/

char sa_data[14]; /*14字节的协议地址,包含该socket的IP地址与端口号。*/ };

struct sockaddr_in

{ short int sa_family; /*地址族*/ unsigned short int sin_port; /*端口号*/ struct in_addr sin_addr; /*IP地址*/

unsigned char sin_zero[8]; /*填充0 以保持与struct sockaddr同样大小*/ };

转化:1)数据存储优先顺序的转化2)地址格式转化3)名字地址转化

4、linux中进程间通信的主要方式。

管道,信号,消息队列,共享内存,信号量,套接字

6、嵌入式 Linux 系统从软件的角度瞧通常可以分为四个层次(1)引导加载程序(2)Linux 内核(3)文件系统(4)用户应用程序。

16、交叉编译时宿主机与目标机间的连接方式 (1)串行通讯接口(2)以太网接口(3)USB接口(4)JTAG等接口

22、IO处理模型的概念(1)阻塞I/O模型(2)非阻塞模型(3)I/O多路转接模型(4)信号驱动I/O模型(5)异步I/O模型

31、线程的作用1)进一步减少处理机的空转时间2)支持多处理器3)减少上下文切换开销 24、进程控制块包括哪些信息? 1)进程标识符2)处理机的信息3)进程调度信息4)进程控制信息

5、文件的类型? ls –l 命令执行后后显示字符串的含义 普通文件,目录文件,链接文件,设备文件,管道,堆栈,套接字

(1)第一个字符显示文件的类型(2)第一个字符之后有3个三位字符组:

文件拥有者(u)文件用户组(g)系统其她用户(o)

26、进程就是Linux系统的基本调度与管理资源的单位,它就是通过进程控制块

来描述的。