当前位置:文档之家› 通信软件基础 Linux简答与应用题简化版

通信软件基础 Linux简答与应用题简化版

简答题与应用题:1、 试简要说明Linux 内核构成,并简要说明各部分的功能?答: MMU :内存管理单元,完成地址映射(应用虚拟地址方式)VFS :虚拟文件管理系统,提供了统一管理计算机资源的途径。

使统一规范计算机资源的使用格式成为可能,方便传输SCHED :进程调用单元。

支持多任务运行。

利用软件中断的特点,将CPU 的时间线划分给各个任务,完成多任务管理IPC :进程间通信单元。

实现多个不同程序在运行时可以进行数据交换、通信。

NET :网络。

网络不做为通用设备,以特定工作单元存在。

负责计算机系统与其他计算机相互通信的接口。

2、 通常可采用哪几种方式来开发嵌入式Linux 系统?给出示意图。

答:方式有:(1)连接型(宿主机/目标板链接开发)(2)可移动连接型(利用可移动的存储器作为宿主机/目标板之间的中介)(3)标准化(在开发板上进行独立开发)3、 为什么要建立交叉开发平台?在何种情形下可以不必建立?答:嵌入式系统的构造决定。

嵌入式处理器多为专用的cpu ,1、必须将用C 编写的程序编译成能在该专用平台上运行的机器码。

2、C 语言库是必需的,必需提供能在专用cpu 上运行的库的二进制代码。

以上两点要求有这么一种编译工具能够实现两种CPU 之间的交叉。

当执行应用程序的平台和用来建立应用程序的平台相同时就可以不建立交叉开发平台。

4、 【NO 】试简要叙述GNU 及其所提供的开发工具链。

答: GNU 是“GNU's Not Unix”的递归缩写,它是一个自由软件工程项目组织。

提供各种开源代码。

提供一整套的开发工具链包括:GNU 工具链基础,内核头文件安装程序,Binutils (二进制工具)的安装程序,引导编译器安装程序,C 库安装程序,全编译器安装程序,完成工具链的设置。

(1) ∙ 第二引导加载程序∙ 内核∙ 根文件系统 (2)(3)5、试解释make和makefile的关系?简单举例说明。

答:使用make就必须写makefile文件,它描述工程中文件之间的关系,提供更新每个文件的命令。

Makefile就是一组规则,它指导make程序的运行,告诉make需要做什么,多数情况是怎样编译和链接一个程序。

目标和目标运行规则一旦建立,make就会按此进行工作。

6、GCC是什么?为什么说它是必不可少的?答:GCC是由GNU组织开发的一个免费的C/C++编译工具,由它将高级语言转换为机器语言。

因为GCC是一个交叉平台的编译器,几乎所有主流CPU处理平台上目标代码的变换,它有力的支持了Linux系统的发展。

没有就无法获得可执行程序。

7、C库是什么概念?在嵌入式Linux系统中对此有何要求?答:提供C语言里包含常用函数的源代码。

在嵌入式Linux系统中是必不可少的。

否则无法获得可执行程序的完整代码。

因为操作系统是用C语言编写的。

8、重新编译内核应考虑哪几个方面的因素?模块是什么概念?答:建立依存关系,建立内核,建立模块。

模块的概念:可动态、静态加载的二进制代码。

9、什么是根文件系统?Linux内核启动与根文件系统的关系?答:根文件系统是Linux系统的安装点,应该包括支持Linux系统正常运行的基本内容,包含着系统使用的软件和库,以及所有用来为用户提供支持构架和用户使用的应用软件。

Linux内核在运行期必须要用到的存储代码体系,与内核同时存在,只在内核运行时才存在于内存中。

根文件系统必须要能够提供Linux内核启动过程中要加载的模块10、L inux内核在目标板上启动过程(简要叙述)?需要考虑哪些因素?答:1、通过合适的bootloader 找到内核源代码,加载到内存2、内核源代码开始进行初始化3、内核源代码初始化完毕,开始调用和用户有关的进程。

用户进程初始化选用和目标板相配的启动装载程序11、什么是VFS?它在Linux内核中的主要作用是什么?答:VFS(虚拟文件系统)是物理文件系统与服务之间的接口层。

它对Linux的每个文件系统的所有细节进行抽象,使得不同的文件系统在Linux核心以及系统中运行的其它进程看来,都是相同的。

作用为:记录可用的文件系统类型,将设备同对应的文件系统联系起来,处理一些面向文件的通用操作,涉及到针对文件系统的操作时,VFS把它们影射到与控制文件、目录以及inode。

12、内核模块的编程和普通程序的编程有哪些区别?(6分)参考答案:主要区别为:(1)因为内核模块运行在内核态,所以包含的头文件是内核程序相关的头文件,而普通程序则包含的是glibc 的头文件(1分)(2)模块程序没有main函数,而是通过init_module函数在加载后初始化。

(2分)(3)模块程序内可直接调用内核函数,而普通程序则只能通过系统调用使用内核函数。

(2分)(4)普通用户程序可运行多次,而内核函数通常则只能加载1次(1分)。

13、什么是交叉编译?为什么要采用交叉编译(5分)参考答案:所谓交叉编译,是指在一个平台上编译生成在另一个平台上运行的可执行程序。

(3分)。

之所以采用交叉编译,是因为目标平台上不具备直接运行开发环境的条件。

