奔跑吧Linux内核(第2版)卷1:基础架构mobi电子书提取码

简介: 本书基于Linux5.0内核的源代码讲述Linux内核中核心模块的实现。

内容提要

本书基于Linux 5.0内核的源代码讲述Linux内核中核心模块的实现。本书共9章,主要内容包括处理器架构、ARM64在Linux内核中的实现、内存管理之预备知识、物理内存与虚拟内存、内存管理之高级主题、内存管理之实战案例、进程管理之基本概念、进程管理之调度和负载均衡、进程管理之调试与案例分析。

本书适合Linux系统开发人员、嵌入式系统开发人员及Android开发人员阅读,也可供计算机相关专业的师生阅读。

模拟面试题

在阅读本书之前,请读者先完成关于Linux内核的模拟面试题,以检验自己对Linux内核的了解程度。

下面一共有20道题,每道题10分,一共200分。读者可以边阅读Linux内核源代码边做题,请在两小时内完成。如没有特殊说明,以下题目基于Linux 5.0内核和ARM64/x86_64架构。

1.请简述数值0x1234 5678在大小端字节序处理器的存储器中的存储方式。

2.假设系统中有4个CPU,每个CPU都有L1高速缓存,处理器内部实现的是MESI协议,它们都想访问相同地址的数据A(大小等于L1高速缓存行大小),这4个CPU的高速缓存在初始状态下都没有缓存数据A。在T0时刻,CPU0访问数据A。在T1时刻,CPU1访问数据A。在T2时刻,CPU2访问数据A。在T3时刻,CPU3想更新数据A的内容。请依次说明T0~T3时刻4个CPU中高速缓存行的变化情况。

3.什么是高速缓存重名问题和同名问题?虚拟索引物理标签(Virtual Index Physical Tag,VIPT)类型的高速缓存在什么情况下会出现高速缓存重名问题?

4.请回答关于页表的几个问题。

在ARMv8架构中,在L0~L2页表项中包含了指向下一级页表的基地址,那么这里的下一级页表基地址是物理地址还是虚拟地址?

请画出在二级页表架构中从虚拟地址到物理地址查询页表的过程。

为什么页表要设计成多级页表?直接使用一级页表是否可行?多级页表又引入了什么问题?

内存管理单元(Memory Management Unit,MMU)可以遍历页表,Linux内核也提供了软件遍历页表的函数,如walk_pgd()、follow_p-内存管理单元(Memory Management Unit,MMU)可以遍历页表,Linux内核也提供了软件遍历页表的函数,如walk_pgd()、follow_p-age()等。从软件的视角,Linux内核的pgd_t、pud_t、pmd_t以及pte_t数据结构中并没有存储指向下一级页表的指针,它们是如何遍历页表的呢?

5.为用户进程分配物理内存时,分配掩码应该选用GFPKERNEL,还是GFP_HIGHUSER MOVABLE呢?为什么?

6.假设使用printf()输出时指针bufA和bufB指向的地址是一样的,那么在内核中这两块虚拟内存是否冲突?

7.请回答关于缺页异常的几个问题。

若发生匿名页面的缺页异常,判断条件是什么?

什么是写时复制类型的缺页异常?判断条件是什么?

在切换新的PTE(页表项)之前为什么要先把PTE内容清零并刷新TLB?

在SMP系统中,是否多个CPU内核可以同时在一个页面中发生缺页异常?

8.page 数据结构中的_refcount 和_mapcount有什么区别?请列举 page 数据结构中关于_refcount和_mapcount的案例。

9.在页面分配器中,分配掩码ALLOC_HIGH、ALLOC_HARDER、ALLOC_OOM以及ALLOC_NO_WATERMARKS之间有什么区别?它们各自能访问系统预留内存的百分比是多少?思考为什么页面分配器需要做这样的安排。

10.假设有这样的场景——请求分配order为4的一块内存,迁移类型是不可迁移(MIGRATE_UNMOVABLE),但是order大于或等于4的不可迁移类型的空闲链表中没有空闲页块,那么页面分配器会怎么办?

版权:人民邮电出版社