第一章 概述

1.Linux得以流行,是因为遵循了GPL协议,并不是因为遵循POSIX标准(×)

2. Linux操作系统的整体结构来看,分两大部分,用户空间的应用程序和内核空间的os内核,二者之间是一种c/s结构,os是服务者,应用程序是客户,是一种请求和响应的关系。(√)

3. Linux内核提供机制而不是策略,系统调用是一种策略(×)前半句正确,后半句错误

4. 内核源码中的双向链表和哈希表都相当于内核源码中的基本类型,对其操作只需要调用内核提供的相应API就可以。(√)

5. Linux内核把双链表作为基本类型存放于types.h文件中,是为了隐藏双链表的指针特性。(√)

6. list.h中的list_entry()宏通过一个结构体中字段的地址可以求出该结构体的地址,从而可以访问结构体的其他成员,是一种逆向思维。(√)

7. Linux内核是单内核结构,执行效率高,可维护性好(×)单内核是正确的

8.内核文档中https://www.kernel.org/doc/html/latest/ 只包含各个子系统的文档(×)

9.可加装的内核模块在内核运行时候可加载和卸载,是开发一个新的文件系统,驱动程序的基本机制。(√)

10.内核模块的修饰符__init可加可不加,对模块的运行没有什么影响(×)

11.编写Linux内核模块时,不需要单独写一个Makefile文件,直接编译就可以(×)

12. Linux内核模块运行在用户空间(×)

13.微内核比单内核的效率高(×)

14. Linux内核模块的插入和运行必须用root权限(√)

15. Linux的内核模块不属于Linux的几个子系统(√)

16. Linux在超级计算机可穿戴设备、嵌入式系统移动终端,桌面等系统上都可以运行。(√)

17. Linux内核、GNU工具以及其他一些自由软件组成了人们常熟的Linux系统或者Linux发布版。(√)

18. lisit_entry(ptr,type,member)宏返回的是member的地址(×)

19. list_for_each_saft()宏和list_for_each()宏功能一样,安全性有差异(√)

20.与体系结构(如x86ARM等)相关的代码存放在arch目录下(√)

21.创建进程属于一种策略而不是机制(×)系统调用、创建进程都是一种机制

22.D)不属于Linux的子系统 A进程管理B内存管理C文件系统D模块

23. Linux操作系统遵循(C)标准A GUN B GPL C POSIX D MMU

24.触摸屏属于(B)管理 A应用程序B操作系统C硬件厂家D系统调用

25.如果要从磁盘读取一个文件,则主要与(C)子系统打交道A内存管理B进程调度C文件系统D网络

26. struct list_head 无法表达(D)种数据结构A队和栈BCD集合

27.谷歌的Fuchsia操作系统属于( A )结构 A微内核 B单内核 C C/S D面向对象
 

第二章 内存寻址

1. 操作系统启动时,处理器处于保护模式(×)

2. X86中段的描述包含基地址和界限(×)

3. Intel8086的寻址范围是1MB80386的寻址范围是 4GB(√)

4. 分页机制是在保护模式下开启的。(√)

5. 在保护模式下,段的大小可以达到4GB(√)

6. CR3寄存器存放页目录基地址。(√)

7. x86的保护模式就是来保护操作系统的(×)

8. 分页的原理使得每个进程可以拥有自己独立的虚拟内存空间(√)

9. Linux之所以巧妙地绕过段机制,主要是因为将段的基址设为0,即偏移量等于线性地址(√)

10. x86中,启用分页机制是通过启用保护允许位PE而达到的(×)

11. 链接以后形成的地址空间是虚拟地址空间(√)

12. 虚拟地址是程序访问存储器所使用的逻辑地址;线性地址是逻辑地址到物理地址变换之间的中间层;物理地址是每一个字节单元的一个唯一的存储器地址。(√)

13. CPU访问的是虚拟地址。(√)

14. 80x86的控制寄存机器主要用于分段机制(×)

15. 80x86的分段机制是必选的,分页机制是可选的(√)

16. 保护模式提供了四个特权级,Linux使用了其中的2个,0级对应内核态,2级对应用户态(×)

17. 页面大小是由操作系统设计者确定的(×)

