Ko'chirish (hisoblash) - Relocation (computing)

Ko'chirish dasturning pozitsiyasiga bog'liq kod va ma'lumotlar uchun yuk manzillarini berish va tayinlangan manzillarni aks ettirish uchun kod va ma'lumotlarni sozlash jarayoni.[1][2] Ko'p protsessli tizimlar paydo bo'lishidan oldin va ko'plab ichki tizimlarda ob'ektlarning manzillari bo'lgan mutlaq ma'lum bo'lgan joydan boshlab, ko'pincha nolga teng. Ko'p ishlov berish tizimlari dasturlar o'rtasida dinamik ravishda bog'lanib va ​​almashinib borganligi sababli, ob'ektlardan foydalangan holda boshqa joyga ko'chirish imkoniyati paydo bo'ldi pozitsiyadan mustaqil kod.A bog'lovchi odatda ko'chirishni bilan birgalikda amalga oshiradi belgi o'lchamlari, ramziy havolalar yoki nomlarini almashtirish uchun fayllar va kutubxonalarni qidirish jarayoni kutubxonalar haqiqiy foydalanish manzillari bilan xotira dasturni ishga tushirishdan oldin.

Ko'chirish odatda bog'lovchi tomonidan amalga oshiriladi ulanish vaqti, lekin u ham amalga oshirilishi mumkin yuklanish vaqti boshqa joyga ko'chirish orqali yuklovchi, yoki da ishlash vaqti ishlaydigan dastur tomonidan o'zi. Ba'zi arxitekturalar ko'chib o'tishni butunlay kechiktirish orqali oldini oladi manzilni belgilash ishlash vaqti; bu sifatida tanilgan nolinchi arifmetik.[qaysi? ]

Segmentatsiya

Ob'ekt fayllari turli xillarga bo'linadi xotira segmenti turlari. Misol segmentlari kiradi kod segmenti (.text), boshlang'ich ma'lumotlar segmenti (.data), boshlanmagan ma'lumotlar segmenti (.bss ) yoki boshqalar.[tushuntirish kerak ]

Ko'chirish jadvali

Ko'chirish jadvali - ro'yxati ko'rsatgichlar tarjimon tomonidan yaratilgan (a kompilyator yoki montajchi ) va ob'ektda yoki bajariladigan faylda saqlanadi. Jadvaldagi har bir yozuv yoki "tuzatish" a ko'rsatgich ob'ekt kodidagi mutlaq manzilga, yuklagich dasturni boshqa joyga o'zgartirganda o'zgartirilishi kerak, shunda u to'g'ri joyga murojaat qiladi. Tuzatishlar dasturni to'liq birlik sifatida boshqa joyga ko'chirishni qo'llab-quvvatlashga mo'ljallangan. Ba'zi hollarda, jadvaldagi har bir tuzatish o'zi nolinchi asosiy manzilga nisbatan, shuning uchun o'rnatuvchi jadval bo'ylab harakatlanayotganda fiksajlarning o'zi o'zgarishi kerak.[2]

Ba'zi arxitekturalarda ma'lum chegaralarni kesib o'tuvchi (masalan, segment chegarasi) yoki so'z chegarasida to'g'ri kelmagan tuzatish noqonuniy hisoblanadi va bog'lovchining xatosi sifatida belgilanadi.[3]

DOS va 16 bitli Windows

Uzoq ko'rsatgichlar (32-bit bilan ko'rsatgichlar segment: ofset, 20-bit 640-ga murojaat qilish uchun ishlatiladi KB xotira mavjud joy DOS dasturlar ) kodi yoki a ichidagi ma'lumotlarni ko'rsatuvchi DOS-ning bajarilishi mumkin (exe ), mutlaq segmentlarga ega emas, chunki haqiqiy manzil kod / ma'lumotlar dasturning xotiraga yuklangan joyiga bog'liq va bu dastur yuklanmaguncha ma'lum emas.

Buning o'rniga segmentlar DOS EXE faylidagi nisbiy qiymatlardir. Amalga oshiriladigan fayl xotiraga yuklanganda, ushbu segmentlarni tuzatish kerak. EXE yuklovchi sozlanishi kerak bo'lgan segmentlarni topish uchun ko'chirish jadvalidan foydalanadi.

