linux考试复习题OK_第1页
linux考试复习题OK_第2页
linux考试复习题OK_第3页
linux考试复习题OK_第4页
linux考试复习题OK_第5页
已阅读5页,还剩8页未读 继续免费阅读

下载本文档

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

文档简介

1、第一章1什么是嵌入式系统?它由哪几部分组成?嵌入式系统是一应用为中心,以计算机技术为基础,切软硬件可裁减,对功能、可靠性、成本、体积、功耗有严格要求的专用计算机系统。3个主要的组成部分:硬件、实时操作系统以及应用软件。硬件:包括处理器、存储器(ROM、RAM)、输入输出设备、其他部分辅助系统等。实时操作系统:用于管理应用软件,并提供一种机制,使得处理器分时地执行各个任务并完成一定的时限要求 。应用软件:实现具体业务逻辑功能2嵌入式系统的三要素是什么?嵌入式系统的三要素是嵌入、专用、计算机。其中嵌入性指的是嵌入到对象体系中,有对象环境要求;专用性是指软、硬件按对象要求裁减;计算机指实现对象的智能

2、化功能。3列出5中以上的嵌入式实时操作系统。嵌入式实时操作系统是指操作系统本身要能在一个固定时限内对程序调用(或外部事件)做出正确的反应亦即对时序与稳定性的要求十分严格4嵌入式系统一般由几层组成?简单介绍其作用。嵌入式系统一般由硬件层、中间层、软件层和功能层组成。:(1)硬件层 :由嵌入式微处理器、外围电路和外设组成。(2)中间层 :硬件层与软件层之间为中间层.作用:将系统软件与底层硬件部分隔离,使得系统的底层设备驱动程序与硬件无关。(3)软件层 :主要是操作系统,有的还包括文件系统、图形用户接口和网络系统等。作用:操作系统是一个标准的内核将中断、I/O、定时器等资源都封装起来,以方便用户使用

3、。(4)功能层 :由基于操作系统开发的应用程序组成,用来完成对被控对象的控制功能。作用:功能层是面向被控对象和用户的,为了方便用户操作,往往需要具有友好的人机界面。5简述嵌入式系统中非占先式与占先式调度法的区别。非占先式调度法也称作合作型多任务,各个任务彼此合作共享一个CPU。中断服务可以使一个高优先级的任务由挂起状态变为就绪状态。但中断服务以后控制权还是回到原来被中断了的那个任务,直到该任务主动放弃CPU 的使用权时,那个高优先级的任务才能获得CPU 的使用权。当系统响应时间很重要时,要使用占先式(preemptive)内核。最高优先级的任务一旦就绪总能得到CPU 的控制权。当一个运行着的任

4、务使一个比它优先级高的任务进入了就绪态,当前任务的CPU 使用权就被剥夺了,或者说被挂起了,那个高优先级的任务立刻得到了CPU 的控制权。6简述什么是硬实时操作系统、软实时操作系统以及两者的区别。在实时系统中,如果系统在指定的时间内未能实现某个确定的任务,会导致系统的全面失败,这样的系统被称为强实时系统或硬实时系统。强实时系统响应时间一般在毫秒或微秒级。在弱实时系统中,虽然响应时间同样重要,但是超时却不会发生致命的错误。其系统响应时间在毫秒至秒的数量级上,其实时性的要求比强实时系统要差一些。7嵌入式系统的设计步骤有哪些?各部分主要工作是什么?嵌入式系统的设计步骤及各部分的主要工作如下。(1)需

5、求分析阶段,罗列出用户的需求。(2)体系结构设计阶段,描述系统的功能如何实现。3)详细设计阶段,进行硬件系统与软件系统的分类划分,以决定哪些功能用硬件实现,哪些用软件实现。(4)系统集成把系统的软件、硬件和执行装置集成在一起,进行调试,发现并改进在设计过程中的错误。5)系统测试对设计好的系统进行测试看其是否满足给定的要求。8.Linux作为嵌入式操作系统的优势有哪些?(1)可应用于多种硬件平台。Linux 已经被移植到多种硬件平台,这对于经费、时间受限制的研究与开发项目是很有吸引力的。原型可以在标准平台上开发后移植到 具体的硬件。(2)Linux 的高度模块化使添加部件非常容易。本身内置网络支