(2分)14、简述嵌入式Linux系统的初始化过程(5分)参考答案:嵌入式Linux系统开机首先运行BootLoader,然后由BootLoader引导启动内核,由内核检查和初始化硬件设备,载入设备的驱动程序模块,安装root文件系统,然后内核将启动一个名为init的进程(2分)。

在init运行完成并启动其它必要的后续进程后,系统开始运行,引导过程结束。

init进程启动时需要读取inittab配置文件,该文件确定init在系统启动和关机时的工作特性。

(3分)应用题1、管道是Linux中进程通信的一种方式,以下程序在父进程和子进程之间创建了一个管道,然后建立它们之间的通信,实现父进程向子进程写数据的功能。

说明标号所在行代码的功能。

#include <unistd.h>#include <sys/types.h>#include <errno.h>#include <stdio.h>#include <stdlib.h>int main(){int pipe_fd[2];pid_t pid;char buf_r[100];char* p_wbuf;int r_num;memset(buf_r,0,sizeof(buf_r)); (1)if(pipe(pipe_fd)<0) (2){printf("pipe create error\n");return -1;}if((pid=fork())==0) (3){printf("\n");close(pipe_fd[1]); (4)sleep(2);if((r_num=read(pipe_fd[0],buf_r,100))>0) (5){printf( "%d numbers read from the pipe is %s\n",r_num,buf_r);}close(pipe_fd[0]); (6)exit(0);}else if(pid>0) (7){close(pipe_fd[0]); (8)if(write(pipe_fd[1],"Hello",5)!=-1) (9)printf("parent write1 success!\n");if(write(pipe_fd[1]," Pipe",5)!=-1)printf("parent write2 success!\n");close(pipe_fd[1]); (10)sleep(3);waitpid(pid,NULL,0);exit(0);}}答案要点:(1) 将数据缓冲区清0 (2) 创建管道 (3) 创建子进程 (4) 关闭子进程写描述符 (5) 子进程读取管道内容 (6) 关闭子进程读描述符 (7) 父进程运行控制语句(8) 关闭父进程的读描述符 (9) 将数据写入缓冲区(10) 关闭父进程写描述符2、由于Boot Loader的实现依赖于 CPU 的体系结构,因此大多数Boot Loader都分为 stage1 和 stage2 两大部分。

依赖于 CPU 体系结构的代码,比如设备初始化代码等,通常都放在 stage1 中,而且通常都用汇编语言来实现,以达到短小精悍的目的。

而stage2 则通常用C语言来实现,这样可以实现给复杂的功能,而且代码会具有更好的可读性和可移植性。

请根据你对嵌入式系统中bootloader的理解,简要设计一下stage1和stage2需要完成的功能。

参考答案:BootLoader 的 stage1 通常包括以下步骤(以执行的先后顺序):(3分)基本硬件设备初始化。

为加载 Boot Loader 的 stage2 准备 RAM 空间。

拷贝 Boot Loader 的 stage2 到 RAM 空间中。

设置好堆栈。

跳转到 stage2 的C入口点。

BootLoader 的 stage2 通常包括以下步骤(以执行的先后顺序): (3分)初始化本阶段要使用到的硬件设备。

检测系统内存映射(memory map)。

将 kernel 映像和根文件系统映像从 flash 上读到 RAM 空间中。

为内核设置启动参数。

调用内核。

3、Qt/Embedded对嵌入式GUI提供了强大的支持,信号和插槽机制是QT的核心机制,使用QT实现如下界面的登陆程序,其原代码如下所示,请回答如下问题:1)什么是Qt中的信号插槽机制?(3分)2)应用程序中用到了哪些控件,列举2个并说明该控件的特点?(4分)3)根据注释完成程序中相应的语句?(4分)#include <QtGui/QtGui>#include "window.h"CWinDlg::CWinDlg(QWidget* parent) : QDialog(parent){setWindowTitle("Example"); /*设置窗口的标题*/Edit1 = new QLineEdit; /*创建一个Edit1和一个Buttion1*/Button1 = new QPushButton("OK");Edit1->setEchoMode(QLineEdit::Password);QVBoxLayout* Layout1 = new QVBoxLayout; /*创建一个布局对像Layout1*/Layout1->addWidget(Edit1); /*把Edit1加入到Layout1*/Layout1->addWidget(Button1); /*把Button1加入到Layout1*/(1) ; /*应用Layout1布局*/(2) ; /*建立Signal-Slot,使button1与function()相关联*/ }CWinDlg::~CWinDlg(){delete Edit1; /*删除Edit1与Button1对象*/delete Button1;}void CWinDlg::function(){if(Edit1->text() == "example") /*如果Edit1输入"example"*/{ /*显示"Pass!"消息框*/QMessageBox::warning(this, "warning", "Pass!", QMessageBox::Yes);}else{ /*显示"Error!"消息框*/QMessageBox::warning(this, "warning", "Error!", QMessageBox::Yes);}}#include <QtGui/QtGui>#include "window.h"int main(int argc, char* argv[]){QApplication app(argc, argv); /*创建QT应用程序*/CWinDlg dlg; /*创建窗口*/return dlg.exec(); /*运行程序*/}答案要点:1)什么是Qt中的信号插槽机制?与回调函数机制有何不同?(3分)答案要点:回调函数机制是事先将一个回调函数指针传递给一个处理过程,当这个处理过程得到执行时,回调预先定义好的回调函数以期实现激活其他处理程序的目的。

相关主题