18. 页面高速缓存是一种硬件机制,专门用来支持地址转换的(√)

19. intel的保护模式是在80386处理器中首次出现的。(×)

20. 页目录存放在(CR3)中。

21. 一个32位虚拟地址被分为abc三个域,其中ab用于一个2级页表系统,c为页内偏移地址,则页面数为(2a+b)。

22. 以下(C)处理器不是冯诺伊曼体系结构A intel X86 B AMD C ARM D MIPS

23. 如下缩写,(IDT)是中断描述符表

24. “段:偏移量的形式描述的是(虚拟地址)

第三章 进程管理

1.主观题 fork写一个简单的测试程序,从父进程和子进程中打印信息。信息应该包括父子进程的PID。然后把wait()exit()系统调用再加进去,使子进程返回退出状态给父进程,并将它包含在父进程的打印信息中。并对运行结果进行分析说明。

2. Linux内核状态有哪些,请画出状态转换图

3. 通过写时复制技术,分析说明Linux创建一个进程的创建过程是轻量级的。

4. 编写tasklet,在下半部中打印当前进程的PID、状态和名字。

5. 如何获取系统中各进程的状态?

6. Linux系统中进程有哪两大类?举例说明,各有何特点?

7. Linux系统中进程控制块的作用是什么?

8. Linux系统如何执行进程调度?

9. fork(),exec(),wait(), exit()系统调用出发,分析调用这些系统调用时内核建立了哪些数据结构,主要做了哪些事情?

10. 查看最新内核源代码中的/include/linux/sched.h源代码中的task_sturct结构,列出类型为list_head的字段,,并说明哪几个字段可以形成进程的树结构,并画出树结构,通过pstree命令查看你机子上的进程树结构,给出树根进程和5个叶子节点上的进程。

11. 基于Linux内核模块的负载高故障分析 3.5节的视频中,谢宝友老师提出了一系列问题,你是否都能给出答案?在视频最后,打印出进程调用栈的信息,如何找到引起负载上升的进程?就这些问题,结合自己的理解,查阅相关资料,写一遍高故障分析的论文。

12. 进程上下文是指进程的执行环境(√)

13. 进程处于浅深度睡眠状态不可由其他进程通过信号和时钟中断唤醒。(×)

14. fork()后,写时复制技术发生时主要完成复制父进程的页表工作。(×)

15. 当进程处于就绪态,还需要被唤醒才能执行。(×)

16. 用于区分不同进程的标识符是GID(×)

17. PCB的哈希表组织结构,有利于内核通过进程PID快速找到对应的PCB。(√)

18. 用户程序执行时处于用户态(×)

19. 进程代表程序的执行过程,它是一个动态的实体,随着程序中指令的执行不断地变化。(√)

20. 调度程序的作用是从磁盘上选取一个进程占用CPU,并分配其占用CPU 的时间。(×)

21. 一个进程一旦创建就可以为其分配CPU,并运行。(×)

22. 一个进程一旦创建,就由OS为其创建进程的描述信息即PCB。(√)

23. 用户进程一旦建立,就将所有程序和数据装入内存(×)

24. 进程的等待队列不是共享队列,因此不需要保护。(×)

25. Linux进程的状态中没有就绪态。(×)

26. 进程一旦被创建,将有一个与父进程相同的进程ID 号。(×)

27. Linux的调度器采用机制与策略分离的机制(√)

28. copy_process()主要用于创建进程控制块以及子进程执行时所需要的其他数据结构(√)

29. CFS(完全公平调度)通过每个进程的实际运行时间来衡量哪个进程最值得被调度(×)

30. 容器就是一个进程。(√)

31. 进程的上下文属于进程控制的(D)类型信息。A状态信息B链接信息C虚拟内存信息D处理器环境信息

32.B)进程可以充当所有进程的养父。A进程0  B进程1  C kswapd  D kflushd

33. Linux创建一个进程采用的是(B)技术。A请求调页 B写时复制 C分页 D分段

34. 调度程序从(C)选择一个进程执行 A进程链表B等待队列 C可运行队列D哈希表

