2015-07-20 57 views
3

$ cat /proc/cpuinfo | grep address我可以使用一些指針(x86_64)作爲自定義數據嗎?如果可能的話如何?

address sizes : 39 bits physical, 48 bits virtual 
address sizes : 39 bits physical, 48 bits virtual 

所以,從我的計算指針大小爲64位。 48位用於計算物理地址,有16位未使用。

這些免費的16位可以安全使用嗎?

如果是,那他們是哪一個?它們如何被使用?我是否必須掩飾地址或其他東西?

免責聲明:我設計爲我想要用編程語言低水平約定。我需要通過一些指針傳遞額外的小信息,如果可能的話,我想將它擠入指針。

+0

[相關:這些被稱爲 「標記的指針」](https://programmers.stackexchange.com/questions/213160/what-are-the-real-life-use-cases-for-tagged - 指針) –

+0

呃...相當相關,不是一樣的:) – kravemir

+0

[在64位機器上使用額外的16位]可能的副本(http://stackoverflow.com/questions/16198700/using-extra-16-bit- in-64-bit-machine) –

回答

4

在目前的架構中,指針的最低顯著48位CPU所使用,讓你的16個最顯著位作爲您希望使用。所有你需要做的就是在取消引用指針之前將它們掩蓋起來,你會沒事的。

在每一個OS我熟悉,比特47爲0,用戶模式,所以任何一個用戶模式的指針將有最顯著17位是0。這意味着一個簡單的位掩碼操作將您的自定義數據轉換成一個指針。如果你的指針是8字節對齊的,那麼你可以使用另外3個低位,讓你隨意使用20個空閒位。

如果您不知道您的指針是否會設置其高位,則可以將指針存儲在最高有效位中,並執行算術右移以將自定義值轉換爲規範指針。

換句話說,使用指針中其他未使用的位是絕對安全的。只有兩個你需要遵循的規則:

  1. 決不使用更多的比特比允許的。如果操作系統說48 bits virtual,那意味着您只能使用高16位。如果有一天某個新CPU使用50 bits virtual,則只能有14位。

  2. 解引用時總是產生一個規範指針。這意味着最高16位必須全部與第17位相同。如果您有50 bits virtual,則必須確保最高14位與第15個最高位相同。

+0

那麼,您是說這些位可以安全地用於自定義數據? :) – kravemir

+0

CPU只是接受指令並執行它,所以你會在哪裏屏蔽和/或提取? 另外,正如我已經提到的,這聽起來不像一個聰明的設計,因爲操作系統可能在未來使用這些,與硬件相同。所以最終它會打破。 – m0skit0

+0

@Miro:我只是編輯帖子,說它是安全的,只要你遵守規則。 – Gabe

-2

架構支持64位尋址,但目前的CPU不。你只能使用48位尋址,所以不能,你不能使用這16位。當然,我們在這裏討論物理地址。對於虛擬地址,您確實可以使用64位尋址。

如果是的話,那麼他們是誰?它們如何被使用?我總是 必須掩碼的地址,還是別的?

他們是最顯著的。我不知道你爲什麼需要掩飾任何東西。只是不要使用這些位。

Related question

+1

我知道這些位不用於地址解析。我希望他們使用自定義數據:) – kravemir

+0

這聽起來不是一個好主意。 – m0skit0

+1

只要你在解引用指針之前隱藏自定義位,就可以將它們用於任何你想要的。只要確保你沒有使用比可用的更多的位,並且你的指針總是規範的。 – Gabe

相關問題