(第1页共7页)湘潭大学兴湘学院2009年下学期《嵌入式系统Ⅰ》期末考试试卷适用年级专业06级计算机科学与技术,网络工程考试方式闭卷考试时间120分钟学院专业班级学号姓名题号一二三总分阅卷教师得分………………………………………………………………………………………………………………一、选择题(每题2分,共40分)请将选择题的答案填入下表,答案以表中的为准!题目12345678910答DDDDBBCAAD案题目11121314151617181920答案DCCABDCBBB1.下列不是嵌入式系统特点的是:A.系统内核小B.专用性强C.系统精简D.实时性要求不高2.关于ARM汇编和C语言混合编程下列错误的是:A.C语言中可以直接嵌入某些汇编指令B.C语言中可以调用汇编的子程序C.汇编程序中可以调用C语言的函数D.C语言嵌入的汇编指令时,不可以使用C的变量3.关于ATPCS规则,说法错误的是:A.只能使用R0-R3来传递参数B.R13为堆栈指针SP,需要保护C.R14为连接寄存器,用于存放程序返回地址D.单字的返回值存放在R04.关于交叉编译描述正确的是:A.编译器运行在目标机,生成的可执行文件在宿主机上运行B.编译器运行在宿主机,生成的可执行文件在宿主机上运行C.编译器运行在目标机,生成的可执行文件在目标机上运行D.编译器运行在宿主机,生成的可执行文件在目标机上运行5.建立嵌入式Linux开发环境中,使用Bootp协议的直接目的是:A.分配宿主机的IP地址B.分配目标机的IP地址C.用于宿主机和目标机之间通讯D.用于监控目标机的运行。6.关于make工具的使用,下面错误的是:A.不指定目标时,make缺省处理makefile文件的第一个目标。B.makefile文件中对宏名的引用为#(宏名)。C.makefile文件中$@参数表示一条规则中目标的名字。D.makeCC=arm-linux-gcc命令表示使用arm-linux-gcc代替makefile文件中得分制卷人签名:制卷日期:审核人签名::审核日期:………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………装……………………订……………………线…………………………………………………………………(第2页共7页)CC的宏定义执行make命令。7.下面不属于嵌入式操作系统的是:A.VxWorksB.QNXC.MacOSD.WinCE8.关于Linux2.4内核,说法错误的是:A.Linux为单内核,效率高,紧凑B.按进程优先级调度C.具有虚拟文件系统,可以支持多种文件系统D.设备驱动模块化9.嵌入式Linux开发中使用GDB调试,说法错误的是:A.GDB程序在宿主机上运行B.需要使用远程调试模式C.需要交叉编译GDBServerD.被调试程序在宿主机上运行10.下列属于常见的嵌入式GUI的有:A.WindowsB.QTC.GNOMED.MiniGUI11.Linux将设备分成三类,不是这三类的是:A.网络设备B.字符设备C.块设备D.杂项设备12.关于二阶段BootLoader说法错误的是:A.BootLoader的第一阶段代码全部由汇编语言构成;B.BootLoader的第一阶段代码在Flash中运行;C.BootLoader中可以使用glib库中的函数;D.BootLoader第二阶段代码大部分由C语言写成,所以需要使用栈。13.关于Linux存储管理,错误的是:A.使用页式的虚拟内存管理B.每个进程都有4GB内存C.最低1G是内核空间D.使用三级页表14.嵌入式系统一般由嵌入式微处理器,系统外部电路,,和特定应用程序4个部分组成。A.嵌入式操作系统B.硬件驱动程序C.BootLoaderD.文件系统15.向无任何程序的目标机中写入BootLoader程序,一般使用下面那种接口:A.串口B.JTAGC.EthernetD.USB16.关于ARM7系列微处理器的操作模式,不对的是:A.一共有7种操作模式B.除了用户模式,其他都为特权模式C.不同模式下使用的寄存器可能会不相同D.通过改变SPSR中的低5位来切换模式17.关于BusyBox,下列说法错误的是:A.它常用来构建嵌入式Linux的根文件系统B.支持的shell命令可以进行配置C.支持的命令完全和Linux命令相同D.作为嵌入式Linux根文件系统时需要交叉编译18.Linux网络设备驱动中用于在Linux网络子系统中的各层之间传递数据的数据结构为:A.net_deviceB.sk_buffC.net_devD.skb19.在Linux2.6中,关于中断下列说法错误的是:A.中断处理分为顶半部和底半部B.中断处理中可能没有底半部C.底半部支持Tasklet,工作队列,软中断三种机制D.Tasklet方法可以被睡眠20.有关Linux内核裁剪下列说法错误的是A.可以使用makemenuconfig命令进行内核的配置B.所有的配置项都可以按以编译入内核,编译成模块,不编译三种方式配置C.使用makezImage命令会编译生成内核镜像文件zImageD.嵌入式Linux内核编译时应该采用交叉编译器(第3页共7页)二、问答题(三题,共30分)1.简述使用Linux的socket建立UDP服务端程序的步骤及相关函数。(10分)答:(1)创建UDP套接字(2)捆绑服务器端口到套接字(3)把套接字换成监听套接字(4)接收用户的连接,发送应答(5)停止服务2.嵌入式Linux开发中经常使用NFS,使得开发变得更加简便。请问在已经具有支持NFS的内核的嵌入式Linux开发平台上怎么配置NFS服务,请写出必要的步骤?(7分)答:1)配置NFS服务器要配置NFS服务器,可以通过使用文本编辑器(如vi或gedit)修改配置文件/etc/exports的方法来完成。在每次改变/etc/exports的时候,必须把改变通知给NFS守护进程,或使用以下命令来重新载入配置文件:/sbin/servicenfsreload2)启动和停止NFS服务要启动或停止NFS服务,必须以root登录并使用以下命令来启动NFS守护进程,其命令格式如下:/sbin/servicenfs[start|stop]要启动NFS,在“#”提示符下键入以下命令行:/sbin/servicenfsstart该命令在执行过程中会显示启动过程是否正确。要停止NFS,则在“#”提示符下键入以下命令行:/sbin/servicenfsstop还可以使用以下命令来查看NFS守护进程的状态:/sbin/servicenfsstatus3.请描述建立一个嵌入式开发平台的步骤。(13分)答:(1)连接主机和目标板(2)使用flash工具烧写bootloader(3)配置并启动主机的bootp服务(4)配置并启动主机的tftp服务(5)使用tftp下载内核及根文件系统镜像到目标板,重启目标板(6)配置并启动NFS服务(7)在目标板使用mount挂载主机的目录(8)再次使用bootp命令确认bootp服务是否建立,使用tftp命令确认tftp服务建立。(9)将内核镜像和根文件系统cp到tftp根目录。(10)重启目标板,确认嵌入式linux正常启动。得分(第4页共7页)三、应用题(共30分)1.下面是一个带并发控制的全局内存虚拟字符设备驱动的一部分,请完成程序填空。#defineGLOBALMEM_SIZE0x1000/*全局内存最大4K字节*/#defineMEM_CLEAR0x1/*清0全局内存*/#defineGLOBALMEM_MAJOR254/*预设的globalmem的主设备号*/staticglobalmem_major=GLOBALMEM_MAJOR;/*globalmem设备结构体*/structglobalmem_dev{structcdevcdev;/*cdev结构体*/unsignedcharmem[GLOBALMEM_SIZE];/*全局内存*/structsemaphoresem;/*并发控制用的信号量*/};structglobalmem_dev*globalmem_devp;/*设备结构体指针*//*文件打开函数*/intglobalmem_open(structinode*inode,structfile*filp){/*将设备结构体指针赋值给文件私有数据指针*/filp-private_data=(1)globalmem_devp;return0;}/*文件释放函数*/intglobalmem_release(structinode*inode,structfile*filp){return0;}/*ioctl设备控制函数*/staticintglobalmem_ioctl(structinode*inodep,structfile*filp,unsignedintcmd,unsignedlongarg){structglobalmem_dev*dev=filp-private_data;/*获得设备结构体指针*/switch(cmd){caseMEM_CLEAR:if((2)down_interruptible(&dev-sem)){//获取信号量return-ERESTARTSYS;}memset(dev-mem,0,GLOBALMEM_SIZE);(3)up(&dev-sem);//释放信号量printk(KERN_INFOglobalmemissettozero\n);break;default:return-EINVAL;}return0;得分(第5页共7页)}/*读函数*/staticssize_tglobalmem_read(structfile*filp,char__user*buf,size_tsize,loff_t*ppos){unsignedlongp=*ppos;unsignedintcount=size;intret=0;structglobalmem_dev*dev=filp-private_data;/*获得设备结构体指针*//*分析和获取有效的写长度*/if(p=GLOBALMEM_SIZE)returncount?-ENXIO:0;if(countGLOBALMEM_SIZE-p)count=GLOBALMEM_SIZE-p;if((2)down_interruptible(&dev-sem)){return-ERESTARTSYS;}/*内核空间-用户空间*/if((4)copy_to_user(buf,(void*)(dev-mem+p),count)){ret=-EFAULT;}else{(5)*ppos+=count;ret=count;printk(KERN_INFOread%dbytes(s)from%d\n,count,p);}(3)up(&dev-sem);//释放信号量returnret;}/*写函数*/staticssize_tglobalmem_write(structfile*filp,constchar__user*buf,size_tsize,loff_t*ppos){unsignedlongp=*ppos;unsignedintcount=size;intret=0;structglobalmem_dev*dev=filp-private_data;/*获得设备结构体指针*//*分析和获取有效的写长度*/if(p=GLOBALMEM_SIZE)returncount?-ENXIO:0;if(countGLOBALMEM_SIZE-p)count=GLOBALMEM_SIZE-p;if((2)down_interruptible(&dev-sem)){//获得信号量return-ERESTARTSYS;}/*用户空间-内核空间*/(第6