2011-11-19 25 views
5

我想我理解內存對齊方式,但是讓我困惑的是某些系統上的指針地址會在虛擬內存中,對嗎?因此,我所看到的大多數校驗/確保校準似乎只是使用指針地址。物理內存地址不可能對齊嗎?對於像SSE這樣的事情,這不是問題嗎?虛擬內存和對齊 - 它們如何分解?

+1

我不是低級別內存模型(包括對齊)的專家。但我會認爲頁面會對齊,我會假設這些頁面中的任何相對指針會自動對齊。 –

+0

是的,這聽起來像我不明白的是虛擬內存。 –

回答

8

物理地址將對齊,因爲虛擬內存僅將對齊的頁面映射到物理內存(頁面通常爲4KB)。

所以,除非你需要對齊>頁面大小,物理內存將根據你的要求對齊。

在SSE的具體情況下,一切正常,因爲你只需要16字節對齊。

4

我不知道任何實際的系統,其中對齊的虛擬內存地址可能導致錯位的物理內存地址。

通常情況下,給定平臺上的所有路線都是2的冪。例如,在x86上,32位整數具有4個字節(2^2)的自然對齊。頁面大小 - 它定義了您可以在物理內存中映射塊的程度如何 - 通常是兩個冪的大小。在x86上,最小允許頁面大小爲4096字節(2^12)。可能需要在x86上對齊的最大數據類型是 128位(對於XMM寄存器和CMPXCHG16B) 32字節(對於AVX) - 2^5。由於2^12可以被2^5整除,因此您會發現所有內容都在頁面的開頭對齊,並且由於頁面在虛擬內存和物理內存中都是對齊的,所以虛擬對齊地址將始終是物理對齊的。在更實際的層面上,允許對齊的虛擬地址映射到未對齊的物理地址不僅會使得它很難生成代碼,它還會使CPU架構比簡單地允許任何對齊更復雜(因爲現在我們有奇怪的大小頁面和其他奇怪的......)

請注意,您可能有理由要求比頁面不時更大的路線。通常情況下,對於用戶空間編碼而言,這是否與物理內存對齊並不重要(就此而言,如果您請求多個頁面,則不太可能連續!)。如果你正在編寫一個設備驅動程序,並且需要一個大的,對齊的,用於DMA的連續塊,這裏纔會出現問題。但即使如此,通常這款設備並不是一款超過頁面大小的標準。

+0

實際上,可能需要x86對齊的最大數據類型目前是32字節 - 對於AVX。還有其他情況下,您可能會請求對齊> 32個字節 - 請求動態分配頁面對齊並不罕見。 –