内存开机在干嘛? -memblock

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了内存开机在干嘛? -memblock相关的知识,希望对你有一定的参考价值。

参考技术A memblock 内存管理机制主要用于Linux Kernel 启动阶段(kernel启动 -> kernel 通用内存管理初始化完成.) 或者可以认为free_initmem 为止. 在启动阶段, 内存分配器并不需要很复杂, memblock 是基于静态数组, 采用的逆向最先适配的分配策略.

memory:memblock_add() and memblock_remove()

reserved:memblock_reserve() and memblock_free()

函数栈

减少可以内存也是在memblock中,DRAM_start不变,end减少1GB

内核使用内存前需要初始化内核的页表

对内核映像的各个段分别映射,映射到内核空间的虚拟地址为vmalloc区域,范围从0xFFFF 0000 1000 0000 到 0xFFFF 7DFF BFFF 0000
分别映射如下段

把整个物理内存 映射到 内核态的线性映射区,没有页表。不过这种线性映射都是空的,只有缺页异常的时候,会去分配物理内存,然后返回映射区地址(类似get_free_page)。

直接对着结构体看吧

ARM64已经没有高端内存了,一般情况只有ZONE_NORAML和ZONE_DMA
DMA定义在zone_sizes_init中,在max_zone_dma_phys()中计算。
DMA大小非常吃硬件,设定是所有DMA可访问的地址size的交集

内核中常用PAGE_OFFSET宏计算内核线性映射中 虚拟 到 物理 的转换,

这部分计算方式,5.4和4.19有差异,不过记个API就enough了

skip伙伴系统
页块:通常为4M,就是2的maxorder-1次方页面。每个页块都有个相应的MIGRATE_TYPE类型。

内核初始化时所有页面都标记为MIGRATE_MOVABLE,大部分页面都存放在order=10链表中(刚好一个页块,所以是不是偷页的时候整个块偷走,更改MIGRATE_TYPE呢?)

系统启动的时候,从start_kernel -> mm_init ->mem_init -> free_all_bootmem -> free_low_memory_core_early
开始遍历所有的内存块,找到起始和结束地址

一开始order会因为对齐的问题比较乱,后面就基本是order=10了,核心函数_free_pages()

GO GO之前的我们防弹幼儿园宝宝在干嘛呢~~

GO GO之前的我们防弹幼儿园宝宝在干嘛呢~~

防弹幼儿园的小盆友们GO GO之前的我们防弹幼儿园宝宝在干嘛呢~~

姆妈心心都给你们GO GO之前的我们防弹幼儿园宝宝在干嘛呢~~

GO GO之前的我们防弹幼儿园宝宝在干嘛呢~~

GO GO之前的我们防弹幼儿园宝宝在干嘛呢~~

GO GO之前的我们防弹幼儿园宝宝在干嘛呢~~

GO GO之前的我们防弹幼儿园宝宝在干嘛呢~~

GO GO之前的我们防弹幼儿园宝宝在干嘛呢~~

GO GO之前的我们防弹幼儿园宝宝在干嘛呢~~

GO GO之前的我们防弹幼儿园宝宝在干嘛呢~~

GO GO之前的我们防弹幼儿园宝宝在干嘛呢~~

天哪GO GO之前的我们防弹幼儿园宝宝在干嘛呢~~一个个都跟幼稚园小朋友一样可爱死了


cr. /J-dope -L&Tae Tae Suai


以上是关于内存开机在干嘛? -memblock的主要内容,如果未能解决你的问题,请参考以下文章

孙正义在干嘛

当一个程序员疯狂敲键盘时,他到底在干嘛?

CPU 空闲时在干嘛?

我在干嘛?

做为一个通信工作者,这几年,你在干嘛

GO GO之前的我们防弹幼儿园宝宝在干嘛呢~~