32-bitli Windows

32-bitli Windows operatsion tizimlarida EXE fayllarini ko'chirish jadvallarini taqdim etish majburiy emas, chunki ular virtual manzil maydoniga yuklangan birinchi rasm va shu bilan ular afzal qilingan manzilga yuklanadi.

Ikkala DLL va EXE uchun manzil maydonini tasodifiylashtirish (ASLR) - an ekspluatatsiya Windows Vista-da kiritilgan yumshatish texnikasi, ko'chirish jadvallari yana bir bor majburiy bo'lib qoladi, chunki ikkilikni bajarilishidan oldin ularni dinamik ravishda ko'chirish mumkin, chunki ular virtual manzil maydoniga yuklangan birinchi narsa.

64-bitli Windows

Windows Vista va undan yuqori versiyalarida mahalliy 64-bitli ikkiliklarni ishlatishda ASLR majburiydir[iqtibos kerak ]va shu tariqa ko'chirish bo'limlarini kompilyator qoldirib bo'lmaydi.

Unixga o'xshash tizimlar

The Bajariladigan va bog'lanadigan format Unix-ga o'xshash tizimlarning ko'pchiligida ishlatiladigan (ELF) bajariladigan format va umumiy kutubxona formati bir necha turdagi ko'chib o'tishni aniqlashga imkon beradi.[4]

Ko'chib o'tish tartibi

