原本由bootmem管理的内存在mem_init函数中交由伙伴系统管理。 1.free_unused_memmap_node 相邻的membank间可能存在空洞,但在bootmem阶段这些空洞页也分配了page结构体。该函数的作用是找到这些page结构体所占用的内存并且释放掉。 staticvoid__init free_unused_memmap_node(intnode,structmeminfo *mi)-->unsignedlon...
((unsigned long)high_memory - (unsigned long)__va(0)) >> 20, (unsigned long)&__init_begin, (unsigned long)&__init_end, ((unsigned long)&__init_end - (unsigned long)&__init_begin) >> 10, (unsigned long)&_etext, (unsigned long)&_edata, ((unsigned long)&_edata - (unsigne...
1、第一个初始化函数,mem_init() mem_init(main_memory_start,memory_end); 可以看出传入之前定义的那两个参数:main_memory_start、memory_end mm 文件夹 memory.c 那先看看这个函数把:这个函数的位置在:linux文件下mm文件下的memory.c中 #defineinvalidate() \ __asm__("movl %%eax,%%cr3"::"a"(0))...
1.初始化software IO TLB,用于DMA API void __init arm64_swiotlb_init(void) { dma_ops = &arm64_swiotlb_dma_ops; swiotlb_init(1); } 1. 2. 3. 4. 5. dma 操作函数初始化,并从内存中分一片空间出来,作为tlb 配置表的虚拟,物理内存 2.free_unused_memmap 主要函数调用关系:free_unused_memmap—...
进入mem_init 函数。 #define LOW_MEM0x100000 #definePAGING_MEMORY(15*1024*1024) #definePAGING_PAGES(PAGING_MEMORY>>12) #defineMAP_NR(addr)(((addr)-LOW_MEM)>>12) #define USED 100 staticlongHIGH_MEMORY =0; staticunsignedcharmem_map[PAGING_PAGES] = {0, }; ...
linux系统初始化过程中通过init_bootmem_core(NODE_DATA(0), min_low_pfn, 0, max_low_pfn)来调用这个函数初始化bootmem分配器。其中min_low_pfn是临时页表后的第一个可用页框,max_low_pfn是低端内存结束的页框。 前面说的bootmem分配器核心数据结构bootmem_data_t是内嵌在pg_data_t数据结构中(也就是节点...
init_bootmem_core是bootmem机制中的核心函数,如果需要使用bootmem机制来管理内存,那么首先要使用该函数来建立bootmem allocator,并初始化位图。该函数只在初始化时使用。 bootmem主要的功能有: 根据mapstart指定的物理页框,计算bdata中的node_bootmem_map所对应的虚拟地址。首先将mapstart物理页框通过PFN_PHYS转化为...
bootmem分配器销毁是在mem_init函数中调用free_all_bootmem_core函数实现。如果起始物理地址页框号是32对齐的,设置gofast为1。如果gofast等于1,并且从page开始的32个页都未使用,则将page开始的32个页框回收到buddy系统中,这个通过调用函数__free_pages(page, order),一次回收32个页框。如果从page...
//bootmem_init_node():为指定节点的主内存创建映射 staticunsignedlong__initbootmem_init_node(intnode,structmeminfo*mi){ unsignedlongstart_pfn,end_pfn,boot_pfn; unsignedintboot_pages; pg_data_t*pgdat; inti; start_pfn=-1UL; end_pfn=0; /* *Calculatethepfnrange,andmapthememorybanksfor...
那么我们现在就进入分配函数的核心___alloc_bootmem_node_nopanic, 它定义在mm/nobootmem.c?v=4.7, line 317 代码语言:javascript 复制 void*__init___alloc_bootmem_node_nopanic(pg_data_t*pgdat,unsigned long size,unsigned long align,unsigned long goal,unsigned long limit){void*ptr;if(WARN_ON_...