微控制器中的虛擬地址和實體地址
阿新 • • 發佈:2018-12-06
對於核心實體記憶體對映區的虛擬記憶體,使用virt_to_phys()可以實現核心虛擬地址轉化為實體地址,phys_to_virt()可以實現實體地址轉化為核心虛擬地址。
#define __virt_to_phys(x) ((x) - PAGE_OFFSET + PHYS_OFFSET)
static inline unsigned long virt_to_phys(void *x)
{
return __virt_to_phys((unsigned long)(x));
}
上面的轉換過程的PaGE_OFFSET通常為3GB,而PHYS_OFFSET則定義為DRAM記憶體的基地址。因此,對於LDD6410電路板而言,並不是將0地址對映到3GB,而是將外接的SDRAM的首地址對映到3GB。
與之對應的函式為phys_to_virt(),它將實體地址轉化為核心虛地址,phys_to_virt()的定義如下:
#define __phys_to_virt(x) ((x) - PHYS_OFFSET + PAGE_OFFSET)
static inline void *phys_to_virt(unsigned long x)
{
return (void *)(__phys_to_virt((unsigned long)(x)));
}
注意:上述virt_to_phys()和phys_to_virt()方法僅適用於896MB以下的低端記憶體,高階記憶體的虛擬地址和實體記憶體地址之間不存在如此簡單的換算關係。