在memblock_add函数 中 , 调用memblock_add_range函数 插入了一块内存 ; memblock_add_range函数 原型如下 : 代码语言:javascript 代码运行次数:0 运行 AI代码解释 int __init_memblockmemblock_add_range(struct memblock_type*type,phys_addr_t base,phys_addr_t size,int nid,unsigned long flags) 源码路径 ...
在memblock_add 函数 中 , 调用 memblock_add_range 函数 插入了一块内存 ; memblock_add_range函数 原型如下 : AI检测代码解析 int__init_memblockmemblock_add_range(structmemblock_type*type, phys_addr_tbase,phys_addr_tsize, intnid,unsignedlongflags) ...
可见其主要调用memblock_add_range实现,memblock_add_range函数将目标区块添加到第一个参数type指定的管理集合中,memblock_add调用memblock_add_range时将第一个参数设置为全局的memblock.memory。memblock_add_range函数定义如下: //mm/memblock.c : 573 static int __init_memblock memblock_add_range(struct memblock...
它的使用方式简洁明了,例如在系统检测到一块新的物理内存,起始地址为 0x1000,大小为 0x10000 字节时,只需调用 memblock_add(0x1000, 0x10000),就能将这片内存标记为可用,后续内核便可按需分配。其内部实现逻辑严谨,先依据传入的起始地址和大小计算出内存区域的结束地址,接着通过 memblock_add_range 函数,按照既定...
在memblock_add函数 中 , 调用memblock_add_range函数 , 将内存块添加到memblock.memory中 ; 代码语言:javascript 代码运行次数:0 运行 AI代码解释 memblock_add_range(&memblock.memory,base,size,MAX_NUMNODES,0); 三、memblock_add 函数源码 memblock_add函数 定义在Linux内核源码的 linux-4.12\mm\memblock.c#...
memblock_add: int__init_memblockmemblock_add(phys_addr_tbase,phys_addr_tsize){phys_addr_tend = base + size -1; memblock_dbg("%s: [%pa-%pa] %pS\n", __func__, &base, &end, (void*)_RET_IP_);returnmemblock_add_range(&memblock.memory, base, size, MAX_NUMNODES,0); ...
这里主要提供两个函数memblock_add()和memblock_add_node(),如果标记内存则调用memblock_reserve()。 这些函数核心调用memblock_add_range() /** * memblock_add_range - add new memblock region * @type: memblock type to add new region into * @base: base address of the new region ...
intmemblock_add(phys_addr_tbase,phys_addr_tsize);intmemblock_remove(phys_addr_tbase,phys_addr_tsize);for_each_mem_rangeintmemblock_reserve(phys_addr_tbase,phys_addr_tsize);intmemblock_free(phys_addr_tbase,phys_addr_tsize); 这些regions添加后的状态: ...
实际工作由memblock_add_range()完成,type参数指定内存集合类型。 需要注意的是该函数内部会执行两次: 第一次计算需要插入几个内存区,如果超过允许的最大内存区个数,则double内存区数组; 第二次执行内存区的实际插入与合并操作。 2) 移除内存区 int memblock_remove(phys_addr_t base, phys_addr_t size); ...
e820_add_region(HIGH_MEMORY, mem_size<<10, E820_RAM); } /* In case someone cares... */ returnwho; } 在这个函数里面,可以看到前面探测到的内存布局信息boot_params.e820_map在这里被使用了。 首先分析一下sanitize_e820_map(),该函数把e820信息进行了如何处理,函数实现: ...