pfn叫做页帧,代表一个内存单元的物理起始地址,实际计算方法是pfn=phys/4K ,即物理内存地址除以4K就是页帧。 pfn和page的转换关系是。page = mem_map + (pfn - ARCH_PFN_OFFSET),ARCH_PFN_OFFSET 应该是第一个物理内存单元的页帧。第1个内存单元page = mem_map+( ARCH_PFN_OFFSET - ARCH_PFN_OFFSET) =...
memory的情况下,PFN(page frame number)和mem_map数组index的关系是线性的(有一个固定偏移,如果内存对应的物理地址等于0,那么PFN就是数组index)。因此从PFN ARMv8(aarch64)页表建立过程详细分析【转】 table 1)地址; 4、X24 存PHYS_OFFSET,/* PHYS_OFFSET- the physical address of the start of memory.....
#define pfn_pte(pfn,prot) (__pte(((phys_addr_t)(pfn) << PAGE_SHIFT) | pgprot_val(prot))) __pa/__va macros 转va,看下__va的实现,它的实现就是先减去PHYS_OFFSET,再加上PAGE_OFFSET。PHYS_OFFSET就是系统DRAM的start address #define__va(x) ((void *)__phys_to_virt((phys_addr_t)...
extern int mtrr_trim_uncached_memory(unsigned long end_pfn); extern int amd_special_default_mtrr(void); extern int phys_wc_to_mtrr_index(int handle); # else static inline u8 mtrr_type_lookup(u64 addr, u64 end, u8 *uniform) { @@ -84,10 +83,6 @@ static inline int mtrr_trim_unc...
pgd = swapper_pg_dir + pgd_index(PAGE_OFFSET); /* 768 */ phys_addr = 0x00000000; while (phys_addr < (max_low_pfn * PAGE_SIZE)) { pmd = one_md_table_init(pgd); /* returns pgd itself */ set_pmd(pmd, __pmd(phys_addr | pgprot_val(__pgprot(0x1e3))); /* 0x1e3 ...