嵌入式助理工程师认证考试题库
将 kernel 映像和根文件系统映像从 flash 上读到 RAM 空间中。(1分)
为内核设置启动参数,调用内核。(1分)
53、嵌入式Linux系统的根文件系统通常应该包括哪个内容?
参考答案:
通常包括:init、libc库、驱动模块、必需的应用程序和系统配置脚本。(各1分)
54、
55、回答下面问题:
a) 对于整形变量A=0x12345678,请画出在little endian及big endian的方式下在内存中是如何存储的。
b) 在ARM系统中,函数调用的时候,参数是通过哪种方式传递的?
c) 中断(interrupt,如键盘中断)与异常(exception,如除零异常)有何区别?
答:
a) 0x12345678
little endian big endian 刚好反过来
高地址--〉 0x12 低地址--〉 0x12
0x34 0x34
0x56 0x56
低地址--〉 0x78 高地址--〉 0x78
b)
答:应用程序中使用中间寄存器及数据栈来传递参数。
在arm汇编中,如果第1~4个参数通过r0 -r3寄存器来传递,超过4个的使用数据栈进行传递,输出函数由r0传递。
c)所谓中断应该是指外部硬件产生的一个电信号,从cpu的中断引脚进入,打断cpu当前的运行;
所谓异常,是指软件运行中发生了一些必须作出处理的事件,cpu自动产生一个陷入来打断当前运行,转入异常处理流程。
56、某Linux主机的/etc/rc.d/rc.inet1文件中有如下语句,请修正错误,并解释其内容。
/etc/rc.d/rc.inet1:
……
ROUTE add –net default gw 192.168.0.101 netmask 255.255.0.0 metric 1
ROUTE add –net 192.168.1.0 gw 192.168.0.250 netmask 255.255.0.0 metric 1
答:修正错误:
(1)ROUTE应改为小写:route;(2)netmask 255.255.0.0应改为:netmask 255.255.255.0;
(3)缺省路由的子网掩码应改为:netmask 0.0.0.0;
(4)缺省路由必须在最后设定,否则其后的路由将无效。
解释内容:
(1)route:建立静态路由表的命令;(2)add:增加一条新路由;
(3)-net 192.168.1.0:到达一个目标网络的网络地址;
(4)default:建立一条缺省路由;(5)gw 192.168.0.101:网关地址;
(6)metric 1:到达目标网络经过的路由器数(跳数)。
6.下述代码取自u-boot,请对其加以逐行注释和分析。
typedef int (init_fnc_t) (void);
init_fnc_t *init_sequence[] = {
cpu_init,
board_init,
env_init,
serial_init,
display_banner,
NULL,
};
init_fnc_t **init_fnc_ptr;
for (init_fnc_ptr = init_sequence; *init_fnc_ptr; ++init_fnc_ptr)
{
if ((*init_fnc_ptr)() != 0) {
hang ();
}
}
4.简述2.4与2.6内核模块机制的改变对编写设备驱动程序的影响?
答:2.4内核中,模块的编译只需内核源码头文件;需要在包含linux/modules.h之前定义MODULE;编译、连接后生成的内核模块后缀为.o。2.6内核中,模块的编译需要配置过的内核源码;编译、连接后生成的内核模块后缀为.ko;
在2.6 内核中,内核模块必须调用宏module_init 与module_exit() 去注册初始化与退 出函数。在2.4内核中,如果初始化函数命名为init_module()、退出函数命名为cleanup_module()。
2.4内核中,模块自身通过MOD_INC_USE_COUNT、MOD_DEC_USE_COUNT宏来管理自己被使用的计数。2.6内核提供了更健壮、灵活的模块计数管理接口try_module_get(&module)及module_put (& module)取代2.4中的模块使用计数管理宏;模块的使用计数不必由自身管理,而且在管理模块使用计数时考虑到SMP与 PREEMPT机制的影响。
2.4 内核下,缺省情况时模块中的非静态全局变量及函数在模块加载后会输出到内核空间。2.6内核下,缺省情况时模块中的非静态全局变量及函数在模块加载后不会输出到内核空间,需要显式调用宏EXPORT_SYMBOL。
57、论述一下问题
(1) ARM中引起异常的原因
(2) 在ARM体系中,异常中断向量表的大小是多少,其中每个异常中断占据多少字节
(3) 异常中断的处理、返回过程。
答:(1)原因主要:
a.指令执行引起的异常
软件中断、未定义指令(包括所要求的协处理器不存在是的协处理器指令)、预取址中止(存储器故障)、数据中止。
b.外部产生的中断
复位、FIQ、IRQ。
(2)在ARM体系中,异常中断向量表的大小为32字节,其中每个异常中断占据4个字节大小,保留了4个字节空间。
(3)ARM处理器对异常中断的响应过程是首先保存处理器当前状态、中断屏蔽位及CPSR寄存器中的各个条件标志位。这是通过将当前程序状态寄存器CPSR的内容保存到将要执行的异常中断对应的SPSR寄存器中实现的。其次设置当前程序状态寄存器CPSR中相应的位。再次将寄存器LR_mode(R14_mode)设置成返回地址。最后将PC设置成该异常中断的中断向量地址,从而跳转到对应的中断处理程序处执行。
ARM处理器从异常中断程序中返回的过程:首先恢复被中断程序的处理器状态,也就是将SPSR_mode 内容复制到CPSR。然后返回到发生异常中断指令的下一条指令处执行,即将LR_mode(R14_mode)寄存器的内容复制到PC中。
58、在linux中如何编译C程序,使之成为可执行文件(3分)?如何调试(3分)?
答案:
[问题1](3分)
1)检查程序中.h文件所在的目录,将其加入系统PATH中;
2)执行C编译:#gcc [源文件名] -o [目标文件名]
3)改变目标文件为可执行文件:#chmod +x [目标文件名]
4)如需将多个可执行文件连续执行,可用vi生成批处理文件,最后记得将该批处理文件属性改为可执行(同上一步)
[问题2](3分)
调试:在编译时使用-g参数,就可以使用gdb进行调试。
59、时间片的大小对系统有什么影响?(3分)在选取时间片是应考虑哪些因素?(3分)
参考答案:
[问题1](3分)
在轮转法中,时间片长度的选取非常重要,将直接影响系统开销和响应时间。如果时间片长度很小,则调度程序剥夺处理机的次数频繁,加重系统开销;反之,如果时间片长度选择过长,比方说一个时间片就能保证就绪队列中所有进程都执行完毕,则轮转法就退化成先进先出算法。
[问题2](3分)
影响时间片大小的主要因素有:系统响应时间、就绪进程数目和计算机处理能力
60、模块的编程和普通程序的编程有哪些区别?(6分)
参考答案:
主要区别为:
(1)因为内核模块运行在内核态,所以包含的头文件是内核程序相关的头文件,而普通程序则包含的是glibc的头文件(1分)
(2)模块程序没有main函数,而是通过init_module函数在加载后初始化。(2分)
(3)模块程序内可直接调用内核函数,而普通程序则只能通过系统调用使用内核函数。(2分)
(4)普通用户程序可运行多次,而内核函数通常则只能加载1次(1分)。
【嵌入式助理工程师认证考试题库】相关文章: