typedef struct { pgdval_t pgd; } pgd_t;
=>typedef u64 pgdval_t;
typedef struct { pteval_t pte; } pte_t;
=>typedef u64 pteval_t;
#define pgd_page(pgd) pfn_to_page(__phys_to_pfn(__pgd_to_phys(pgd)))
{
=>#define __pgd_to_phys(pgd) __pte_to_phys(pgd_pte(pgd))
{
=>static inline pte_t pgd_pte(pgd_t pgd)
{
return __pte(pgd_val(pgd));
{
=>#define pgd_val(x) ((x).pgd)
=>#define __pte(x) ((pte_t) { (x) } )
}
}
=>#define __pte_to_phys(pte) (pte_val(pte) & PTE_ADDR_MASK)
{
=>#define PTE_ADDR_MASK PTE_ADDR_LOW
=>#define PTE_ADDR_LOW (((_AT(pteval_t, 1) << (48 - PAGE_SHIFT)) - 1) << PAGE_SHIFT)
=>((1 << 36) - 1) << 12
=>#define pte_val(x) ((x).pte)
}
}
=>#define __phys_to_pfn(paddr) PHYS_PFN(paddr)
{
=>#define PHYS_PFN(x) ((unsigned long)((x) >> PAGE_SHIFT))
}
=>#define pfn_to_page __pfn_to_page
{
=>#define __pfn_to_page(pfn) (vmemmap + (pfn))
=>#define vmemmap ((struct page *)VMEMMAP_START - (memstart_addr >> PAGE_SHIFT))
}
}
慢慢欣赏linux pgd_page解析
于 2022-04-12 08:03:47 首次发布