6、持,而目前嵌入式系统对网络支持要求越来越高。(3)Linux 是一个和Unix 相似、以内核为基础的、具有完全的内存访问控制,支持大量硬件等特性的一种通用操作系统。(4)Linux 可以随意地配置,不需要任何的许可证或商家的合作关系。其程序源码全部公开,这样开发人员可以对操作系统进行定制,适应其特殊需要。(5)Linux 带有Unix 用户熟悉的完善的开发工具不但成熟完善,9简述Linux需要进行进程调度的时机。Linux 执行进程调度一般是在以下情况发生的:(1)正在执行的进程运行完毕。(2)正在执行的进程调用阻塞原语将自己阻塞起来进入等待状态。(3)正在执行的进程调用了P 原语操作从而因资

7、源不足而被阻塞,或调用了V 原语操作激活了等待资源的进程队列。(4)执行中的进程提出I/O 请求后被阻塞。(5)系统分配的时间片已经用完。以上都是CPU 为不可剥夺方式下的引起进程调度的原因。在CPU 方式是可剥夺时还有下面的原因:(6)就绪队列中的某个进程的优先级变得高于当前运行进程的优先级,从而也将引起进程调度。第三章二、综合应用题1、已知C语言程序有主要程序模块prog.c、proc.h,其中调用了另一模块subr.c、subr.h中的功能。试写出一个可将这两个模块编译成可执行文件pr1的Makefile。pr1:prog.o subr.ogcc o pr1 prog.o subr.op

8、rog.o:prog.c prog.hgcc c o prog.o prog.csubr.o:subr.c subr.hgcc c o subr.o subr.c2、假定目录/home/arm下有一个C语言程序,它由几个单独的文件组成,而这几个文件又分别包含了其他文件,如下表所示。完成下列任务(1) 编写Makefile文件,最终的目标文件为hello,交叉编译器为arm-linux-gcc。hello:main.o list.o symbol.o table.oarm-linux-gcc o hello main.o list.o symbol.o table.omain.o:main.c

9、stdio.h table.h symbol.h list.harm-linux-gcc -c o main.o main.clist.o:list.c list.harm-linux-gcc c o list.o list.csymbol.o:symbol.c symbol.h arm-linux-gcc c o symbol.o symbol.ctable.o:table.c table.h symbol.h list.harm-linux-gcc c o table.o table.cclear:rm f hello *.o(2) 在目标机上通过网络文件系统挂载/mnt到宿主机上的/ho

10、me/arm目录。mount t nfs o nolock IP地址:/home/arm /mnt3.在Linux操作系统下,编程实现以下功能。(1)主程序hello.c(打印“hello world!”)。(2)主程序通过头文件hello.h调用message函数。(3)message函数有message.c定义(打印“This is a message!”)。/hello.h#ifndef HELLO_H#define HELLO_Hvoid message();#endif/message.c#include#include”hello.h”void message() printf(“

11、this is a message!”); /hello.c#include#include#include#include”hello.h”void main(int argc,char *argv)printf(“hello world!n”);message(); return 0; 第六章一简答题1、 何为虚拟内存?虚拟内存的管理有何作用?使用虚拟地址寻址整个系统的主存和辅存的方式在现代操作系统中被称为虚拟内存。MMU 便是实现虚拟内存的必要条件。嵌入式处理器如果存在MMU ,由于在MMU 具备内存地址映射和寻址功能,操作系统会使用它完成从虚拟地址到物理地址的转换, 所有的应用程序只需

