linux 匿名物理内存,linux 内存管理问题汇总

思考问答

1.  在系统启动时,ARM Linux内核如何知道系统中有多大的内存空间?

1) uboot 通过命令行传过来 mem=x

2) dts 文件

2. 在32bit Linux内核中,用户空间和内核空间的比例通常是3:1,可以修改成2:2吗?

可以,make menuconfig 中可以配置

3. 物理内存页面如何添加到伙伴系统中,是一页一页添加,还是以2的几次幂来加入呢?

2的幂加入的,2.6版本的好像是一页一页加的。

static void __init __free_pages_memory(unsigned long start, unsigned long end)

{

int order;

while (start < end) {

order = min(MAX_ORDER - 1UL, __ffs(start));

while (start + (1UL << order) > end)

order--;

__free_pages_bootmem(pfn_to_page(start), order);

start += (1UL << order);

}

}

4. 内核的一级页表存放在什么地方?二级页表又存放在什么地方?

一级页表放在0xc0004000,也就是物理内存偏移0x4000的地方,16K

二级页表由bootmem分配的。

4.1  低端内存是段映射还是页映射?

通过map.type = MT_MEMORY_RW; 告诉create_mapping()函数。

低端内存是段映射,当不足1M的地方按段页映射。

5. 用户进程的一级页表存放在什么地方?二级页表呢?

6. 在ARM32系统中,页表是如何映射的?在ARM64系统中,页表又是如何映射的?

eec38d34fea19eeb570111707d9bd963.png

6. 请简述Linux内核在理想情况下页面分配器(page allocator)是如何分配出连续物理页面的。

8. 在页面分配器中,如何从分配掩码(gfp_mask)中确定可以从哪些zone中分配内存?

9. 页面分配器是按照什么方向来扫描zone的?

10. 为用户进程分配物理内存,分配掩码应该选用GFP_KERNEL,还是GFP_HIGHUSER_MOVABLE呢?

11. slab分配器是如何分配和释放小块内存的?

12. slab分配器中有一个着色的概念(cache color),着色有什么作用?

13. slab分配其中的slab对象有没有根据Per-CPU做一些优化?

14. slab增长并导致大量不用的空闲对象,该如何解决?

15. 请问kmalloc、vmalloc和malloc之间有什么区别以及实现上的差异?

16. 使用用户态的API函数malloc()分配内存时,会马上为其分配物理内存吗?

17. 假设不考虑libc的因素,malloc分配100Byte,那么实际上内核是为其分配100Byte吗?

18. 假设两个用户进程打印的malloc()分配的虚拟地址是一样的,那么在内核中这两块虚拟内存是否打架了呢?

19. vm_normal_page()函数返回的是什么样页面的struct page数据结构?为什么内存管理代码中需要这个函数?

20. 请简述get_user_page()函数的作用和实现流程?

21. 请简述follow_page()函数的作用和实现流程?

22. 请简述私有映射和共享映射的区别。

23. 为什么第二次调用mmap时,Linux内核没有捕捉到地址重叠并返回失败呢?

24. struct page数据结构中的_count和_mapcount有什么区别?

25. 匿名页面和page cache页面有什么区别?

26. struct page数据结构中有一个锁,请问trylock_page()和lock_page()有什么区别?

27. 在Linux 2.4.x内核中,如何从一个page找到所有映射该页面的VMA?反响映射可以带来哪些便利?

28. 阅读Linux 4.0内核RMAP机制的代码,画出父子进程之间VMA、AVC、anon_vma和page等数据结构之间的关系图。

29. 在Linux 2.6.34中,RMAP机制采用了新的实现,在Linux 2.6.33和之前的版本中称为旧版本RMAP机制。那么在旧版本RMAP机制中,如果父进程有1000个子进程,每个子进程都有一个VMA,这个VMA里面有1000个匿名页面,当所有的子进程的VMA同时发生写复制时会是什么情况呢?

30. 当page加入lru链表中,被其他线程释放了这个page,那么lru链表如何知道这个page已经被释放了。

31. kswapd内核线程何时会被唤醒?

32. LRU链表如何知道page的活动频繁程度?

33. kswapd按照什么原则来换出页面?

34. kswapd按照什么方向来扫描zone?

35. kswapd以什么标准来退出扫描LRU?

36. 手持设备例如Android系统,没有swap分区或者swap文件,kswapd会扫描匿名页面LRU吗?

37. swappiness的含义是什么?kswapd如何计算匿名页面和page cache之间的扫描比重?

38. 当系统充斥着大量只访问一次的文件访问(use-one streaming IO)时,kswapd如何来规避这种风暴?

39. 在回收page cache时,对于dirty的page cache,kswapd会马上回写吗?

40. 内核有哪些页面会被kswapd写回交换分区?

41. ARM32 Linux如何模拟这个Linux版本的L_PTE_YOUNG比特位呢?

42. 如何理解Refault Distance算法?

43. 请简述匿名页面的生命周期。在什么情况下会产生匿名页面?在什么条件下会释放匿名页面?

44. KSM是基于什么原理来合并页面的?

45. 在KSM机制里,合并过程中把page设置成写保护的函数write_protect_page()有这样一个判断:。这个判断的依据是什么?

46. 如果多个VMA的虚拟页面同时映射了同一个匿名页面,那么此时page->index应该等于多少?

47. 为什么Dirty COW小程序可以修改一个只读文件的内容?

48. 在Dirty COW内存漏洞中,如果Diryt COW程序没有madviseThread线程,即只有procselfmemThread线程,能否修改foo文件的内容呢?

49. 假设在内核空间获取了某个文件对应的page cache页面的struct page数据结构,而对应的VMA属性是只读,那么内核空间是否可以成功修改该文件呢?

50. 如果用户进程使用只读属性(PROT_READ)来mmap映射一个文件到用户空间,然后使用memcpy来写这段内存空间,会是什么样的情况?

51. 请画出内存管理中常用的数据结构的关系图,如mm_struct、vma、vaddr、page、pfn、pte、zone、paddr和pg_data等,并思考如下转换关系。

52. 请画出在最糟糕的情况下分配若干个连续物理页面的流程图。

53. 在Android中新添加了LMK(Low Memory Killer),请描述LMK和OOM Killer之间的关系。

54. 请描述一致性DMA映射dma_alloc_coherent()函数在AEM中是如何管理cache一致性的?

55. 请描述流式DMA映射dma_map_single()函数在ARM中是如何管理cache一致性的?

56. 为什么在Linux 4.8内核中要把基于zone的LRU链表机制迁移到基于Node呢?

----------------------------------------------------------------------------

kernel   mem_map  bitmap

-----------------------------------------------------------------------------

阅读(1301) | 评论(0) | 转发(0) |

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值