memblock:struct memblock

kernel: 5.10
arch: arm64

在这里插入图片描述
memblock 结构体定义如下,它主要用于描述整个memblock分配器

/**                                                                                                                                                             
 * struct memblock - memblock allocator metadata                                                                                                                
 * @bottom_up: is bottom up direction?                                                                                                                          
 * @current_limit: physical address of the current allocation limit                                                                                             
 * @memory: usable memory regions                                                                                                                               
 * @reserved: reserved memory regions                                                                                                                           
 */                                                                                                                                                             
struct memblock {                                                                                                                                               
        bool bottom_up;  /* is bottom up direction? */                                                                                                          
        phys_addr_t current_limit;                                                                                                                              
        struct memblock_type memory;                                                                                                                            
        struct memblock_type reserved;                                                                                                                          
};

memblock_type代表一种类型的memory block区域,可以包含多个区域,其中一个memblock_region用于描述其中的一个区域,因此此处定义了一个数组来表示多个区域

/**                                                                                                                                                             
 * struct memblock_type - collection of memory regions of certain type                                                                                          
 * @cnt: number of regions                                                                                                                                      
 * @max: size of the allocated array                                                                                                                            
 * @total_size: size of all regions                                                                                                                             
 * @regions: array of regions                                                                                                                                   
 * @name: the memory type symbolic name                                                                                                                         
 */                                                                                                                                                             
struct memblock_type {                                                                                                                                          
        unsigned long cnt;                                                                                                                                      
        unsigned long max;                                                                                                                                      
        phys_addr_t total_size;                                                                                                                                 
        struct memblock_region *regions;                                                                                                                        
        char *name;                                                                                                                                             
};

/**
 * struct memblock_region - represents a memory region
 * @base: base address of the region
 * @size: size of the region
 * @flags: memory region attributes
 * @nid: NUMA node id
 */
struct memblock_region {
        phys_addr_t base;
        phys_addr_t size;
        enum memblock_flags flags;
#ifdef CONFIG_NEED_MULTIPLE_NODES
        int nid;
#endif
};

定义了一个全局struct memblock 结构体 memblock

# mm/memblock.c
struct memblock memblock __initdata_memblock = {                                                                                                                
        .memory.regions         = memblock_memory_init_regions,                                                                                                 
        .memory.cnt             = 1,    /* empty dummy entry */                                                                                                 
        .memory.max             = INIT_MEMBLOCK_REGIONS,                                                                                                        
        .memory.name            = "memory",                                                                                                                     
                                                                                                                                                                
        .reserved.regions       = memblock_reserved_init_regions,                                                                                               
        .reserved.cnt           = 1,    /* empty dummy entry */                                                                                                 
        .reserved.max           = INIT_MEMBLOCK_RESERVED_REGIONS,                                                                                               
        .reserved.name          = "reserved",                                                                                                                   
                                                                                                                                                                
        .bottom_up              = false,                                                                                                                        
        .current_limit          = MEMBLOCK_ALLOC_ANYWHERE,                                                                                                      
};

其中的.memory.regions成员变量主要在setup_arch->setup_machine_fdt->early_init_dt_scan->early_init_dt_scan_memory时初始化,根据dts中memory节点中reg属性组数进行初始化。

参考资料

https://lwn.net/Articles/757818/

最先适应分配算法(First Fit Allocation Algorithm)是一种简单的内存分配算法,它从内存的起始位置开始查找,找到第一个能够满足请求的空闲区域进行分配。下面是用C语言编写的最先适应分配算法的内存申请函数: ```c #include <stdio.h> #include <stdlib.h> #define MEM_SIZE 1024 // 内存大小 char memory[MEM_SIZE]; // 内存池 // 内存块结构体 typedef struct mem_block { int size; // 内存块大小 int start; // 内存块起始地址 struct mem_block *next; // 下一个内存块的指针 } MemBlock; MemBlock *free_list = NULL; // 空闲链表 // 初始化空闲链表 void init_free_list() { if (free_list != NULL) { return; } free_list = (MemBlock *)malloc(sizeof(MemBlock)); free_list->size = MEM_SIZE; free_list->start = 0; free_list->next = NULL; } // 内存申请函数 void *my_malloc(int size) { if (size <= 0) { return NULL; } init_free_list(); // 初始化空闲链表 MemBlock *prev = NULL; MemBlock *curr = free_list; while (curr != NULL) { if (curr->size >= size) { // 找到了合适的空闲块 void *ptr = memory + curr->start; if (curr->size == size) { // 空闲块大小刚好等于申请大小 if (prev == NULL) { // 第一个空闲块就满足要求 free_list = curr->next; } else { prev->next = curr->next; } } else { // 空闲块大小大于申请大小 curr->size -= size; curr->start += size; } return ptr; } prev = curr; curr = curr->next; } // 没有找到合适的空闲块 return NULL; } ``` 该函数的基本思路是从空闲链表中查找第一个能够满足请求的空闲块,然后将其分配给申请者。如果空闲块大小刚好等于申请大小,则直接从空闲链表中删除该块;否则,将该块的大小减去申请大小,并将起始地址修改为当前申请的地址。如果没有找到合适的空闲块,则返回NULL。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值