内存开机在干嘛? -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之前的我们防弹幼儿园宝宝在干嘛呢~~
防弹幼儿园的小盆友们
姆妈心心都给你们
天哪一个个都跟幼稚园小朋友一样可爱死了
cr. /J-dope -L&Tae Tae Suai
以上是关于内存开机在干嘛? -memblock的主要内容,如果未能解决你的问题,请参考以下文章