12、要使用虚拟地址寻址数据。虚拟内存的管理方法使系统既可以运行体积比物理内存还要大的应用程序,也可以实现“按需调页”策略,既满足了程序的运行速度,又节约了物理内存空间。2、 进程内存区域涉及哪几种数据段?进程内存区域涉及到5 种数据段,即: 码段:代码段是用来存放可执行文件的操作指令,也就是说是它是可执行程序在内存中的镜像。数据段:数据段用来存放可执行文件中已初始化全局变量,换句话说就是存放程序静态分配的变量和全局变量。BSS 段:BSS 段包含了程序中未初始化的全局变量,在内存中 BSS 段全部置零。堆:堆是用于存放进程运行中被动态分配的内存段,它的大小并不固定,可动态扩张或缩减。栈:栈是用户存

13、放程序临时创建的局部变量,也就是说函数括弧“”中定义的变量除此以外,在函数被调用时,其参数也会被压入发起调用的进程栈中,并且待到调用结束后,函数的返回值也会被存放回栈中。3、 简述内核空间和用户空间的区别。在Linux 系统中,内核在最高级执行,也称为“系统态”,在这一级任何操作都可以执行。而应用程序则执行在最低级,即所谓的“用户态”。在这一级处理器禁止对硬件的直接访问和对内存的未授权访问。模块是在所谓的“内核空间”中运行的,而应用程序则是在“用户空间”中运行的。它们分别引用不同的内存映射,也就是程序代码使用不同的“地址空间”。4、简述共享内存的作用?共享内存区域是被多个进程共享的一部分物理内

14、存。如果多个进程都把该内存区域映射到自己的虚拟地址空间,则这些进程就都可以直接访问该共享内存区域,从而可以通过该区域进行通信。共享内存是进程间共享数据的一种最快的方法,一个进程向共享内存区域写入了数据,共享这个内存区域的所有进程就可以立刻看到其中的内容。这块共享虚拟内存的页面,出现在每一个共享该页面的进程的页表中。但是它不需要在所有进程的虚拟内存中都有相同的虚拟地址。5、简述内存管理与虚拟文件系统之间的关系。 内存管理利用虚拟文件系统支持交换,交换进程(swapd)定期由调度程序调度,这也是内存管理依赖于进程调度的唯一原因。当一个进程存取的内存映射被换出时,内存管理向文件系统发出请求,同时挂起

15、当前正在运行的进程。第七章二、编程题1、用C语言编写一个源程序main.c,实现以下功能。(1)打开当前目录下的文件“test.txt”,如果没有则创建该文件,并使其具体读写属性。Void main(void)int fid;fid = open(“./test.txt”,O_RDWR|O_CREAT);if(fid=-1) Printf(“open or create error n”);exit(0); Close(fid); (2)编写一个makefile实现自动编译,生成可执行文件 main。objects = main.oexec = mainall:$(objects)gcc o

16、$(exec) $(objects)main.o:main.cgcc c main.cclean:rm r $(exec) $(objects)2、编写一个程序实现把一个文件内容复制到另一个文件中。2.参考程序:#include #include #include #include #include #include #define BUFFER_SIZE 1024int main(int argc,char *argv)int from_fd,to_fd;int bytes_read,bytes_write;char bufferBUFFER_SIZE;char *ptr;if(argc!=

