源码
这是Linux内核中的mm_init函数的代码,其作用是初始化内存管理相关的组件和数据结构。
-
static
: 这是一个函数声明修饰符,表示该函数只在当前文件中可见。 -
void __init
: 这是函数的返回类型和修饰符,表示该函数是内核初始化代码。 -
page_ext_init_flatmem()
: 这是一个函数调用,用于初始化页表扩展(page_ext)的内存管理器。该函数要求页表必须是连续的,而且必须大于MAX_ORDER,除非使用了SPARSEMEM。 -
init_mem_debugging_and_hardening()
: 这是一个函数调用,用于初始化内存调试和硬化相关的组件。 -
kfence_alloc_pool()
: 这是一个函数调用,用于为内存分配器kFence分配内存池。 -
report_meminit()
: 这是一个函数调用,用于报告内存初始化的情况。 -
stack_depot_init()
: 这是一个函数调用,用于初始化内核堆栈的存储和管理。 -
mem_init()
: 这是一个函数调用,用于初始化内存管理器的基本数据结构。 -
mem_init_print_info()
: 这是一个函数调用,用于打印内存初始化的信息。 -
page_ext_init_flatmem_late()
: 这是一个函数调用,用于初始化页表扩展(page_ext)的内存管理器,但在buddy分配器准备好之后才进行。 -
kmem_cache_init()
: 这是一个函数调用,用于初始化内存缓存的数据结构。 -
kmemleak_init()
: 这是一个函数调用,用于初始化内存泄漏检测器的数据结构。 -
pgtable_init()
: 这是一个函数调用,用于初始化页表的数据结构。 -
debug_objects_mem_init()
: 这是一个函数调用,用于初始化内核调试对象的内存管理器。 -
vmalloc_init()
: 这是一个函数调用,用于初始化虚拟内存分配器的数据结构。 -
init_espfix_bsp()
: 这是一个函数调用,用于在创建第一个非初始化线程之前运行,以修复x86架构中的esp寄存器问题。 -
pti_init()
: 这是一个函数调用,用于在espfix64设置好之后运行,以启用PTI(页表隔离)保护。
源码
这是Linux内核中的mem_init函数的代码,其作用是初始化内存管理器的基本数据结构。
-
void __init
: 这是函数的返回类型和修饰符,表示该函数是内核初始化代码。 -
memset(empty_zero_page, 0, PAGE_SIZE)
: 这是一个函数调用,用于将空的零页面清零。 -
brk_end = (unsigned long) UML_ROUND_UP(sbrk(0))
: 这一行代码用于获取当前进程的brk结束地址,并进行向上取整操作。 -
map_memory(brk_end, __pa(brk_end), uml_reserved - brk_end, 1, 1, 0)
: 这是一个函数调用,用于将brk_end地址映射到物理内存上,并设置相应的标志位。 -
memblock_free(__pa(brk_end), uml_reserved - brk_end)
: 这是一个函数调用,用于在物理内存上释放brk_end之后的空间。 -
uml_reserved = brk_end
: 这一行代码用于更新uml_reserved的值,使其等于brk_end,表示这部分空间已经被内核保留。 -
memblock_free_all()
: 这是一个函数调用,用于将所有低端内存块都添加到内存管理器的空闲列表中。 -
max_low_pfn = totalram_pages()
: 这一行代码用于计算系统可用的最大物理页框号,即totalram_pages()。 -
max_pfn = max_low_pfn
: 这一行代码用于将最大物理页框号赋值给max_pfn。 -
kmalloc_ok = 1
: 这一行代码用于设置kmalloc_ok标志位,表示内核已经准备好使用kmalloc分配内存了。