北航操作系统课程-20200305课堂小测-启动与系统引导

2020-03-05-课堂小测-启动与系统引导


北京航空航天大学计算机学院-2020春操作系统课程
以下题目作者为北航计算机学院操作系统课程组,客观题答案由课程组给出,解析及主观题答案均为博主原创,水平有限,如有错误敬请批评指正。


1 通常bootloader可以支持不同CPU架构,也可以支持不同操作系统的启动:(判断)

答:正确

Bootloader的实现严重依赖于具体硬件,在嵌入式系统中硬件配置千差万别,即使是相同的CPU,它的外设(比如Flash)也可能不同,所以不可能有一个Bootloader支持所有的CPU、所有的开发板。

但是bootloader是可以支持不同CPU架构和不同操作系统的,例如嵌入式系统常用的U-boot(Universal Boot Loader),以及x86处理器常用的LILO和Grub,都可以支持不同的CPU和操作系统,只不过常常不能直接拿来用,需要做一些移植的工作。


2 MIPS系统重启时能正常工作的地址空间是:(单选)

A. kuseg

B. kseg0

C. kseg1

D. kseg2

答:C

kuseg: 2GB,32位用户态可用地址,需要被MMU转换,在重启时MMU没有设置,不可用。kseg0: 512M,通过最高位清零得到其物理地址,无需MMU,但这段地址的存取需要通过cache,重启时cache没有设置好,不可用。kseg1: 512M,通过高三位清零得到其物理地址,无需MMU,存取不通过cache,是重启时唯一可用的地址段。kseg2: 1GB,内核态可用的地址,需要被MMU转换,重启时不可用。


3 如果你在MIPS平台设计一个设备驱动程序,应该将设备IO空间映射到哪个地址空间:(单选)

A. kuseg

扫描二维码关注公众号,回复: 9810410 查看本文章

B. kseg0

C. kseg1

D. kseg2

答:C

MIPS平台外设IO空间通常映射到kseg1段。


4 BIOS的执行过程与操作系统无关:(判断)

答:正确

BIOS设置程序是被固化到电脑主板上地ROM芯片中的一组程序,其主要功能是为电脑提供最底层的、最直接的硬件设置和控制。BIOS通常与硬件系统集成在一起(在计算机主板的ROM或EEPROM中),所以也被称为固件。BIOS的执行是与操作系统无关的。


5 下面哪个工具不包含在GCC里面:(单选)

A. cc1

B. as

C. make

D. collect2

答:C

cc1是预处理器和编译器,as是汇编器,collect2是链接器,他们都是gcc所包含的工具。make工具可以看成是一个智能的批处理工具,它本身并没有编译和链接的功能,而是用类似于批处理的方式—通过调用makefile文件中用户指定的命令来进行编译和链接的。


6 在.o文件中main函数的地址是0x00000000:(判断)

答:正确

.c文件编译后生成.o文件,诸多.o文件经过链接器链接在一起才可以生成最终的可执行文件,在最终的链接和重定位之后才可以知道实际的main函数地址。在没有链接和重定位的.o文件中,main这个符号暂时表示成0x0。


7 C语言中函数参数的压栈顺序是:(单选)

A. 先压第一个参数

B. 先压最后一个参数

答:B

C语言要支持不定个数的参数,其压栈顺序就必然是从右至左。

例如printf()函数,printf()函数的原型是:printf(const char* format,…),编译器通过format中的%占位符的个数来确定参数的个数。假设参数的压栈顺序是从左到右的,这时,函数调用的时候,format最先进栈,之后是各个参数进栈,最后pc进栈,此时,由于format先进栈了,上面压着未知个数的参数,想要知道参数的个数,必须找到format,而要找到format,必须要知道参数的个数,这样就陷入了一个无法求解的死循环。而如果把参数从右到左压栈,函数调用时,先把若干个参数都压入栈中,再压format,最后压pc,这样一来,栈顶指针加2便找到了format,通过format中的%占位符,取得后面参数的个数,从而正确取得所有参数。

所以,如果不存在不定参的函数,则参数的压栈顺序无论是从左到右还是从右到左都是没关系的。


8 C语言中的局部变量在:(单选)

A. 栈上

B. 堆上

C. 数据段上

答:A

C语言的普通局部变量存储在栈上,由编译器分配栈上内存,在作用域结束后自动回收。如果实用malloc等函数动态分配内存,则会存储在堆上,需要注意手动回收,否则造成内存泄漏;使用static声明的静态变量存储在数据段静态区域,只在编译之初赋一次值;此外还可以使用register将变量声明在CPU的寄存器上,获得快速访问赋值的能力,但由于CPU寄存器数量有限,不可以声明过多register变量。


9 main函数通常是第一个执行的函数:(判断)

答:错误

C程序真正的入口点是_start,它首先做一些初始化工作(启动例程, Startup Routine),然后调用C代码中提供的main函数。


10 Linux中的sys_execve()完成了加载可执行文件的主要功能:(判断)

答:错误

sys_execve()只是函数do_execve()的一个界面,实际的处理动作在do_execve()中完成。

发布了12 篇原创文章 · 获赞 2 · 访问量 497

猜你喜欢

转载自blog.csdn.net/JeremyZhao1998/article/details/104717397