2016-04-24 123 views
0

編譯時間。如果在編譯時知道進程將在內存中駐留 ,則可以生成絕對代碼。例如,如果您知道用戶進程將從位置R開始駐留的 ,則生成的 編譯器代碼將從該位置開始並從那裏向上延伸。如果在 的某個較晚的時間,的起始位置發生變化,那麼將需要 重新編譯此代碼。 MS-DOS .COM格式的程序在編譯時綁定在 。關於地址綁定的困惑

  • 什麼可以是起始位置改變的原因?由於上下文切換/交換,它可以是 嗎?
  • 絕對代碼是指二進制代碼嗎?

加載時間。如果在編譯時未知進程將在內存中駐留 ,那麼編譯器必須生成可重定位代碼。在這種情況下, 最終綁定會延遲到加載時間。如果起始地址發生變化,我們需要 重新加載用戶代碼來合併此更改的值。

  • 可重定位代碼與絕對代碼有什麼不同?它是否包含有關基地,限制和重新安置登記的信息?
  • 如何重新加載更有效然後重新編譯,因爲他們提到只有重新加載意味着沒有重新編譯只重新加載?

執行時間。如果可以在執行過程中將移動到從 一個內存段到另一個內存段,則綁定必須延遲到運行 時間。 。

  • 爲什麼在執行過程中需要移動一個進程?

    編譯時和加載時地址綁定方法生成相同的邏輯和物理地址。但是,執行時地址綁定方案導致不同的邏輯和物理地址。

  • 編譯和加載時間方法如何生成相同的邏輯和物理地址?

回答

0

首先,我會找到一個更好的信息來源。你有什麼是非常可憐的。

什麼可以是起始位置改變的原因?它可能是因爲上下文切換/交換?

您更改了代碼或需要將代碼加載到內存中的其他位置。

絕對碼是指二進制碼嗎?

不是。它們是獨立的概念。

可重定位代碼與絕對代碼有什麼不同?它是否包含有關基地,限制和重新安置登記的信息?

可重定位代碼使用相對地址,通常相對於程序計數器。

(基本限制和重定位寄存器將是系統特定的ocncept)。

如何重新加載更有效然後重新編譯,因爲他們提到只有重新加載意味着沒有重新編譯只重新加載?

假設兩個不同的程序使用相同的動態庫。他們需要在內存中的不同位置加載。這不是一個效率問題。

爲什麼在執行過程中需要移動一個進程?

這是在虛擬內存之前的日子裏完成的。據我所知,沒有人再做這件事。

編譯和加載時間方法如何生成相同的邏輯和物理地址?

我不知道他們在說什麼&^54。這一說法毫無意義。

+0

這是我大學推薦的教科書(OS概念SILBERSCHATZ,GALVIN,GAGNE)。你能推薦一本更好的書嗎? – user5951764

+0

這解釋了它。 VAX/VMS操作系統內部成本低廉。 – user3344003

0

動態庫文件(.dll .so)的重定位的,因爲它們可能會出現在不同應用不會忽略,但爲了節省內存,操作系統只有在物理內存中一個副本(虛擬內存很棒),並且每個應用程序都具有隻讀訪問權限。

對於可重定位的應用程序也是如此。爲了安全起見,地址也是隨機的 - 一些遠程攻擊是輕微的困難