35. 从内核空间看,优先级分为动态优先级(prio),静态优先级(static_prio),归一化优先级(normal_prio)和实时优先级(rt_priorit),(C)优先级种综合了静态优先级、调度优先级和调度策略计算而得A动态优先级B静态优先级C归一化优先级D实时优先级

36. 在支持多线程的系统中,进程P创建的若干个线程不能共享的是(DA进程p的代码段 B进程P中打开的文件 C进程P的全局变量 D进程P中某线程的栈指针

37. 创建 D)不调用do_fork()A进程 B用户态线程 C内核线程 D协程

38. 从一个进程的运行出发,分析各个子系统之间的依赖关系。

39. 通过fork(),exec(),exit(),wait()几个系统调用,说明进程从产生到死亡的过程

第四章 内存管理 未加入主观题

1. 内核中物理内存的管理机制主要有(D)。A伙伴算法和slab缓存B per-CPU页框高速缓存 C vmalloc机制 D以上都对

2. 用户进程向系统申请物理内存空间,Linux内核通过调用(C)函数实现物理内存的分配。A vmalloc()  B kmalloc()  C get_free_page()  D malloc()

22. 每个进程拥有4GB的虚拟地址空间,0-3GB是各进程私有用户空间,对其它进程不可见。最高的1GB内核空间为所有进程以及内核所共享。(√)

23. 一个进程的用户地址空间主要由mm_struct结构和vm_block_structs结构来描述。(×)

24. 用户可以通过lscpu命令查看内存的层次结构(√)

25. 在进程的task_struct结构中,有一个字段mm指向mm_struct结构,mm_struct结构中各个区域的起始和结束字段描述了进程地址空间的各个虚存区(VMA),而各个VMA只能通过单链表链接关系。(×)

26. 每个程序编译链接后形成的的二进制映像文件有一个代码段(Text)和数据段(BSSData),进程要映射的文件被映射到内存映射区(Memory Mapping Region)。(√)

27. 进程运行时,CPU访问的是用户空间的物理地址,Linux仅把当前要使用的少量页面装入内存,需要时再通过请页机制将特定的页面调入内存。(×)

28. buddy算法核心思想是回收时进行相邻块的合并。(√)

29. 把虚地址转化成物理地址的过程是由硬件机制完成的,操作系统是协助者。(√)

30. 伙伴算法负责大块连续物理内存的分配和释放,以页框为基本单位。(√)

31. 缺页异常发生时会调用伙伴算法分配物理页面(√)

32. Linux内核对用户空间的管理是以虚存区为单位的。(√)

33. 在内核中为一个数据结构分配空间调用kmalloc() 函数。(√)

34. Linux内核调用(D)为进程创建虚存区(VMA)。A 调用VMA()  B调用do_VMA() C调用mmap()  D调用do_mmap()

35. 内核线程拥有的地址空间为(B)。 B 3GB~4G-1B

36. B)系统调用为用户空间创建一个新的虚存区。A fork() B mmap() C munmap()

 D exec()

37. 编译链接后形成的地址是(B)。A物理地址 B虚拟地址 C线性地址 D段地址

第五章 中断

1. 中断分为两部分处理的原因是为了避免关中断太长导致中断的丢失,因此内核希望尽可能早些完成中断请求,尽量将更多可以推后的任务推后处理。因此导入中断的两部分处理(√)

2. IDT是指中断描述符表,是存放中断处理程序入口地址的一种表(√)

3. jiffies表示系统自启动以来的时间(√)

4. Linux的时间单位是时钟中断(×)

5. 中断的引入是为了为了支持设备和设备之间的并行操作(×)

6. 中断模型是一种C/S结构(√)

7. Linux的时钟框架中,timekeeper提供对进程的调度和进程信息统计,负载平衡和时间更新等操作(×)

8. 对中断的上半部分和下半部执行的函数都为do_irq(×)

9. 中断子系统由三个部分组成,分别为硬件无关的代码,CPU 体系结构相关的中断处理和中断控制器的驱动代码(×)

10. CPU正在执行内核态的代码时被中断则堆栈不发生切换(√)

11. CPU在每个时钟周期都检查是否有中断。(×)

12. 中断描述符表是段描述符表的一种。(√)

13. 中断描述符和中断共享线数据结构都是对中断线的描述(×)

