2.根据所属的页目录项的地址和address,返回相应的 PTE 表项 从arm_pte_alloc 函数返回到 alloc_init_pte 后,继续调用 set_pte_ext,这个和结构体系相关,在 ARMv7-A架构的处理器,它的实现是在汇编函数中,其中入参如下 ENTRY(cpu_v7_set_pte_ext) #ifdef CONFIG_MMU str r1, [r0] @ linux version ---...
set_pte,set_pmd,set_pud和set_pgd向一个页表项中写入指定的值。set_pte_atomic与set_pte作用相同,但是当PAE被激活时它同样能保证64位的值能被原子地写入。 如果a和b两个页表项指向同一页并且指定相同访问优先级,pte_same(a,b)返回1,否则返回0。 如果页中间目录项指向一个大型页(2MB或4MB),pmd_large(e...
}staticinlinepmdval_tpmd_pfn_mask(pmd_tpmd){if(native_pmd_val(pmd) & _PAGE_PSE)returnPHYSICAL_PMD_PAGE_MASK;elsereturnPTE_PFN_MASK; }staticinlinepmdval_tpmd_flags_mask(pmd_tpmd){return~pmd_pfn_mask(pmd); }staticinlinepmdval_tpmd_flags(pmd_tpmd){returnnative_pmd_val(pmd) &pmd_flags_...
set_pte(kmap_pte-idx, mk_pte(page, prot)); ... return (void *)vaddr; } void *kmap_atomic(struct page *page) { return kmap_atomic_prot(page, kmap_prot); } static __always_inline void *lowmem_page_address(const struct page *page) { return page_to_virt(page); } #define ...
set_pte_ext经过一些宏定义,最终指向的是arch/arm/mm/proc-v7-2level.S文件中的cpu_v7_set_pte_ext(此处以 cortex-A7为例): 72ENTRY(cpu_v7_set_pte_ext)73#ifdefCONFIG_MMU74str r1, [r0] @ linux version7576bic r3, r1, #0x000003f077bic r3, r3, #PTE_TYPE_MASK78orr r3, r3, r279orr ...
(set_top_pte),他为系统中的每个cpu都保留了16个page页的虚拟地址。 该区域有两个特殊函数: 复制 fix_to_virt/virt_to_fix#define __virt_to_fix(x)(((x) - FIXADDR_START) >> PAGE_SHIFT) 1. 2. 表示虚拟地址相对FIXADDR_START偏移的页框数,该返回值应该属于 ...
__set_fixmap可以用于设置fixmap的pte,实现early ioremap,也可以用于清除fixmap的pte,以实现early iounmap。其操作方式通过传入的flags参数判断,当该值为FIXMAP_PAGE_CLEAR时,会执行步骤(5)的清除pte操作 ,否则执行步骤(4)的设置pte操作。其代码及其注释如下: ...
其中 虚拟地址的组成:DIRECTORY [22:31] 可表示1024个页目录(PGD)TABLE[12:21] 可表示1024个页表(PTE)OFFSET[22:31] 可表示4096个物理内存因此最大映射物理内存大小为 10241024 4096 = 4G/Byte 三级页表 当X86引入物理地址扩展(Pisycal Addrress Extension, PAE)后,可以支持大于4G的物理内存(36位),但虚拟地址...
第四次读取内存得到pte_t结构的目录项,从中取出物理页的基地址。 从线性地址的第五部分中取出物理页内偏移量,与物理页基址相加得到最终的物理地址。 第五次读取内存得到最终要访问的数据。 整个过程是比较机械的,每次转换先获取物理页基地址,再从线性地址中获取索引,合成物理地址后再访问内存。不管是页表还是要访问...
(set_top_pte),他为系统中的每个cpu都保留了16个page页的虚拟地址。 该区域有两个特殊函数: fix_to_virt/virt_to_fix #define __virt_to_fix(x)(((x) - FIXADDR_START) >> PAGE_SHIFT) 表示虚拟地址相对FIXADDR_START偏移的页框数,该返回值应该属于 ...