Bog'lovchi ob'ekt fayllaridagi segment ma'lumotlari va boshqa joylarga ko'chirish jadvallarini o'qiydi va quyidagilar orqali ko'chirishni amalga oshiradi.

  • umumiy tipdagi barcha segmentlarni ushbu turdagi bitta segmentga birlashtirish
  • har bir bo'limga va har bir belgiga noyob ish vaqti manzillarini tayinlash, barcha kodlar (funktsiyalar) va ma'lumotlarga (global o'zgaruvchilar) noyob ish vaqti manzillarini berish
  • ga ishora qiladi ko'chirish jadvali o'zgartirish[nega? ] ramzlari to'g'ri tomonga ishora qilishi uchun[tushuntirish kerak ] ish vaqti manzillari.

Misol

Quyidagi misoldan foydalaniladi Donald Knuth "s MIX arxitektura va MIXAL assambleyasi tili. Har qanday arxitektura uchun printsiplar bir xil, ammo tafsilotlar o'zgaradi.

Ko'chirish misoli.tif
  • (A) dastur SUBR ob'ekt faylini (B) ishlab chiqarish uchun tuzilgan, ham mashina kodi, ham yig'uvchi sifatida ko'rsatilgan. Kompilyator kompilyatsiya qilingan kodni o'zboshimchalik bilan, aksariyat hollarda ko'rsatilgandek 1 joyda boshlashi mumkin. Joylashuv 13 ga o'tish buyrug'i uchun mashina kodini o'z ichiga oladi ST 5-joyda.
  • (C) Agar SUBR keyinchalik u boshqa kod bilan bog'langan bo'lib, u 1-dan boshqa joyda saqlanishi mumkin. Ushbu misolda bog'lovchi uni 120-joyga joylashtiradi. Hozir 133-manzilda joylashgan o'tish buyrug'idagi manzil bo'lishi kerak boshqa joyga ko'chirilgan bayonot uchun kodning yangi joyiga ishora qilish ST, endi 125. [1 61 yo'riqnomada ko'rsatilgan 125 ning MIX mashina kodining vakili].
  • (D) Dasturni ishga tushirish uchun xotiraga yuklanganda, u bog'lovchi tomonidan tayinlangan joydan boshqa joyda yuklanishi mumkin. Ushbu misol ko'rsatib turibdi SUBR Endi 313-chi. o'tish buyrug'idagi manzilni qayta ko'chirish kerak, shunda u yangilangan manzilga ishora qiladi. ST, 305. [4 49 - bu 305 ning MIX mashina vakili].

Shuningdek qarang

Adabiyotlar

  1. ^ "Ob'ekt kodining turlari". iRMX 86 Application Loader uchun qo'llanma (PDF). Intel. 1-2, 1-3 betlar. Arxivlandi (PDF) asl nusxasidan 2020-01-11. Olingan 2020-01-11. […] Mutlaq kodva mutlaq ob'ekt moduli bu LOC86 tomonidan qayta ishlangan kod bo'lib, faqat xotirada ma'lum bir joyda ishlaydi. The Yuklovchi mutlaq ob'ekt modulini faqat modul egallashi kerak bo'lgan joyga yuklaydi. Pozitsiyadan mustaqil kod (odatda PIC deb nomlanadi) mutlaq koddan farq qiladi, chunki PICni har qanday xotira joyiga yuklash mumkin. PIC-ning absolyut koddan ustunligi shundaki, PIC sizga ma'lum bir xotira blokini zaxiralashni talab qilmaydi. Loader PIC-ni yuklaganida, u oladi iRMX 86 qo'ng'iroq qilish vazifasi havzasidagi xotira segmentlari va PICni segmentlarga yuklaydi. PIC-ga nisbatan cheklov, bu kabi PL / M-86 COMPACT segmentatsiya modeli […], u ushbu segmentlarning asosiy manzillariga va shuning uchun segmentlarning o'zlariga dinamik ravishda o'zgarishiga yo'l qo'ymasdan, faqat bitta kod segmentiga va bitta ma'lumot segmentiga ega bo'lishi mumkin. Bu shuni anglatadiki, PIC dasturlarining uzunligi 64K baytdan kam bo'lishi shart. PIC-kodni LINK86-ning BIND boshqaruvi yordamida ishlab chiqarish mumkin. Yuklanish vaqti bo'yicha joylashadigan kod (odatda LTL kodi deb ataladi) ob'ekt kodining uchinchi shakli. LTL kodi PIC-ga o'xshaydi, chunki LTL kodi xotiraning istalgan joyiga yuklanishi mumkin. Biroq, LTL kodini yuklashda Loader ko'rsatgichlarning mikroprotsessoridagi registrlarning boshlang'ich tarkibidan mustaqil bo'lishi uchun ko'rsatgichlarning asosiy qismini o'zgartiradi. Ushbu tuzatish tufayli (asosiy manzillarni sozlash) LTL kodidan bir nechta kod segmenti yoki bir nechta ma'lumotlar segmenti bo'lgan vazifalar foydalanishi mumkin. Bu shuni anglatadiki, LTL dasturlari uzunligi 64K baytdan ortiq bo'lishi mumkin. FORTRAN 86 va Paskal 86 avtomatik dastur, hatto qisqa dasturlar uchun ham LTL kodini ishlab chiqaradi. LTL kodini LINK86 ning BIND boshqaruvi yordamida ishlab chiqarish mumkin. […]
  2. ^ a b Levin, Jon R. (2000) [1999 yil oktyabr]. "1-bob: bog'lanish va yuklash va 3-bob: ob'ekt fayllari". Birlashtiruvchi va yuklagichlar. Dasturiy ta'minot va dasturlash bo'yicha Morgan Kaufmann seriyasi (1 nashr). San-Fransisko, AQSh: Morgan Kaufmann. p. 5. ISBN  1-55860-496-0. OCLC  42413382. Arxivlandi asl nusxasidan 2012-12-05. Olingan 2020-01-12. Kod: [1][2] Xato: [3]
  3. ^ Borland (1999-09-01) [1998-07-02]. "Borland maqola # 15961:" Fixup overflow "xabarlari bilan kurashish". hamjamiyat.borland.com. Texnik ma'lumotlar bazasi - Mahsulot: Borland C ++ 3.1. TI961C.txt # 15961. Arxivlandi asl nusxasidan 2008-07-07. Olingan 2007-01-15.
  4. ^ "Bajariladigan va bog'lanadigan format (ELF)" (PDF). skyfree.org. Asbob interfeysi standartlari (TIS) ko'chma formatlar spetsifikatsiyasi, 1.1-versiya. Arxivlandi (PDF) asl nusxasidan 2019-12-24. Olingan 2018-10-01.

Qo'shimcha o'qish