14. 高精度定时器的红黑树实现中,树的最右边的结点就是最快到期的定时器(×)

15. 小任务不能睡眠,不能在小任务中使用信号量(√)

16. 因为工作队列是线程,所以我们可以使用所有可以在线程中使用的方法。(√)

17. “时钟中断是整个操作系统的脉搏。(√)

18. 中断请求队列的建立是为了解决中断线的共享问题。(√)

19. 注册中断处理程序是为了(BA将中断处理程序挂入中断请求队列 B初始化IDT C从中断返回 D 执行中断处理程序

20. 操作系统启动以后(B)时钟不再被使用。A.CMOS时钟 B.RTC C.OS时钟D.jiffies

21. 如下缩写,(B)是中断描述符表。B IDT

22. 操作系统启动以后使用的时钟是(C.OS时钟)。

23. 在中断上下文中,用(B自旋锁)加锁。

24. 中断描述符表初始化时,(C系统门)的DPL域被置为3

25. 下列方式中,(D.timer)不属于中断的下半部处理方式。

26. B高精度定时器)提供纳秒级的精度。

27. 内核初始化时,中断描述符表的地址存放在(B.IDTR)寄存器


 

第六章 系统调用

1.从程序的角度看,实际上不直接与系统调用打交道,而是跟API打交道,API是对系统调用的封装。(√)

2. 库函数以及应用程序怎样使用系统调用,内核并不关心,内核只跟系统调用打交道,而且是实现系统调用的大场景(√)

3. LinuxAPI遵循的标准是LSB(×)

4. 系统调用抽象出了用于完成某种特点目的的函数,至于这些函数怎么用内核是不关心的,这是机制与策略分离的具体体现。(√)

5. 用户空间的程序不能直接执行内核代码。它们不能直接调用内核空间中的函数,因为内核函数驻留在受保护的地址空间上。如果进程可以直接在内核的地址空间上读写的话,系统的安全性和稳定性将不复存在。(√)

6. 内核API主要是内核中标记为 EXPORT_SYMBOL的函数,在写Linux内核模块时不能直接调用。(×)

7. LSB的全称是Linux Standards Base,其作用是使各种软件可以很好地在兼容LSB 标准的系统上运行(√)

8. Linux系统调用接口是指内核中所有已实现和可用系统调用的集合(√)

9. ls命令可以跟踪一个应用程序所调用的系统调用(×)

10. 系统调用的实现与CPU体系结构无关(×)

11. POSIX APILinux API的子集(√)

12. ABI是和具体CPU架构和OS相关,因此,只要OS遵守相同的ABI规范,那么不同的应用就可以实现向前兼容,再也不用担心版本升级后,旧版本的应用不能运行了。(√)

13. 尽管内核版本不同,但其内核API是相同的(×)

14. 对系统调用进行优化,是因为系统调用的实现从用户态切换到内核态,执行完系统调用程序后又从内核态切换回用户态,代价很大(√)

15. 尽管系统调用号唯一的标识每个系统调用,但用户调用系统调用时并不需要知道系统调用号(√)

16. ABI是一系列约定的集合,包含(AA.一个特定的处理器指令集

17. D)接口是为了向前兼容 D. Linux ABI

18. B)不属于系统调用处理程序所做的事情 B. 传递系统调用号

19. 系统调用是通过(C)进入其处理程序的 C系统门

20. 中断、异常和系统调用的相同点是(DD都用IDT表描述

21. 系统调用号是(A)传入给eax寄存器的 Alibc库中

22. 系统调用优化机制中,(D)是64位下的快速系统调用指令 D. syscall/sysret

23. A)属于内核态  A. 系统调用表