17、3) fprintf(stderr,Usage:%s fromfile tofilena,argv0);exit(1);/* 打开源文件 */if(from_fd=open(argv1,O_RDONLY)=-1) fprintf(stderr,Open %s Error:%sn,argv1,strerror(errno);exit(1); /* 创建目的文件 */if(to_fd=open(argv2,O_WRONLY|O_CREAT,S_IRUSR|S_IWUSR)=-1)fprintf(stderr,Open %s Error:%sn,argv2,strerror(errno);exit(

18、1);/* 以下代码是一个经典的拷贝文件的代码 */while(bytes_read=read(from_fd,buffer,BUFFER_SIZE)if(bytes_read=-1)&(errno!=EINTR) break; /*发生读错误,退出循环*/else if(bytes_read0)ptr=buffer;while(bytes_write=write(to_fd,ptr,bytes_read)if(bytes_write=-1)&(errno!=EINTR)break; /*若写错误,退出循环*/* 写完了所有读的字节 */else if(bytes_write=bytes_re

19、ad) break;/*读写字节不等退出循环*/else if(bytes_write0) /* 只写了一部分,继续写 */ptr+=bytes_write;bytes_read-=bytes_write; if(bytes_write=-1)break; /* 写的时候发生的致命错误 */ close(from_fd);close(to_fd); exit(0);4、 从键盘上输入两个学生的基本信息,然后写入一个到文件中,最后读出这两个学生的数据,并显示在屏幕上。#include struct student char name10;int age; ;int main() FILE *fp

20、;int i;struct student boya2, boyb2, *pp, *qq;if(fp = fopen(7-6.txt,w+)= NULL) /打开文件printf(Can not open file, exit .n);return -1; pp = boya;qq = boyb;printf(please input data:n); /输入学生信息for (i = 0; i name, &pp-age);pp = boya;fwrite(pp, sizeof(struct student), 2, fp); /把学生信息写入文件rewind(fp); /重定位文件fread

21、(qq, sizeof(struct student), 2, fp); /从文件中读取学生信息printf(namettagen);for(i = 0; i name, qq-age);fclose(fp);return 0;4、编写一个对文件加写入锁的程序。写入锁是互斥锁,一个时刻只能有一个写入锁存在。并在两个终端分别运行,验证先运行的那个终端能成功上锁,后运行的那个无效。 /*fcntl_write.c 测试文件写入锁主函数部分*/#i nclude unistd.h#i nclude sys/file.h#i nclude sys/types.h#i nclude sys/stat.h

22、#i nclude stdio.h#i nclude stdlib.h/*lock_set 函数*/void lock_set(int fd, int type)struct flock lock;lock.l_whence = SEEK_SET;/赋值lock 结构体lock.l_start = 0;lock.l_len =0;while(1)lock.l_type = type;/*根据不同的type 值给文件上锁或解锁*/if(fcntl(fd, F_SETLK, &lock) = 0)if( lock.l_type = F_RDLCK )printf(read lock set by

23、%d/n,getpid();else if( lock.l_type = F_WRLCK )printf(write lock set by %d/n,getpid();else if( lock.l_type = F_UNLCK )printf(release lock by %d/n,getpid();return;/*判断文件是否可以上锁*/fcntl(fd, F_GETLK,&lock);/*判断文件不能上锁的原因*/if(lock.l_type != F_UNLCK)/*/该文件已有写入锁*/if( lock.l_type = F_RDLCK )printf(read lock al

24、ready set by %d/n,lock.l_pid);/*该文件已有读取锁*/else if( lock.l_type = F_WRLCK )printf(write lock already set by %d/n,lock.l_pid);getchar(); int main(void) int fd;/*首先打开文件*/fd=open(hello,O_RDWR | O_CREAT, 0666);if(fd 0)perror(open);exit(1);/*给文件上写入锁*/lock_set(fd, F_WRLCK);getchar();/*给文件接锁*/lock_set(fd, F

25、_UNLCK);getchar();close(fd);exit(0); 第八章三、编程题1、编程创建一个特定的IPC结构的关键字和一个信号量,建立此信号量的索引,修改索引指向的信号量的值,最后清除信号量(注:利用函数frok生成上文所说的唯一IPC关键字。)void main() key_t unique_key; /* 定义一个IPC 关键字*/int id;struct sembuf lock_it;union semun options;int i;unique_key = ftok(., a); /* 生成关键字字符a是一个随机种子*/* 创建一个新的信号量集合*/id = semg

26、et(unique_key, 1, IPC_CREAT | IPC_EXCL | 0666);printf(semaphore id=%dn, id);options.val = 1; /*设置变量值*/semctl(id, 0, SETVAL, options); /*设置索引0 的信号量*/*打印出信号量的值*/i = semctl(id, 0, GETVAL, 0);printf(value of semaphore at index 0 is %dn, i);/*下面重新设置信号量*/lock_it.sem_num = 0; /*设置哪个信号量*/lock_it.sem_op = -1

27、; /*定义操作*/lock_it.sem_flg = IPC_NOWAIT; /*操作方式*/if (semop(id, &lock_it, 1) = -1) printf(can not lock semaphore.n);exit(1);i = semctl(id, 0, GETVAL, 0);printf(value of semaphore at index 0 is %dn, i);/*清除信号量*/semctl(id, 0, IPC_RMID, 0);2、守护进程编程。守护进程实例包括两部分:主程序test.c和初始化程序init.c。主程序每隔一分钟向/temp目录的日志tes

28、t.log报告运行状态;初始化程序中的init_daemon函数负责生成守护进程。可以利用init_daemon函数生成自己的守护进程。void init_daemon(void)int pid; int i; if (pid=fork() exit(0);/是父进程,结束父进程 else if (pid 0) exit(1);/fork失败,退出 setsid(); if (pid=fork() exit(0);/是第一子进程,结束第一子进程 else if (pid 0) exit(1);/fork失败,退出 for (i=0;i NOFILE;+i)/关闭打开的文件描述符 close(i

29、); chdir(/tmp);/改变工作目录到/tmp umask(0);/重设文件创建掩模 return; 2 test.c清单#include #include void init_daemon(void);/守护进程初始化函数main() FILE *fp; time_t t; init_daemon();/初始化为Daemon while (1)/每隔一分钟向test.log报告运行状态 sleep(60);/睡眠一分钟 if (fp=fopen(test.log,a) =0) t=time(0); fprintf(fp,Im here at %sn,asctime(localtime

30、(&t) ); fclose(fp); 3、编程实现父进程和子进程间的通信。程序包括:创建无名管道、子进程向父进程写数据及关闭管道的读端、父进程从管道读取子进程写的数据及关闭管道的写端、读有名管道和写有名管道。void main() int file_descriptors2;/*定义子进程号 */pid_t pid;char buf256;int returned_count;/*创建无名管道*/pipe(file_descriptors);/*创建子进程*/if(pid = fork() = -1) printf(Error in forkn);exit(1);/*执行子进程*/if(pi

31、d = 0) printf(in the spawned (child) process.n);/*子进程向父进程写数据关闭管道的读端*/close(file_descriptorsINPUT);write(file_descriptorsOUTPUT, test data, strlen(test data);exit(0); else /*执行父进程*/printf(in the spawning (parent) process.n);/*父进程从管道读取子进程写的数据关闭管道的写端*/close(file_descriptorsOUTPUT);returned_count = read

32、(file_descriptorsINPUT, buf, sizeof(buf);printf(%d bytes of data received from spawned process: %sn,returned_count, buf);在Linux 系统下,有名管道可由两种方式创建,命令行方式mknod 系统调用和函数mkfifo。下面的两种途径都在当前目录下生成了一个名为myfifo 的有名管道,方式一,mkfifo(myfifo,rw);方式二,mknod myfifo p生成了有名管道后,就可以使用一般的文件I/O 函数如open、close、read、write 等来对它进行操作

33、。下面即是一个简单的例子,假设我们已经创建了一个名为myfifo 的有名管道。/* 进程一,读有名管道*/#define INPUT 0#define OUTPUT void main() FILE * in_file;int count = 1;char buf80;in_file = fopen(mypipe, r);if (in_file = NULL) printf(Error in fdopen.n);exit(1);while (count = fread(buf, 1, 80, in_file) 0)printf(received from pipe: %sn, buf);fcl

34、ose(in_file);/* 进程二,写有名管道*/#include#includevoid main() FILE * out_file;int count = 1;char buf80;out_file = fopen(mypipe, w);if (out_file = NULL) printf(Error opening pipe.);exit(1);sprintf(buf,this is test data for the named pipe examplen);fwrite(buf, 1, 80, out_file);fclose(out_file);第十章3预处理、编译、汇编和

35、连接4. step next1、下列提法中,属于ifconfig命令作用范围的是(B)B、配置网卡的IP地址 2、在FTP协议中,控制连接是由(B)主动建立的。B、客户端 3、当与某远程网络连接不上时,需要跟踪路由查看,以便了解在网络的什么位置出现了问题,满足该目的命令是(traceroute)。5、局域网的网络地址/24,局域网络连接其它网络的网关地址是。主机0访问/24网络时,其路由设置正确的是( B )。B) route add net gw netmask

36、 55 metric 15、 如果想配置一台匿名FTP服务器,应修改(/etc/ftpusers)。6、 要配置NFS服务器,在服务器端主要配置(/etc/exports)文件。7、 在TCP/IP模型中,应用层包含了所有的高层协议,在下列的一些应用协议中,(B)能够实现本地与远程主机之间的文件传输工作。 B、Ftp 8、 DNS域名系统主要负责主机名和(IP地址)之间的解析。10、请选择正确的命令( B),完成加载 NFS Server 的 /home/nfs 到 /home2。B.、mount -t -s nfs svr.server.

37、net /home/nfs /home2三、选择题1、一般可以用(make)实现自动编译。2假使当前目录下有文件Makefile,其内容如下。现在执行命令make clear,实际执行的命令是(rm f pr1 *.o)。3、嵌入式系统应用软件一般在宿主机上开发,在目标机上运行,因此需要的一个(交叉编译)环境。4、假设用vi编辑器编写了一个脚本文件shell.sh,现想将该文件名称修改为shell2.sh,(mv shell.sh shell2.sh)命令可以实现。5、在使用GCC编辑器的过程中,(-o)选项可用来指定生成的目标文件名。6、假设当前目录下有文件Makefile,其内容如下。现在

38、执行命令make subr.o,实际执行的命令是(gcc c o subr.o subr.c)。7、为了使生成的目标文件能够用于GDB调试,在编译时GCC应使用(-g)选项。8、存盘并退出vi的指令是(wq)。9、在Linux下使用GCC编译器时,有命令gcc g test.c o test,其中参数-g的作用是(生成文件包含调试信息)。10、fstab文件存放在(/ect)目录中。11、init启动进程需要读取(/etc/inittab)配置文件。第四章1. LINUX支持网络文件系统NFS, (mount -t nfs :/opt/sirnfs /mnt/sirnfs

39、)命令实现了将位于 机器上的 /opt/sirnfs 目录挂载到本机/mnt/sirnfs下。2、以下叙述中正确的是(C)C、在嵌入式系统开发中,通常采用的是交叉编译器。3、以下做法不利于嵌入式应用软件的移植的是 D 。D) 在数据类型上,尽量直接使用C语言的数据类型4. 如果Boot Loader、内核、启动参数以及其他的系统映像四部分在固态存储设备上分别独立存放,则其存储结构的分配顺序应当是(Bootloader、启动参数、内核、文件系统)。 5. Boot Loader 的stage2通常使用C语言实现,以完成复杂的功能,并增加可读性和可移植性,以下哪一步骤属于stage2的内容:(D) D . 将 kernel 映像和根文件系统映像从 flash 上读到 RAM 空间中6、在Linux 2.4或者2.6内核中,和ARM体系结构相关的中断处理程序的C代码在源码树的(arch/arm/kernel/irq.c)文件中7、下面对于BootLoader的描述不正确的是(C)C、BootLoader的两种模式对开发人员没有意义8、(make menuconfig

温馨提示

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

评论

0/150

提交评论