嵌入式Linux系统移植试题(时间:1个半小时)
一、选择题(每题2分,共50分,包括单选和多选,多选、少选均不得分)
1. 嵌入式linux系统一般由哪几部分组成(ABCD)
[A] bootloader  [B] linux内核    [C] 根文件系统  [D]用户应用程序
2. 一般情况下,在搭建嵌入式linux开发环境的主要工作中,配置主机必须的软件有(A)
[A] 终端软件  [B] tftp服务器  [C] nfs服务器  [D]usb
3. 下列选项中符合gcc的编译流程的是(A)
[A] 预处理->编译->汇编->连接  [B] 预处理->汇编->编译->连接  [C] 编译->预处理->汇编->连接  [D预处理->连接->汇编->编译
4. gcc使用下列哪个选项可以查看编译的详细过程(B)
  [A] -o  [B] -v    [C] -E  [D]  -g 
5. 下列二进制工具哪个是丢弃目标文件的全部或者特定符号,减少文件体积的(D)
[A] size  [B] as    [C ] nm  [D ] strip
6. 下列二进制工具哪个是用来反汇编的(B)
  [A] nm  [B] objdump    [C ] objcopy  [D ] string
7. 下列二进制工具哪个是用来进行目标格式转换的(C)
  [A] nm  [B] objdump    [C ] objcopy  [D ] string
8. 下列二进制工具哪个是用来把程序地址转换为文件名和行号的(D)
    [A] nm  [B] objdump    [C ] objcopy  [D ] addr2line
9. 下列二进制工具哪个是用来将目标文件生成静态库的(A)
    [A] ar  [B]nm    [C ] objcopy  [D ] objdump
10. FS2410开发板如果从nand flash启动,启动后(B)访问到nor flash;如果从nor flash启动,启动后(A)访问nand flash。
[A] 可以  [B] 不可以 
11. SMDK2410开发平台上,linux要求bootloader将内核参数存储在什么位置(B)
[A] 0x30008000 [B] 0x30000100  [C ]  0x30004000  [D ]  0x33f80000
12. SMDK2410开发平台上,linux要求bootloader将平台号保存在(B)
    [A]  r0 [B]  r1  [C ]  r2  [D ]  r3 
13. SMDK2410开发平台上,linux要求bootloader在运行内核前,让系统进入何种模式(B)
    [A]  user [B]  svc  [C ] system
14. u-boot所支持的命令中,哪个是来设置环境变量的(A)
  [A]  setenv  [B]  mm  [C ]  mtest  [D ]  bootm
15. u-boot支持的命令中,哪个是擦除nor flash的命令( C )
linux内核文件放在哪
[A] nand erase  [B] protect    [C ] erase  [D ] cp
16. 在内核配置时,哪个关键词是来包含下一级Kconfig (C)
    [A] menu  endmenu  [B] source    [C ] choice  endchoice  [D ]depends on
17. 内核启动过程中,如果终端出现”Error:a”错误,可能出现的原因是(B)
    [A] 内核不支持当前处理器 
[B] 内核不支持当前开发平台 
[C ] 内核获取不到bootloader传递来的参数 
[D ] 内核初始化终端出现错误
18. 内核启动过程中,如果终端出现”Error:p”错误,可能出现的原因是(A)
  [A] 内核不支持当前处理器 
[B] 内核不支持当前开发平台 
[C ] 内核获取不到bootloader传递来的参数 
[D ] 内核初始化终端出现错误
19. 下列函数适合在内核解压后,console初始化以前使用的是(B)
  [A] puts  [B] printascii  [C ]  printk  [D ] printf
20. 当console初始化以后,一般最为简单的内核调试为 (A)
[A] printk  [B] puts [C ] bdi2000  [D ] kgdb
21. 下列哪些文件系统可以运行在nand flash上,并具有可读写特性(AB )(多选)
[A] yaffs2  [B] jffs2  [C ] cramfs  [D ] tmpfs  [E]ramfs
22. 下列哪些文件系统可以运行在nand flash上,并具只读特性(C  )
[A] yaffs2  [B] jffs2  [C ] cramfs  [D ] tmpfs  [E]ramfs
23. 下列哪些文件系统不占用任何磁盘空间的文件系统是( DE )(多选)
[A] yaffs2  [B] jffs2  [C ] cramfs  [D ] tmpfs  [E]ramfs
24. 在命令mknod /dev/ttyS0 c 4 64中,‘c’代表(A)
[A] 字符设备  [B] 块设备  [C ] 网络设备
25. 在用busybox制作根文件系统时,对inittab文件的action,如果要求在程序执行前按enter键进入终端,符合的是(A)
[A] askfirst  [B] respawn  [C ] sysinit  [D]wait
二、简答题(前6题每题6分,后两题每题7分,共50分)
1. 简述搭建嵌入式linux开发环境所涉及的工作内容有哪些?
1 制作交叉编译工具链
2 配置超级终端
3 烧写bootloaderflash
4 下载内核映像到开发板(通过tftp
5 制作文件系统
2. 什么是bootloader,linux bootloader的作用是什么,列举几种嵌入式系统中常用的bootloader?
1.Boot Loader 就是在操作系统内核运行之前运行的一段小程序。通过这段小程序,我们可以初始化硬件设备、建立内存空间的映射图,从而将系统的软硬件环境带到一个合适的状态,以便为最终调用操作系统内核准备好正确的环境。
嵌入式Linux系统中常用的bootloaderarmbootredbootblobu-boot
3.简述u-boot启动流程?
大多数bootloader都分为stage1stage2两大部分,uboot也不例外。依赖于CPU体系结构的代码(如设备初始化代码等)通常都放在stage1并且可以用汇编语言来实现,而stage2则通常用C语言来实现,这样可以实现复杂的功能,而且有更好的可读性和移植性。
2.1 stage1 (start.s代码结构)
ubootstage1代码通常放在start.s文件中,它用汇编语言写成,其主要代码部分如下:
1)定义入口 。由于一个可执行的Image必须有一个入口点,并且只能有一个全局入口,通常这个入口放在ROM(Flash)0x0地址,因此,必须通知编译器以使其知道这个入口,该工作可通过修改连接器脚本来完成。
2)设置异常向量(ExceptionVector)
3)设置CPU的速度、时钟频率及中断控制寄存器。
4)初始化内存控制器
5)将ROM中的程序复制到RAM中。
6)初始化堆栈
7)转到RAM中执行,该工作可使用指令ldrpc来完成。
2.2 stage2 C语言代码部分 
lib arm/board.c中的start armbootC语言开始的函数,也是整个启动代码中C语言的主函数,同时还是整个uboot(armboot)的主函数,该函数主要完成如下操作:
1)调用一系列的初始化函数。
2)初始化Flash设备。
3)初始化系统内存分配函数。
4)如果目标系统拥有NAND设备,则初始化NAND设备。
5)如果目标系统有显示设备,则初始化该类设备。
6)初始化相关网络设备,填写IPMAC地址等。
7)进入命令循环(即整个boot的工作循环),接受用户从串口输入的命令,然后进行相应的工作。
4. 简述在fs2410上移植linux-2.6.26内核的一般步骤和注意的事项?
1.准备开发板和相关配件
要清楚自己的开发板的配置(有那些外围设备等)
2.下载内核源码、取得相关工具软件
Kernelgccjtag
3.选定参考板
选择一个内核中已经支持,且和自己的开发部相似的参考板为原型,进修修改
4.修改开发板相关代码
完成BSP的修改移植
如:arch/arm/mach-s3c2410/ 目录
5.添加驱动
先添加基本驱动代码 (如:网卡)
6.编译、调试、下载内核
内核的配置注意事项
arch/arm/mm/Kconfig:
# ARM920T
            config CPU_ARM920T
bool "Support ARM920T processor
arch/arm/mm/Makefile
obj-$(CONFIG_CPU_ARM920T)  += proc-arm920.o
make menuconfig
System Type  --->  [*] Support ARM920T processor
5.分析一下代码段。
int disable_interrupts (void)
{
    unsigned long old,temp;
    __asm__ __volatile__("mrs %0, cpsr\n"
                "orr %1, %0, #0xc0\n"
                "msr cpsr_c, %1"
                : "=r" (old), "=r" (temp)
                :
                : "memory");
    return (old & 0x80) == 0;
}
Old和temp作为输出变量,用寄存器方式而不是内存方式访问它们。old 作为%0,temp作为%1,memory表示告诉编译器内存被修改过了,这段汇编将cpsr或上0xc0,检查以前的cpsr值,检查第7位,返回的是将第7位取反的结果。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。