24. file命令查看可执行文件,例如,file myps,则Linux下的可执行文件遵循的标准为(BB.LSB

第七章 内核同步

1. 竞争条件会导致各种难以调试的错误是因为可执行上下文在CPU上被调度的顺序受诸多因素的影响(√)

2. 临界资源是访问和操作共享数据的代码段(×)

3. 为了避免对临界区进行并发访问,编程者必须保证临界区代码被原子地执行(√)

4. 中断屏蔽的缺点是有可能造成数据丢失甚至系统崩溃(√)

5. 自旋锁是专为防止多处理器并发而引入的一种锁,它在内核中大量应用于中断处理等部分,自旋锁可以被多个内核任务持有。(×)

6. 在多核系统中遇到原子操作,在系统层面上原子操作还是原子的,在核级就不是原子的了。(×)

7. 原子类型的定义之所以放在一个整型在结构体中,是因为这样可以确保原子操作的接口函数只能操作atomic_t类型的数据,避免对int型变量的操作。(√)

8. 在单CPU上,假设一个系统调用和一个中断服务程序并发执行,则对V的加1操作不会出现错误(×)

9. 使用嵌套锁时, 获取锁的顺序无关紧要(×)

10. 典型的死锁有四路交通堵塞和自死锁。(√)

11. 对于临界区,进程之间可同时进行修改操作。(×)

12. 对于临界区,可采用down-up操作来进行保护。(√)

13. 如果数据只会被持定的进程访问,也无需加锁。(√)

14. 持有锁时需要睡眠和调度,优先考虑自旋锁(×)

15. 因为死锁是一种小概率事件,因此,检测起来比较容易(×)

16. 如果在内核中一个任务需要发出信号通知另一个任务发生了某个特定的事件,可以用完成变量。(√)

17. 并发执行的原因不包括(C.自旋锁)

18. D. 临界区)不是内核的同步措施

19. 设与某资源关联的信号量初值为3,当前值为1。若M表示该资源的可用个数,N表示等待该资源的进程数,则MN分别是(B.10

20. 有两个并发执行的内核任务112,共享初值为1的变量xt1x1t2x1,两个操作完成后,x的值为(C.可能为012

21. 对共享变量v的加减赋值等操作,应该通过(A原子操作)完成

22. 以相同的顺序获取嵌套锁,可阻止(A拥抱类型)的死锁。

23. 可避免死锁的算法是(B. 银行家算法)。

第八章

1. 文件结构是文件存放在磁盘存储设备上的组织方式,主要体现在对文件和目录的组织上。(√)

2. Linux的目录结构为树型结构,每个分区是一个独立的文件系统,每个分区在这棵树上是一个叶子节点。(×)

3. Linux文件系统使用索引节点不仅记录文件的元数据,还存放文件的数据(×)

4. 将一个文件系统的顶层目录挂到另一个文件系统的子目录上,使他们成为一个整体,称为安装,把该子目录称为安装点。(√)

5. Linux之所以能支持多种文件系统,并对其进行统一、高效的组织以及管理,是因为虚拟文件系统,虚拟文件系就像联合国,抽象出每个实际文件系统的共有属性,描述其的数据结构为super_block。(√)

6. 虚拟文件系统所提供的抽象界面主要由一组标准的、抽象的操作构成,仅仅给出了函数的定义,并没有具体实现,真正的实现是由具体的文件系统或者驱动程序完成的。(√)

7. inodefile数据结构的主要区别是,前者在文件建立时产生,存放于磁盘,后者在文件打开时才建立,存放于内存。(√)

8. 虚拟文件系统给用户提供统一的接口,这是机制与策略分离的一种具体体现。(√)

9. buffer就是存放要写入磁盘的数据,cache就是存放从磁盘中读出来的数据。(√)

10. 虚拟文件系统各种对象的信息是存放在磁盘上的。(×)

11. 一个进程要读取一个文件,同一个文件的内容存在了两份拷贝,一份是页缓存,一份是用户进程的堆空间对应的物理内存空间,这种方式有可能导致这两份数据的不一致。(√)

12. dcacheinode cache属于VFS层的缓冲区,page cachebuffer cache属于实际文件系统的缓冲区。(√)

13. 一个inode对象对应多个page描述符,同一个文件拥有的所有page描述符都可以在该文件对应的基树中找到。(√)

14. Page cache存放元数据(文件的属性),buffer cache存放数据。(×)

15. 脏页集中到page cache中写回磁盘,虽然提高了性能,但当突然断电时,可能会导致内存与磁盘数据不一致性的问题。(√)

16. 当一个进程打开一个文件时,(B.file)数据结构才建立。

17. 文件打开时形成的文件描述符fd存放在(C. files_struct)数据结构中。

18. 一个inode节点对象对应一个(D. address_space)对象。

19. 在文件的查找look_up操作中,(A. dentry)数据结构起关键作用。

20. 假设系统中安装了3ext4文件系统,则系统中只有一个(A .file_system_type)结构。

21. C. buffer cache)数据结构把内存中的页与磁盘中的块关联起来了。

22. Ext2文件系统中,内核获取原始inode信息的过程,首选需要读取超级块信息,然后去(C.buffer cache)组织的LRU链表中查找。

23. D. page cache)缓冲区中的数据最终交给块I/O层。

