On Thu, 30 Nov 2023, Shijie Huang wrote:
> but can VMEMMAP_VADDR and phys_offset can be used to get vmemmap
value
> on arm64?
On arm64, I can get vmemmap by parsing "memstart_addr".
But I cannot know if CONFIG_SPARSEMEM_VMEMMAP is enabled.
You can get to the struct page pointer through the VMEMMAP and the frame
number. So you would need to get the pfn from the phys_offset.
memmory_model.h:
/* memmap is virtually contiguous. */
#define __pfn_to_page(pfn) (vmemmap + (pfn))
#define __page_to_pfn(page) (unsigned long)((page) - vmemmap)
/*
* Convert a physical address to a Page Frame Number and back
*/
#define __phys_to_pfn(paddr) PHYS_PFN(paddr)
#define __pfn_to_phys(pfn) PFN_PHYS(pfn)
So if the kernel can export "vmemmap", everything become easy.
All the archs supporting the VMEMMAP can benifit from it, such as arm64,
ppc,loongarch,riscv..
And x86. CONFIG_SPARSEMEM_VMEMMAP was developed for x86 initially.