Yer değiştirme (bilgi işlem) - Relocation (computing)

Yer değiştirme , bir programın konuma bağlı kodu ve verileri için yük adreslerinin atanması ve kodun ve verilerin atanan adresleri yansıtacak şekilde ayarlanması işlemidir. Çok işlemli sistemlerin ortaya çıkmasından önce ve hala birçok gömülü sistemde, nesnelerin adresleri , genellikle sıfır olan bilinen bir konumdan başlayarak mutlaktı . Çoklu işlem sistemleri dinamik olarak programlar arasında bağlantı kurduğu ve geçiş yaptığı için, konumdan bağımsız kod kullanarak nesnelerin yerini değiştirebilmek gerekli hale geldi . Bir bağlayıcı genellikle , bir programı çalıştırmadan önce bellekteki sembolik referansları veya kitaplık adlarını gerçek kullanılabilir adreslerle değiştirmek için dosya ve kitaplık arama işlemi olan sembol çözünürlüğü ile birlikte yeniden konumlandırma gerçekleştirir .

Yer değiştirme tipik olarak linker tarafından bağlantı zamanında yapılır , ancak aynı zamanda yükleme zamanında yer değiştiren bir yükleyici tarafından veya çalışma zamanında çalışan programın kendisi tarafından da yapılabilir . Bazı mimariler, adres atamasını çalışma zamanına erteleyerek yer değiştirmeyi tamamen önler ; bu, sıfır adres aritmetiği olarak bilinir .

segmentasyon

Nesne dosyaları çeşitli bellek segment türlerine ayrılır. Örnek segmentler arasında kod segmenti(.text) , başlatılmış veri segmenti(.data) , başlatılmamış veri segmenti(.bss ) veya diğerleri bulunur.

Yer değiştirme tablosu

Taşınma masa listesidir işaretçiler çevirmen (a yarattığı derleyici veya montajcı ) ve nesne veya yürütülebilir dosyada saklanır. Tablodaki her giriş veya "düzeltme", yükleyici programı doğru konuma başvuracak şekilde yeniden konumlandırdığında değiştirilmesi gereken nesne kodundaki mutlak bir adrese yönelik bir işaretçidir . Düzeltmeler, programın tam bir birim olarak yeniden yerleştirilmesini desteklemek için tasarlanmıştır. Bazı durumlarda, tablodaki her düzeltmenin kendisi sıfır temel adresine göredir, bu nedenle yükleyici tabloda hareket ederken düzeltmelerin kendileri değiştirilmelidir.

Bazı mimarilerde, belirli sınırları (bir segment sınırı gibi) geçen veya bir sözcük sınırına hizalanmayan bir düzeltme yasa dışıdır ve bağlayıcı tarafından bir hata olarak işaretlenir.

DOS ve 16 bit Windows

Bir DOS yürütülebilir dosyası ( EXE ) içindeki koda veya verilere işaret eden uzak işaretçiler ( segment :offset ile 32-bit işaretçiler, DOS programlarında kullanılabilen 20-bit 640 KB bellek alanını adreslemek için kullanılır ), mutlak segmentlere sahip değildir, çünkü kodun/verinin gerçek adresi , programın bellekte nereye yüklendiğine bağlıdır ve program yüklenene kadar bu bilinmez.

Bunun yerine segmentler, DOS EXE dosyasındaki göreli değerlerdir. Yürütülebilir dosya belleğe yüklendiğinde bu bölümlerin düzeltilmesi gerekir. EXE yükleyici , ayarlanması gereken bölümleri bulmak için bir yer değiştirme tablosu kullanır.

32 bit Windows

32 bit Windows işletim sistemlerinde EXE dosyaları için yer değiştirme tablolarının sağlanması zorunlu değildir, çünkü bunlar sanal adres alanına yüklenen ilk görüntüdür ve bu nedenle tercih edilen temel adrese yüklenir.

Hem DLL'ler hem de adres alanı düzeni rastgeleleştirmesini (ASLR) seçen EXE'ler için - Windows Vista ile tanıtılan bir istismar azaltma tekniği - ikili dosyanın yürütülmeden önce dinamik olarak hareket ettirilebilmesi olasılığı nedeniyle yer değiştirme tabloları bir kez daha zorunlu hale gelir. hala sanal adres alanına yüklenen ilk şeydir.

64 bit Windows

Windows Vista ve üzeri sürümlerde yerel 64 bit ikili dosyaları çalıştırırken, ASLR zorunludur ve bu nedenle yer değiştirme bölümleri derleyici tarafından atlanamaz.

Unix benzeri sistemler

Çalıştırılabilir ve Bağlantılanabilir Biçim Unix benzeri sistemlerde yer değiştirme çeşitli sağlayan en kullandığı (ELF) yürütülebilir biçimi ve ortak kitaplığı biçimi tarif edilecek.

Yer değiştirme prosedürü

Bağlayıcı, nesne dosyalarındaki segment bilgilerini ve yer değiştirme tablolarını okur ve yer değiştirme işlemini şu şekilde gerçekleştirir:

  • ortak tipteki tüm segmentleri o tipteki tek bir segmentte birleştirmek
  • tüm kod (fonksiyonlar) ve veri (global değişkenler) benzersiz çalışma süresi adresleri vererek, her bölüme ve her sembole benzersiz çalışma süresi adresleri atama
  • sembolleri doğru çalışma zamanı adreslerini gösterecek şekilde değiştirmek için yer değiştirme tablosuna başvurun.

Örnek

Aşağıdaki örnek kullanır Donald Knuth 'ın MIX mimarisi ve MIXAL montaj dili. Detaylar değişse de ilkeler her mimari için aynıdır.

Yer değiştirme örneği.tif
  • (A) Program SUBR , hem makine kodu hem de birleştirici olarak gösterilen nesne dosyası (B) üretmek için derlenir. Derleyici, derlenmiş kodu, gösterildiği gibi, genellikle konum 1 olmak üzere, rastgele bir konumda başlatabilir. Konum 13, konum 5'teki ST ifadesine atlama komutu için makine kodunu içerir .
  • (C) SUBR daha sonra başka bir kodla bağlantılıysa, 1 dışında bir yerde saklanabilir. Bu örnekte, bağlayıcı onu 120 konumuna yerleştirir. Şu anda 133 konumunda olan atlama talimatındaki adresin yeri değiştirilmelidir. ST ifadesi için kodun yeni konumuna işaret etmek için , şimdi 125. [1 61 talimatta gösterilen, 125'in MIX makine kodu gösterimidir].
  • (D) Program çalıştırılmak üzere belleğe yüklendiğinde, bağlayıcı tarafından atanan yerden başka bir yere yüklenebilir. Bu örnek, şimdi SUBR konumunda 300'ü göstermektedir . Şimdi 313'te olan atlama komutundaki adresin, ST , 305'in güncellenmiş konumuna işaret etmesi için yeniden konumlandırılması gerekmektedir. [4 49, 305]'in MIX makine temsilidir.

Ayrıca bakınız

Referanslar

daha fazla okuma