第一章1.什么是嵌入式系统?它由哪几部分组成?嵌入式系统是一应用为中心,以计算机技术为基础,切软硬件可裁减,对功能、可靠性、成本、体积、功耗有严格要求的专用计算机系统。3个主要的组成部分:硬件、实时操作系统以及应用软件。硬件:包括处理器、存储器(ROM、RAM)、输入输出设备、其他部分辅助系统等。实时操作系统:用于管理应用软件,并提供一种机制,使得处理器分时地执行各个任务并完成一定的时限要求。应用软件:实现具体业务逻辑功能2.嵌入式系统的三要素是什么?嵌入式系统的三要素是嵌入、专用、计算机。其中嵌入性指的是嵌入到对象体系中,有对象环境要求;专用性是指软、硬件按对象要求裁减;计算机指实现对象的智能化功能。3.列出5中以上的嵌入式实时操作系统。嵌入式实时操作系统是指操作系统本身要能在一个固定时限内对程序调用(或外部事件)做出正确的反应�亦即对时序与稳定性的要求十分严格4.嵌入式系统一般由几层组成?简单介绍其作用。嵌入式系统一般由硬件层、中间层、软件层和功能层组成。:(1)硬件层:由嵌入式微处理器、外围电路和外设组成。(2)中间层:硬件层与软件层之间为中间层.作用:将系统软件与底层硬件部分隔离,使得系统的底层设备驱动程序与硬件无关。(3)软件层:主要是操作系统,有的还包括文件系统、图形用户接口和网络系统等。作用:操作系统是一个标准的内核�将中断、I/O、定时器等资源都封装起来,以方便用户使用。(4)功能层:由基于操作系统开发的应用程序组成,用来完成对被控对象的控制功能。作用:功能层是面向被控对象和用户的,为了方便用户操作,往往需要具有友好的人机界面。5.简述嵌入式系统中非占先式与占先式调度法的区别。非占先式调度法也称作合作型多任务,各个任务彼此合作共享一个CPU。中断服务可以使一个高优先级的任务由挂起状态变为就绪状态。但中断服务以后控制权还是回到原来被中断了的那个任务,直到该任务主动放弃CPU的使用权时,那个高优先级的任务才能获得CPU的使用权。当系统响应时间很重要时,要使用占先式(preemptive)内核。最高优先级的任务一旦就绪�总能得到CPU的控制权。当一个运行着的任务使一个比它优先级高的任务进入了就绪态,当前任务的CPU使用权就被剥夺了,或者说被挂起了,那个高优先级的任务立刻得到了CPU的控制权。6.简述什么是硬实时操作系统、软实时操作系统以及两者的区别。在实时系统中,如果系统在指定的时间内未能实现某个确定的任务,会导致系统的全面失败,这样的系统被称为强实时系统或硬实时系统。强实时系统响应时间一般在毫秒或微秒级。在弱实时系统中,虽然响应时间同样重要,但是超时却不会发生致命的错误。其系统响应时间在毫秒至秒的数量级上,其实时性的要求比强实时系统要差一些。7.嵌入式系统的设计步骤有哪些?各部分主要工作是什么?嵌入式系统的设计步骤及各部分的主要工作如下。(1)需求分析阶段,罗列出用户的需求。(2)体系结构设计阶段,描述系统的功能如何实现。3)详细设计阶段,进行硬件系统与软件系统的分类划分,以决定哪些功能用硬件实现,哪些用软件实现。(4)系统集成�把系统的软件、硬件和执行装置集成在一起,进行调试,发现并改进在设计过程中的错误。5)系统测试�对设计好的系统进行测试�看其是否满足给定的要求。8.Linux作为嵌入式操作系统的优势有哪些?(1)可应用于多种硬件平台。Linux已经被移植到多种硬件平台,这对于经费、时间受限制的研究与开发项目是很有吸引力的。原型可以在标准平台上开发后移植到具体的硬件。(2)Linux的高度模块化使添加部件非常容易。本身内置网络支持,而目前嵌入式系统对网络支持要求越来越高。(3)Linux是一个和Unix相似、以内核为基础的、具有完全的内存访问控制,支持大量硬件等特性的一种通用操作系统。(4)Linux可以随意地配置,不需要任何的许可证或商家的合作关系。其程序源码全部公开,这样开发人员可以对操作系统进行定制,适应其特殊需要。(5)Linux带有Unix用户熟悉的完善的开发工具不但成熟完善,9.简述Linux需要进行进程调度的时机。Linux执行进程调度一般是在以下情况发生的:(1)正在执行的进程运行完毕。(2)正在执行的进程调用阻塞原语将自己阻塞起来进入等待状态。(3)正在执行的进程调用了P原语操作�从而因资源不足而被阻塞,或调用了V原语操作激活了等待资源的进程队列。(4)执行中的进程提出I/O请求后被阻塞。(5)系统分配的时间片已经用完。以上都是CPU为不可剥夺方式下的引起进程调度的原因。在CPU方式是可剥夺时�还有下面的原因:(6)就绪队列中的某个进程的优先级变得高于当前运行进程的优先级,从而也将引起进程调度。第三章二、综合应用题1、已知C语言程序有主要程序模块prog.c、proc.h,其中调用了另一模块subr.c、subr.h中的功能。试写出一个可将这两个模块编译成可执行文件pr1的Makefile。pr1:prog.osubr.ogcc–opr1prog.osubr.oprog.o:prog.cprog.hgcc–c–oprog.oprog.csubr.o:subr.csubr.hgcc–c–osubr.osubr.c2、假定目录/home/arm下有一个C语言程序,它由几个单独的文件组成,而这几个文件又分别包含了其他文件,如下表所示。完成下列任务(1)编写Makefile文件,最终的目标文件为hello,交叉编译器为arm-linux-gcc。hello:main.olist.osymbol.otable.oarm-linux-gcc–ohellomain.olist.osymbol.otable.omain.o:main.cstdio.htable.hsymbol.hlist.harm-linux-gcc-c–omain.omain.clist.o:list.clist.harm-linux-gcc–c–olist.olist.csymbol.o:symbol.csymbol.harm-linux-gcc–c–osymbol.osymbol.ctable.o:table.ctable.hsymbol.hlist.harm-linux-gcc–c–otable.otable.cclear:rm–fhello*.o(2)在目标机上通过网络文件系统挂载/mnt到宿主机上的/home/arm目录。mount–tnfs–onolockIP地址:/home/arm/mnt3.在Linux操作系统下,编程实现以下功能。(1)主程序hello.c(打印“helloworld!”)。(2)主程序通过头文件hello.h调用message函数。(3)message函数有message.c定义(打印“Thisisamessage!”)。//hello.h#ifndefHELLO_H#defineHELLO_Hvoidmessage();#endif//message.c#includestdio.h#include”hello.h”voidmessage(){printf(“thisisamessage!”);}//hello.c#includestdio.h#includestdlib.h#includeString#include”hello.h”voidmain(intargc,char*argv[]){printf(“helloworld!\n”);message();return0;}第六章一简答题1、何为虚拟内存?虚拟内存的管理有何作用?使用虚拟地址寻址整个系统的主存和辅存的方式在现代操作系统中被称为虚拟内存。MMU便是实现虚拟内存的必要条件。嵌入式处理器如果存在MMU,由于在MMU具备内存地址映射和寻址功能,操作系统会使用它完成从虚拟地址到物理地址的转换,所有的应用程序只需要使用虚拟地址寻址数据。虚拟内存的管理方法使系统既可以运行体积比物理内存还要大的应用程序,也可以实现“按需调页”策略,既满足了程序的运行速度,又节约了物理内存空间。2、进程内存区域涉及哪几种数据段?进程内存区域涉及到5种数据段,即:①码段:代码段是用来存放可执行文件的操作指令,也就是说是它是可执行程序在内存中的镜像。②数据段:数据段用来存放可执行文件中已初始化全局变量,换句话说就是存放程序静态分配的变量和全局变量。③BSS段:BSS段包含了程序中未初始化的全局变量,在内存中BSS段全部置零。④堆:堆是用于存放进程运行中被动态分配的内存段,它的大小并不固定,可动态扩张或缩减。⑤栈:栈是用户存放程序临时创建的局部变量,也就是说函数括弧“{}”中定义的变量除此以外,在函数被调用时,其参数也会被压入发起调用的进程栈中,并且待到调用结束后,函数的返回值也会被存放回栈中。3、简述内核空间和用户空间的区别。在Linux系统中,内核在最高级执行,也称为“系统态”,在这一级任何操作都可以执行。而应用程序则执行在最低级,即所谓的“用户态”。在这一级处理器禁止对硬件的直接访问和对内存的未授权访问。模块是在所谓的“内核空间”中运行的,而应用程序则是在“用户空间”中运行的。它们分别引用不同的内存映射,也就是程序代码使用不同的“地址空间”。4、简述共享内存的作用?共享内存区域是被多个进程共享的一部分物理内存。如果多个进程都把该内存区域映射到自己的虚拟地址空间,则这些进程就都可以直接访问该共享内存区域,从而可以通过该区域进行通信。共享内存是进程间共享数据的一种最快的方法,一个进程向共享内存区域写入了数据,共享这个内存区域的所有进程就可以立刻看到其中的内容。这块共享虚拟内存的页面,出现在每一个共享该页面的进程的页表中。但是它不需要在所有进程的虚拟内存中都有相同的虚拟地址。5、简述内存管理与虚拟文件系统之间的关系。内存管理利用虚拟文件系统支持交换,交换进程(swapd)定期由调度程序调度,这也是内存管理依赖于进程调度的唯一原因。当一个进程存取的内存映射被换出时,内存管理向文件系统发出请求,同时挂起当前正在运行的进程。第七章二、编程题1、用C语言编写一个源程序main.c,实现以下功能。(1)打开当前目录下的文件“test.txt”,如果没有则创建该文件,并使其具体读写属性。Voidmain(void){intfid;fid=open(“./test.txt”,O_RDWR|O_CREAT);if(fid==-1){Printf(“openorcreateerror\n”);exit(0);}Close(fid);}(2)编写一个makefile实现自动编译,生成可执行文件main。objects=main.oexec=mainall:$(objects)gcc–o$(exec)$(objects)main.o:main.cgcc–cmain.cclean:rm–r$(exec)$(objects)2、编写一个程序实现把一个文件内容复制到另一个文件中。2.参考程序:#includesys/types.h#includesys/stat.h#includefcntl.h#includestdlib.h#includeunistd.h#includestdio.h#defineBUFFER_SIZE1024intmain(intargc,char**argv){intfrom_fd,to_fd;intbytes_read,bytes_write;charbuffer[BUFFER_SIZE];char*ptr;if(argc!=3){fprintf(stderr,Usage:%sfromfiletofile\n\a,argv[0]);exit(1);}/*打开源文件*/if((from_fd=open(argv[1],O_RDONLY))==-1){fprintf(stderr,Open%sError:%s\n,argv[1],strerror(errno));exit(1);}/*创建目的文件*/if((to_fd