Linux中使用的地址類型列表: 用戶虛擬地址(User virtual addresses) 用戶空間程式可見的普通地址。用戶虛擬地址的長度為32位或64位,依賴於底層的硬體體系架構,每個進程有它自己的虛擬地址空間。 物理地址(Physical addresses) 處理器和系統記憶體之間使用的地址 ...
Linux中使用的地址類型列表:
用戶虛擬地址(User virtual addresses)
用戶空間程式可見的普通地址。用戶虛擬地址的長度為32位或64位,依賴於底層的硬體體系架構,每個進程有它自己的虛擬地址空間。
物理地址(Physical addresses)
處理器和系統記憶體之間使用的地址。物理地址的長度為32位或64位;32位操作系統上有時也可以使用大於32位的物理地址(PAE)
匯流排地址(Bus addresses)
外部匯流排和系統記憶體之間使用的地址。通常匯流排地址和物理地址是等同的,但也不一定。有些體繫結構上,有一個IOMMU(IO memory management unit)將匯流排地址重映射為物理地址。IOMMU在許多場景下有幫助,比如將分散的物理記憶體重映射成連續的匯流排地址,設備看起來匯流排地址是連續的。但這也帶來了額外的工作量,比如在DMA操作時,需要對IOMMU額外的編程(填寫映射項)。當然,匯流排地址是和體繫結構高度相關的。
內核邏輯地址(Kernel logical addresses)
內核邏輯地址組成了內核的普通地址空間。這些地址映射部分或全部主存地址,而且經常被認為它們貌似就是物理地址。在大多數體系架構上,邏輯地址和相關的物理地址之間就只差了一個固定的偏移量。邏輯地址的類型為硬體本地指針大小,因此,在32位重載的系統上,可能不能訪問所有的物理地址。邏輯地址的類型通常為unsigned long或者void *。通過kmalloc分配出來的記憶體,地址類型為邏輯地址。
內核虛擬地址(Kernel virtual addresses)
內核虛擬地址和內核邏輯地址相似,因為它們就是內核空間地址向物理記憶體的映射。與內核邏輯地址不同的是,內核虛擬地址在映射時,不必線性或者一對一映射成物理地址。所有的內核邏輯地址為內核虛擬地址,但許多內核虛擬地址卻不是內核邏輯地址。比如vmalloc分配出來的記憶體為內核虛擬地址(但未直接映射為物理地址)。kmap函數返回的也是內核虛擬地址。內核虛擬地址通常儲存在指針變數中。
巨集__pa()(定義在<asm/page.h>)將內核邏輯地址轉換成物理地址。巨集__va()將物理地址轉換回內核邏輯地址,但只針對低地址生效。