24. 文件的树型结构是由(C. dentry)结构来描述的

25. 文件在磁盘上的存放位置是由(D. inode)结构来描述的

26. Linux操作系统管理了3个磁盘分区,那么该操作系统目录结构有(A.1个)目录树。


 

第九章 文件操作

1. 文件操作是对设备操作的组织和抽象,而设备操作则是对文件操作的最终实现(√)

2. 因为设备驱动程序完全隐藏了设备的工作细节,因此驱动程序的开发人员不需要了解硬件相关的细节。(×)

3. 每个设备都对应一个文件名,在内核也就对应一个索引节点(√)

4. 内核处理系统调用,根据设备文件类型和主设备号调用相应的设备驱动程序(×)

5. 设备驱动直接与硬件通信(√)

6. 内存文件系统比如proc,并不需要驱动程序(√)

7. 网络设备与块设备和字符设备一样,都在/dev目录下对应一个设备文件(×)

8. 在用户态可以通过对sys文件系统的访问,来查看内核态的一些驱动程序或者设备等信息(√)

9. 设备驱动模型中的各种对象其内部之所以都会包含kobject,是因为kobject抽象出一些公共型的服务。(√)

10. 设备控制器是CPUI/O设备之间的接口。(√)

11. 外设寄存器主要包括控制寄存器和数据寄存器(×)

12. 访问I/O接口的形式可分为I/O内存和I/O端口,访问I/O内存用专用的I/O指令。(×)

13. 将外设卡上的存储器映射到内存空间使用ioremap()函数(√)

14. Linux下对I/O资源主要用resource结构来管理,这种树型结构可以描述I/O端口、外设内存、DMAIRQ等待资源(√)

15. 可以把一个系统划分为应用、文件系统和设备驱动三个层次 。(√)

16. 从应用程序的角度看,设备文件逻辑上的空间是一个线性空间(起始地址为0,每读取一个字节加1)。(√)

17. I/O端口的访问和I/O空间的访问方式是 一样的(×)

18. Linux网络设备驱动与字符设备和块设备很相似。(×)

19. 网络驱动程序同步的接收来自外部世界的数据包,(×)

20. Linux设备模型将硬件设备归纳、分类,然后抽象出一套标准的数据结构和接口。驱动的开发,就简化为对内核所规定的数据结构的填充和实现。这也是一种机制与策略分离思想的体现,(√)

21. 文件系统操读写的单位是块,驱动程序读写单位为扇区(sector)(√)

22. 字符设备驱动程序的注册意味着把一个字符驱动程序加入字符驱动程序表chrdevs中(√)

23. Linux设备驱动模型使用一系列抽象,(D.inode)不包括在其中。

24. 用户程序发出磁盘 I/O 请求后,系统的处理流程是:用户程序系统调用处理程序设备驱动程序中断处理程序。其中,计算数据所在磁盘的柱面号、磁头号、扇区号的程序是(C. 设备驱动程序)

25. 字符设备只能(A按字节读取)设备中的某一数据。

26. 文件系统的读写单位是(B.块)。

27. 字符设备的编写中,(B. 设备的操作)完成用户空间与内核空间数据的交换

28. I/O调度器算法中(D.CFQ I/O scheduler),是当前内核默认的调度算法

29. 块设备驱动程序核心数据结构中,(C. .request)结构与其他几个结构都有关。

30. Linux内核中的驱动开发中,基本围绕(D. .驱动(driver))抽象进行。

31. 内核利用(B..通用块)层启动I/O操作来传达所请求的数据。

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