下面分析下__create_pgd_mapping会逐级建立映射关系,同时会进行权限的控制。建立页表映射的过程,整体流程如下: 可以看到建立页表就是填充页表描述符, 本质是填充物理页帧号和权限控制位这两部分内容,最后是通过调用set_pte()填充到对应的页表中。 map_mem 是不是所有内核内存都会建立映射?该函数为所有memory type...
如在RISC-V 架构下 setup_vm_final 函数调用 create_pgd_mapping 函数建立页全局目录时,会调用 alloc_pgd_next 获取一个页面作为页表。alloc_pgd_next 实际是调用 memblock_phys_alloc 函数从 memblock 分配器中获取一个空闲页面。又如 setup_log_buf 中申请存放日志的内存时,会调用 memblock_alloc 获得一块内存...
*/end_va=PAGE_OFFSET+load_sz;for(va=PAGE_OFFSET;va<end_va;va+=map_size)create_pgd_mapping(early_pg_dir,va,load_pa+(va-PAGE_OFFSET),map_size,PAGE_KERNEL_EXEC);/* 为dtb创建早期的PMD */create_pgd_mapping(early_pg_dir,DTB_EARLY_BASE_VA,(uintptr_t)early_dtb_pmd,PGDIR_SIZE,PAGE_...
[2]入参pgdp就是swap_pg_dir,即内核全局页表。有了虚拟地址、物理地址和页表,然后通过__create_pgd_mapping()为他们建立映射,这样内核就可以通过虚拟地址访问到对应的物理地址了。 这样kernel image中的各个symbol就建立了paddr = vaddr - kimage_voffset的映射关系,cpu就能够在欢快的通过虚拟地址访问到物理内存...
* The fixmap shares its top level pgd entry with the kernel * mapping. This can really only occur when we are running * with 16k/4 levels, so we can simply reuse the pud level * entry instead. */BUG_ON(!IS_ENABLED(CONFIG_ARM64_16K_PAGES));bm_pgdp=pgd_offset_pgd(pgdp,FIXADDR_...
内核的虚拟地址空间从VMALLOC_START开始,低于这个地址就不对了,验证完虚拟地址,底层是调用__create_mapping函数,传递的参数情况是这样的,init_mm是内核空间的内存描述符,pgd_offset_k是根据给定的虚拟地址,在kernel space的pgd中找到对应的描述符的位置,early_alloc是在mapping过程中,如果需要分配内存的话(页表需要...
create_mapping函数的开始是一系列的检查,有意义的代码是最后的这个循环: pgd = pgd_offset_k(addr);//一级数组中addr对应的段在init_mm->pgd的下标 end = addr + length;//计算结束地址 do { unsigned long next = pgd_addr_end(addr, end);//获得下一段开始地址 ...
PAGE_TABLE);/* 设置 trampoline PGD and PMD */create_pgd_mapping(trampoline_pg_dir, PAGE_OFFSET,(uintptr_t)trampoline_pmd, PGDIR_SIZE, PAGE_TABLE);create_pmd_mapping(trampoline_pmd, PAGE_OFFSET,load_pa, PMD_SIZE, PAGE_KERNEL_EXEC);/** 设置覆盖整个内核的早期PGD,这将使我们能够达到paging...
create_block_map x0, x7, x3, x5, x6 ... 其中调用create_pgd_entry进行PGD及所有中间level(PUD, PMD)页表的创建,调用create_block_map进行PTE页表的映射。关于四级页表的关系如下图所示,这里就不进一步解释了。 汇编结束后的内存映射关系如下图所示: 等内存...
map_kernel和map_mem函数中的页表映射,最终都是调用__create_pgd_mapping函数实现的: 总体来说,就是逐级页表建立映射关系,同时中间会进行权限的控制等。细节不再赘述,代码结合图片阅读,效果会更佳噢。 6. 页表替换及内存释放 这部分代码不多,不上图了,看代码吧: ...