博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
arm64 页表映射
阅读量:4216 次
发布时间:2019-05-26

本文共 1272 字,大约阅读时间需要 4 分钟。

armv8最多支持48根地址,4级页表,这样最多支持user space和kernnel space 分别是256TB其中user space占据低端地址kernel可以支持48/42/39 根地址# CONFIG_ARM64_VA_BITS_39 is not setCONFIG_ARM64_VA_BITS_48=y最多四级页表CONFIG_PGTABLE_LEVELS=4可以支持4k/16k/64k的pagesarm64建立页表的函数为__create_pgd_mappingstatic void __create_pgd_mapping(pgd_t *pgdir, phys_addr_t phys,				 unsigned long virt, phys_addr_t size,				 pgprot_t prot,				 phys_addr_t (*pgtable_alloc)(void),				 int flags){	unsigned long addr, length, end, next;	pgd_t *pgdp = pgd_offset_raw(pgdir, virt);	/*	 * If the virtual and physical address don't have the same offset	 * within a page, we cannot map the region as the caller expects.	 */	if (WARN_ON((phys ^ virt) & ~PAGE_MASK))		return;	phys &= PAGE_MASK;	addr = virt & PAGE_MASK;	length = PAGE_ALIGN(size + (virt & ~PAGE_MASK));	end = addr + length;	do {		#每个pgd的长度是PGDIR_SIZE,表示512GB		next = pgd_addr_end(addr, end);		#设置pud		alloc_init_pud(pgdp, addr, next, phys, prot, pgtable_alloc,			       flags);		phys += next - addr;	} while (pgdp++, addr = next, addr != end);这里会建立pgd,每个pgd表示的范围用PGDIR_SIZE 用来表示,在va=48bit,levels等于4的情况下。PGDITR_SIZE 是512GB,PUD_SIZE等于1G,PMD_SZIE等于2M。PAGE_SIZE等于4K。因为PMD_SIZE等于2M。所以hugepage 最小size等于2M其中PTRS_PER_PDG/PUD/PMD/PTE 都等于512.在映射的时候每个阶段都会按照size 作为步长来优化,例如PGD的步上就是PGDITR_SIZE等于512GB

转载地址:http://ajnmi.baihongyu.com/

你可能感兴趣的文章
POJ 2536 解题报告
查看>>
POJ 1154 解题报告
查看>>
POJ 1661 解题报告
查看>>
POJ 1101 解题报告
查看>>
ACM POJ catalogues[转载]
查看>>
ACM经历总结[转载]
查看>>
C/C++文件操作[转载]
查看>>
常见的排序算法
查看>>
hdu 3460 Ancient Printer(trie tree)
查看>>
KMP求前缀函数(next数组)
查看>>
KMP
查看>>
poj 3863Business Center
查看>>
Android编译系统简要介绍和学习计划
查看>>
Android编译系统环境初始化过程分析
查看>>
user2eng 笔记
查看>>
DRM in Android
查看>>
ARC MRC 变换
查看>>
Swift cell的自适应高度
查看>>
【linux】.fuse_hiddenXXXX 文件是如何生成的?
查看>>
【LKM】整合多个LKM为1个
查看>>