題 什麼是8086可重定位?


我正在運行一些Fortran軟件(LBLRTM)和一個準備輸入的shell腳本生成一些帶有名字的文件 TAPE3TAPE4等。出於調試目的,我用過 file 識別文件類型。 file 告訴我:

TAPE3:  8086 relocatable (Microsoft)

我的猜測是 file 這裡是錯誤的,它只是一個看起來像一個二進製文件 8086 relocatable。但是什麼  一個 8086 relocatable


4
2017-10-25 09:41


起源


哦,天哪,這是老派的地獄。當我在尿佈時,我父親曾經使用過fortran。 - Journeyman Geek♦
Fortran仍然經常用於科學和工程領域。參見例如 這裡。我試圖運行的代碼不是我的,而且我不精通Fortran,所以我的問題很難調試(但這個問題不是關於實際的調試,而只是一個好奇的東西)。 - gerrit


答案:


我認為可重定位代碼早於虛擬內存(VM)。替代方案是絕對代碼,必須將其加載到物理內存中的特定位置(例如,因為它包含具有物理地址作為目標的“跳轉”指令)

8086向後兼容舊處理器,這些處理器只能使用16位地址寄存器來處理64KB內存。 8086還具有16位段寄存器,其被考慮(例如,當執行跳轉指令時)基本上實際地址=地址+段<< 4。這允許(可重定位)程序位於1MB內存中與16字節“段”邊界對齊的位置(上面計算中的4位移位)。此類程序只能處理64KB。顯然,操作系統在上下文切換時適當地更改了段寄存器。

很明顯,如果你的程序操作段寄存器,也許它可以使用超過64 KB的內存,就不能以這種方式重新定位。

如果英特爾8086/8088程序不嘗試操作段寄存器,則它有時可以重定位,或者更確切地說,位置無關。在這種情況下,OS可以將程序加載到16字節邊界的可用存儲器中的任何位置,相應地設置段寄存器,程序將正確運行。但是,在此模式下,程序只能訪問四個64KB的內存段。

也可以是位置無關的並且可以訪問程序的更多存儲器,採用將所有段操作偏置到程序啟動時存在的初始值的方法。

請注意,此討論未考慮加載模塊格式本身可重定位的可能性,需要加載器進行重定位。這是第三種可能性。

http://wiki.answers.com/Q/Why_are_8086_programs_called_relocatble_programs

8086對像模塊格式允許指定   可重定位的內存可以相互鏈接的內存。   提供了允許有效使用存儲器的能力   8086微處理器的映射設施。

8086可重定位的對像模塊格式
英特爾技術規範

http://en.wikipedia.org/wiki/Intel_8086#Segmentation


4
2017-10-25 10:02