内核源码分析
文章平均质量分 70
主要用于日常内核源码分析,包括函数、宏等
HZero.chen
随风潜入夜,润物细无声
展开
-
LRU页面回收
内存回收算法总是会在一定的时间将一些内存回收, 经典内存回收算法是通过LRU链表对page页面进行管理的,对于那些最新读写的页面会将其插入到LRU链表头,当页面回收线程工作时将会typedef struct pglist_data {... /* Fields commonly accessed by the page reclaim scanner */原创 2022-03-25 20:30:36 · 720 阅读 · 0 评论 -
__reserved_mem_init_node
kenrel: 5.10arch: arm64/** * __reserved_mem_init_node() - call region specific reserved memory init code */static int __init __reserved_mem_init_node(struct reserved_mem *rmem){ extern const struct of_device_id __reservedmem_of_table[];原创 2022-02-24 14:48:42 · 600 阅读 · 0 评论 -
early_init_fdt_scan_reserved_mem
/** * early_init_fdt_scan_reserved_mem() - create reserved memory regions * * This function grabs memory from early allocator for device exclusive use * defined in device tree structures. It should be called by arch specific code * once the early allo原创 2022-02-23 23:54:09 · 399 阅读 · 0 评论 -
__fdt_scan_reserved_mem
kenrel: 5.10arch: arm64/** * fdt_scan_reserved_mem() - scan a single FDT node for reserved memory */static int __init __fdt_scan_reserved_mem(unsigned long node, const char *uname, int depth, void *data){原创 2022-02-23 23:52:03 · 262 阅读 · 0 评论 -
setup_arch:arm64_memblock_init
kernel: 5.10arch: arm64arm64_memblock_init主要是通过memblock_remove将某些memblock_region区域从memblock.memory中移除,这些区域包含了DDR物理地址所不包含的区域,以及内核线性映射区所不能涵盖的区域;同时将某些物理区间添加到memblock.reserved中,这额区间包含dts中预留区域,命令行中通过参数预留的CMA区域,内核的代码段、initrd、页表、数据段等所在区域,crash kernel保留区域以及elf相关原创 2022-02-23 10:58:01 · 1014 阅读 · 0 评论 -
memblock_remove
static int __init_memblock memblock_remove_range(struct memblock_type *type, phys_addr_t base, phys_addr_t size){ int start_rgn, end_rgn; int i, ret; ret = memblock_isolate_range(type, bas原创 2022-02-23 08:46:50 · 309 阅读 · 0 评论 -
memblock_isolate_range
/** * memblock_isolate_range - isolate given range into disjoint memblocks * @type: memblock type to isolate range for * @base: base of range to isolate * @size: size of range to isolate * @start_rgn: out parameter for the start of isolated region *原创 2022-02-22 20:32:27 · 527 阅读 · 0 评论 -
memblock: early_init_dt_scan_memory
/** * early_init_dt_scan_memory - Look for and parse memory nodes */int __init early_init_dt_scan_memory(unsigned long node, const char *uname, int depth, void *data){ const char *type = of_get_flat_dt_prop(原创 2022-02-19 18:14:00 · 600 阅读 · 0 评论 -
memblock:struct memblock
memblock 结构体定义如下,它主要用于描述整个memblock分配器/** * struct memblock - memblock allocator metadata原创 2022-02-19 18:05:43 · 319 阅读 · 0 评论 -
setup_arch:bootmem_init : sparse_init
首先简单说明一下背景知识,启动阶段的内存模型一般有4种:FLATMEM,经典sparse和sparse vmemmap,以及zone devieFLATMEM这种模型适用于具有连续物理内存或大部分连续物理内存的非NUMA系统。 在FLATMEM内存模型中,有一个全局mem_map数组映射整个物理内存。对于即使是空洞的物理内存,也需要分配struct page结构体,只不过不会被初始化,映射到具体的物理内存。因此使用的时候要通过pfn_valid来进行检测,可以看到这样实际是浪费了一些struct pa原创 2022-02-19 14:35:57 · 834 阅读 · 0 评论 -
memblocks_present
PAGE_SECTION_MASK对于sparse内存模型,有三级概念:root, section, page,它通过物理地址来进行组织,本例中物理地址为48bit,其中section大小为1G,占用30bit,而PAGE_SHIFT为12,因此page index也就是PFN_SECTION_SHIFT为30-12=18bit//每个section所占用物理地址的位数#define SECTION_SIZE_BITS 30//30 - 12 = 18#define PFN_SECTI原创 2022-02-14 14:46:18 · 449 阅读 · 0 评论 -
pfn_to_page
kernel: 5.10arch: arm64 #define pfn_to_page __pfn_to_pageVMEMMAP区域存放的的是struct page结构体,pfn_to_page实际就是通过物理页帧号来从VMEMMAP区域索引到对应的struct page结构体指针对于定义了CONFIG_SPARSEMEM_VMEMMAP宏,则#define __pfn_to_page(pfn) (vmemmap + (pfn))注意pfn是按照实际的物理地址编号的,如本例中原创 2022-02-18 14:58:40 · 1389 阅读 · 0 评论 -
pmd_addr_end宏
# include/linux/pgtable.h/* * When walking page tables, get the address of the next boundary, * or the end address of the range if that comes earlier. Althoug原创 2022-02-17 18:22:52 · 522 阅读 · 0 评论