2013-04-07 56 views
0

在「操作系統概念」 Silberchatz的書,它說共享代碼的邏輯地址

「共享代碼必須出現在所有進程的邏輯地址空間相同的位置」,

爲什麼它是否必須出現在相同的位置?我認爲對於每個進程我們都有一個單獨的頁表,這使得可以在不同的邏輯地址中擁有共享代碼地址!

回答

1

機器碼很少完全與位置無關。如果您有一些代碼在位於地址0x10000(邏輯/虛擬)時被編譯爲可用,並且您將其移至地址0x70000(邏輯/虛擬),則它將無法在新位置工作。

頁表不能幫助這個。相對於instruction pointer(AKA program counter),代碼/數據尋址模式有哪些。一些CPU擁有它,有些沒有它,但有些則沒有它(例如它們只能用於將控制轉移到其他地方(例如jump/call)的指令,但對於數據(例如move))。

+0

從我所做的你所說的, 當共享代碼需要引用它自己時,它需要知道它所在的邏輯地址空間。由於共享代碼無法爲訪問它的每個進程自行更改,這意味着邏輯地址空間必須在所有共享進程中保持不變。 這是否也意味着您不能使用2個使用相同邏輯地址空間的共享代碼? – 2bigpigs 2015-12-07 06:44:22

+1

@ 2bigpigs共享代碼可以處理位於不同位置的數據,只要它的設計和編譯方式使得在每個地址空間中調用者爲其提供數據地址或者可以以某種方式從環境中獲取所述地址(例如TLS等等)。很明顯,你不能同時在相同的地址空間內交叉代碼/數據。但我認爲,共享代碼不必完全共享。如果您不能在一個地址空間中的地址與其他所有地址中的地址相同,則可以將該庫的另一個副本重新定位到其他位置。 – 2015-12-07 07:16:06