通信软件基础Linux简答与
应用题
小学应用题 下载一年级应用题应用题一年级一年级下册数学应用题一年级下册应用题
简化版(DOC)
简答题与应用题:
1、 试简要说明Linux内核构成,并简要说明各部分的功能,
答:
MMU:内存管理单元,完成地址映射(应用虚拟地址方式)
VFS:虚拟文件管理系统,提供了统一管理计算机资源的途径。使统一规范计算机资源的使用
格式
pdf格式笔记格式下载页码格式下载公文格式下载简报格式下载
成为可能,方
便传输
SCHED:进程调用单元。支持多任务运行。利用软件中断的特点,将CPU 的时间线划分给各个任务,完成多任
务管理
IPC:进程间通信单元。实现多个不同程序在运行时可以进行数据交换、通信。
NET:网络。网络不做为通用设备,以特定工作单元存在。负责计算机系统与其他计算机相互通信的接口。
2、 通常可采用哪几种方式来开发嵌入式Linux系统,给出示意图。
答:方式有:
(1)连接型(宿主机/目标板链接开发)
(2)可移动连接型(利用可移动的存储器作为宿主机/目标板之间的中介)
(3)标准化(在开发板上进行独立开发)
主机 目标板
, 引导加载程序 , 跨平台开目标板 , 内核 发环境 , 根文件系统 , 引导加载程序 (1)
, 内核
主机 目标板 , 完整的根文件系统
, 固有的开发环境 , 跨平台开, 引导加载
发环境 程序
(3) , 第二引导加载程序
, 内核 (2) , 根文件系统 3、 为什么要建立交叉开发平台,在何种情形下可以不必建立,
答:嵌入式系统的构造决定。嵌入式处理器多为专用的cpu,1、必须将用C编写的程序编译成能在该专用平台
上运行的机器码。2、C语言库是必需的,必需提供能在专用cpu上运行的库的二进制代码。以上两点要求
有这么一种编译工具能够实现两种CPU之间的交叉。当执行应用程序的平台和用来建立应用程序的平台相
同时就可以不建立交叉开发平台。
4、 【NO】试简要叙述GNU及其所提供的开发工具链。
答: GNU是“GNU's Not Unix”的递归缩写,它是一个自由软件工程项目组织。提供各种开源代码。提供一
整套的开发工具链包括:GNU工具链基础,内核头文件安装程序,Binutils(二进制工具)的安装程序,引
导编译器安装程序,C库安装程序,全编译器安装程序,完成工具链的设置。
1
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、Linux内核在目标板上启动过程(简要叙述),需要考虑哪些因素,
答:
1、通过合适的bootloader 找到内核源代码,加载到内存
2、内核源代码开始进行初始化
3、内核源代码初始化完毕,开始调用和用户有关的进程。用户进程初始化
选用和目标板相配的启动装载程序
11、什么是VFS,它在Linux内核中的主要作用是什么,
答:VFS(虚拟文件系统)是物理文件系统与服务之间的接口层。它对Linux的每个文件系统的所有细节进行抽
象,使得不同的文件系统在Linux核心以及系统中运行的其它进程看来,都是相同的。作用为:
记录
混凝土 养护记录下载土方回填监理旁站记录免费下载集备记录下载集备记录下载集备记录下载
可用的
文件系统类型,将设备同对应的文件系统联系起来,处理一些面向文件的通用操作,涉及到针对文件系统的
操作时,VFS把它们影射到与控制文件、目录以及inode。
12、内核模块的编程和普通程序的编程有哪些区别,(6分)
参考
答案
八年级地理上册填图题岩土工程勘察试题省略号的作用及举例应急救援安全知识车间5s试题及答案
:
主要区别为:
(1)因为内核模块运行在内核态,所以包含的头文件是内核程序相关的头文件,而普通程序则包含的是glibc的头文件(1分)
(2)模块程序没有main函数,而是通过init_module函数在加载后初始化。(2分)
(3)模块程序内可直接调用内核函数,而普通程序则只能通过系统调用使用内核函数。(2分) (4)普通用户程序可运行多次,而内核函数通常则只能加载1次(1分)。
2
13、什么是交叉编译,为什么要采用交叉编译(5分)
参考答案:所谓交叉编译,是指在一个平台上编译生成在另一个平台上运行的可执行程序。(3分)。之所以采用交叉编译,是因为目标平台上不具备直接运行开发环境的条件。(2分)
14、简述嵌入式Linux系统的初始化过程(5分)
参考答案:
嵌入式Linux系统开机首先运行BootLoader,然后由BootLoader引导启动内核,由内核检查和初始化硬件设备,载入设备的驱动程序模块,安装root文件系统,然后内核将启动一个名为init的进程(2分)。在init运行完成并启动其它必要的后续进程后,系统开始运行,引导过程结束。init进程启动时需要读取inittab配置文件,该文件确定init在系统启动和关机时的工作特性。(3分)
应用题
1、管道是Linux中进程通信的一种方式,以下程序在父进程和子进程之间创建了一个管道,然后建立它们之间的通信,实现父进程向子进程写数据的功能。说明标号所在行代码的功能。
#include
#include
#include
#include
#include
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);
3
}
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实现如下界面的登陆程序,其原代码如下所示,请回答如下问题:
4
1)什么是Qt中的信号插槽机制,(3分)
)应用程序中用到了哪些控件,列举2个并说明该控件的特点,(4分) 2
3)根据注释完成程序中相应的语句,(4分)
#include
#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*/
) ; /*应用Layout1布局*/ (1
(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
#include "window.h"
int main(int argc, char* argv[]) {
QApplication app(argc, argv); /*创建QT应用程序*/
CWinDlg dlg; /*创建窗口*/
5
return dlg.exec(); /*运行程序*/
}
答案要点:
1)什么是Qt中的信号插槽机制,与回调函数机制有何不同,(3分)
答案要点:回调函数机制是事先将一个回调函数指针传递给一个处理过程,当这个处理过程得到执行时,回调
预先定义好的回调函数以期实现激活其他处理程序的目的。不同与回调函数机制,Qt提供了信号和插槽机制,信
号是一个特定的标识;一个槽就是一个函数,与一般函数不同,槽函数既能和信号关联,当某个事件出现时,通
过发送信号,可以将与之相关联的槽函数激活,执行相应代码。
2)应用程序中用到了哪些控件,列举2个并说明该控件的特点,(4分) 答案要点:应用程序中用到的控件有(1)文本框控件Edit,文本框控件主要用来显示或接收用户的输入信息。(2)
按钮控件Button,按钮控件主要响应用户单击功能。
3)根据注释完成程序中相应的语句,(4分)
(1)setLayout(Layout1);
(2)connect(Button1, SIGNAL(clicked()), this, SLOT(function()));
4.在Linux操作系统下,完成下列任务:
1、 编程实现以下功能
, 主程序hello.c(打印Hello World!)
ello.h调用message函数 , 主程序通过头文件h
, 头文件hello.h(声明message函数)
, message函数由message.c定义(打印This is a message~) 1、答:
hello.c:
# include
# include
# include
# include "head.h"
int main (int argc,char *argv[]) {
printf("Hello World!\n");
message();
return 0;
}
head.h:
void message(void);
message.c:
# include
6
void message (void){
printf("This is a message!\n"); }
5、假如你需要设计一个BootLoader,在具体开发之前,你需要确定哪几个主要问题, 参考答案:
需要考虑的问题:(1)与主机连接的方式(2)硬件CPU类型,如何初始化 (3)内存空间大小以及如何使用 (4)内
BootLoader需要支持几种模式。(每点各2分) 核运行前需要准备哪些条件(5)
6、阅读程序,写出程序的执行结果,并
分析
定性数据统计分析pdf销售业绩分析模板建筑结构震害分析销售进度分析表京东商城竞争战略分析
程序的执行过程。(本题满分10分) #include
#include
int main()
{
pid_t result;
int var=10;
printf("before fork,var=%d\n",var);
result=fork();
if(result<0)
printf("fork fail\n");
else if(result>0)
{
var++;
printf("This is parent!\n”);
}
else
{
var- -;
printf("This is child!\n");
}
printf("after fork var=%d\n",var); return 0;
}
答:
before fork,var=10
This is child
after fork var=9
before fork,var=10
This is parent!
after fork var=11
程序的执行过程如下:
程序先定义了两个变量result和var,然后输出变量var的值, 得到"before fork var=10"这一行输出(父子进程各复制了一份)。当执行到result=fork()时程序分叉,产生父子两个
进程。系统首先调度子进程执行,直至子进程结束。(
7
题目假定父子进程均可在一个时间片内执行完,且操作系统每次均先调度子进程。)
而在子进程中result为0,故走的是条件分支的最后一个分支,输出:
This is child.
after fork var=9
子进程执行完了之后调度父进程执行,直至父进程结束。而在父进程中result为子进程号,大于0,于是走条件分支的第二个个分支,输出:
This is parent
after fork var=11
8