1.请简述Linux内核在理想情况下页面分配器(page allocator)是如何分配出连续物理页面的。
2.在页面分配器中,如何从分配掩码(gfp_mask)中确定可以从哪些zone中分配内存?
3.页面分配器是按照什么方向来扫描zone的?
4.为用户进程分配物理内存时,分配掩码应该选用GFP_KERNEL,还是GFP_HIGHUSER_MOVABLE呢?
5.在中断上下文中能不能调用包含GFP_KERNEL分配掩码的内存分配函数?
6.如何判断一个zone是否满足分配需求?
7.在释放页面时,页面分配器是如何进行空闲页面合并的?
8.在早期的Linux内核中,以2n字节为大小的内存块分配机制有什么缺点?slab机制如何克服这些缺点?
9.slab分配器是如何分配和释放小内存块的?
10.slab分配器中有一个高速缓存着色(cache color)的概念,着色有什么作用?
11.slab分配器增长并导致大量不用的空闲对象产生,该如何解决?
12.什么是对象缓冲池?
13.在创建一个slab对象描述符时,如何确定一个slab占用多少个物理页面、有多少个对象、着色区有多少个?
14.slab分配器的布局有三种模式——正常模式、OBJFREELIST_SLAB模式、OFF_SLAB模式。它们的区别是什么?
15.什么时候给slab分配器分配物理内存?
16.slab分配器中有一个slab管理区域freelist,那么这个slab管理区域是如何管理空闲对象的呢?
17.slab分配器如何保证在多CPU的大型计算机中的并发访问性能?
18.kmalloc()、vmalloc()和malloc()之间有什么区别以及实现上的差异?
19.Linux内核是如何管理进程的用户态地址空间的?
20.进程地址空间的属性如何转换成硬件能识别的属性?
21.进程地址空间是离散的,那Linux内核如何保证这些地址空间不会冲突?
22.Linux内核如何实现进程地址空间的快速查询和插入?
23.find_vma()函数查找符合哪些条件的VMA?
24.malloc()函数返回的内存是否马上就被分配物理内存?testA()和testB()分别在何时分配物理内存?
25.假设不考虑libc的因素,malloc()分配100字节,那么实际上内核为其分配100 字节吗?
26.假设使用printf()输出的指针bufA和bufB指向的地址是一样的,那么在内核中这两个虚拟内存块是否冲突呢?
27.vm_normal_page()函数返回什么页面的page数据结构?为什么内存管理代码中需要这个函数?
28.请简述get_user_page()函数的作用和实现流程。
29.请简述follow_page()函数的作用和实现流程。
30.SYSCALL_DEFINE1(brk, unsigned long, brk)这个宏展是如何展开的?
31.在ARM64内核中,用户空间如何划分呢?brk区域的起始地址和结束地址在哪里?
32.请简述私有映射和共享映射的区别。
33.在以下代码中,为什么第二次调用mmap时,Linux内核没有捕捉到地址重叠并返回失败呢?
34.请简述ARM64处理器在缺页异常发生之后是如何找到发生异常的类型和错误地址的。
35.当ARM64处理器发生了缺页异常时,如何知道它是因为读内存还是写内存发生的缺页异常?
36.当处理器发生了缺页异常时,如何判断发生异常的地址是可以修复的还是不能修复的?
37.在do_page_fault()函数处理过程中需要考虑哪些情况?
38.主缺页(major fault)和次缺页(minor fault)有什么区别?
39.对于匿名页面的缺页异常,判断条件是什么?
40.对于文件映射页面的缺页异常,判断条件是什么?
41.什么是写时复制类型的缺页异常?判断条件是什么?
42.在写时复制处理中,有两种方式,一种是复用发生异常的页面,另外一种是写时复制,那究竟什么类型的页面可以复用?什么类型的页面必须写时复制呢?
43.在ARMv8.1架构中使能了硬件DBM机制的情况下,如何避免软件和CPU同时更新DBM位以及PTE_RDONLY位?
44.什么情况下可以安全地调用pte_offset_map()函数?什么情况下不行?
45.在切换新的页表项之前要先对页表项内容清零并刷新TLB,这是为什么?
46.在一个多核的SMP系统中,是否多个CPU内核可以同时对同一个页面发生缺页异常?若可以,请描述一个发生的场景,并描述如何保证这几个缺页异常的内核路径对同一个页面的操作不会导致竞争问题。

06-17 08:36