Pozitsiyadan mustaqil kod - Position-independent code

Yilda hisoblash, pozitsiyadan mustaqil kod[1] (PIC[1]) yoki pozitsiyadan mustaqil bajariladigan (PIE)[2] ning tanasi mashina kodi ning biron bir joyiga joylashtirilgan asosiy xotira, qat'i nazar, to'g'ri bajaradi mutlaq manzil. PIC odatda uchun ishlatiladi umumiy kutubxonalar, shu bilan bir xil kutubxona kodini dasturning har bir manzil maydonida, u ishlatilayotgan boshqa xotiraga (masalan, boshqa umumiy kutubxonalarga) to'g'ri kelmaydigan joyga yuklash uchun. PIC shuningdek, eski kompyuter tizimlarida ishlatilmagan MMU,[3] shunday qilib operatsion tizim dasturlarni bitta ichida ham bir-biridan uzoqlashtirishi mumkin manzil maydoni MMUsiz tizim.

Pozitsiyadan mustaqil kod har qanday xotira manzilida o'zgartirilmasdan bajarilishi mumkin. Bu farq qiladi mutlaq kod,[1] to'g'ri ishlashi uchun ma'lum bir joyga o'rnatilishi kerak,[1] va yuklanish vaqtini aniqlash mumkin (LTL) kodi,[1] unda a bog'lovchi yoki dastur yuklagichi dasturni bajarilishidan oldin o'zgartiradi, shuning uchun uni faqat ma'lum bir xotira joyidan ishlatish mumkin.[1] Pozitsiyadan mustaqil kodni yaratish odatda odatiy xatti-harakatlardir kompilyatorlar, lekin ular ba'zi bir til xususiyatlaridan foydalanishga cheklovlar qo'yishi mumkin, masalan, mutlaq manzillardan foydalanishni taqiqlash (pozitsiyadan mustaqil kod foydalanishi kerak) nisbiy adreslash ). To'g'ridan-to'g'ri ma'lum bir xotira manzillariga murojaat qiladigan ko'rsatmalar tezroq bajariladi va ularni nisbiy manzilga teng ko'rsatmalar bilan almashtirish biroz sekinroq bajarilishiga olib kelishi mumkin, ammo zamonaviy protsessorlar bu farqni deyarli ahamiyatsiz qiladi.[4]

Tarix

Kabi dastlabki kompyuterlarda IBM 701[5] (1952 yil 29-aprel) yoki UNIVAC I (1951 yil 31-mart) kod pozitsiyaga bog'liq edi: har bir dastur ma'lum manzilga yuklash va undan ishlash uchun qurilgan. Ushbu dastlabki kompyuterlar operatsion tizimga ega bo'lmagan va ko'p vazifalarni bajarishga qodir bo'lmagan. Dasturlar asosiy omborga yuklangan (yoki to'g'ridan-to'g'ri u erdan bajarish uchun magnit barabanda saqlangan) va birma-bir ishlaydi. Bunday operatsion sharoitda pozitsiyadan mustaqil kod zarur emas edi.

The IBM System / 360 (1964 yil 7 aprel) bilan ishlab chiqilgan qisqartirilgan manzil ga o'xshash UNIVAC III,[6] hisobga olgan holda kod pozitsiyasining mustaqilligi. Kesilgan adreslashda xotira manzillari a dan hisoblanadi asosiy registr va ofset. Dasturning boshida dasturchi o'rnatishi kerak manzillilik bazaviy registrni yuklash orqali; odatda dasturchi shuningdek, yig'uvchiga a bilan xabar beradi FOYDALANISH psevdo-op. Dasturchi asosiy registrni kirish nuqtasi manzilini o'z ichiga olgan ro'yxatdan, odatda R15 dan yuklashi yoki ishlatishi mumkin BALR (Filial va bog'lanish, Ro'yxatdan o'tish shakli) buyrug'i (R2 qiymati bilan 0) navbatdagi ketma-ketlik ko'rsatmalarining manzilini bazaviy registrda saqlash uchun, keyinchalik dastur ichida saqlash joyiga ishora qilgan har bir ko'rsatmada aniq yoki yopiq kodlangan. Kod yoki ma'lumotlar uchun bir nechta asosiy registrlardan foydalanish mumkin. Bunday ko'rsatmalar kamroq xotirani talab qiladi, chunki ular to'liq 24, 31, 32 yoki 64 bitli manzilni (4 yoki 8 bayt) ushlab turishlari shart emas, aksincha asosiy registr raqami (4 bit bilan kodlangan) va 12 bitli manzilni ofset qilishlari kerak (12 bitda kodlangan), faqat ikkita baytni talab qiladi.

Ushbu dasturlash texnikasi IBM S / 360 tipidagi tizimlarda standart hisoblanadi. U bugungi IBM System / z tizimida ishlatilgan. Yig'ish tilida kodlashda dasturchi yuqorida aytib o'tilganidek dastur uchun manzilni o'rnatishi va dinamik ravishda ajratilgan saqlash uchun boshqa asosiy registrlardan foydalanishi kerak. Ushbu turdagi manzillar haqida kompilyatorlar avtomatik ravishda g'amxo'rlik qilishadi.

IBMning dastlabki operatsion tizimi DOS / 360 (1966) virtual xotiradan foydalanmagan (chunki tizim S / 360 ning dastlabki modellari uni qo'llab-quvvatlamagan), ammo PHASE nomi orqali yuklash paytida dasturlarni o'zboshimchalik bilan (yoki avtomatik ravishda tanlangan) saqlash joyiga joylashtirish imkoniyatiga ega edi, * JCL (Ishni boshqarish tili) bayonoti.

Shunday qilib, virtual xotirasiz S / 360 tizimlarida dastur har qanday saqlash joyiga yuklanishi mumkin edi, ammo buning uchun ushbu dasturni ushlab turish uchun etarlicha katta tutashgan xotira maydoni kerak edi. Ba'zan xotira parchalanishi turli o'lchamdagi modullarni yuklash va tushirishdan kelib chiqadi. Virtual saqlash - dizayni bo'yicha - bu cheklovga ega emas.

DOS / 360 va OS / 360 vaqtinchalik, PIC-ni qo'llab-quvvatlamadi SVC tartiblari OS / 360 da ko'chiriladigan manzil konstantalarini o'z ichiga olmaydi va biron bir vaqtinchalik hududlarda ko'chirilmasdan ishlashi mumkin.

Virtual saqlash birinchi marta joriy qilingan IBM System / 360 modeli 67 (1965) yilda IBMning birinchi ko'p vazifali operatsion va vaqtni taqsimlovchi TSS / 360 operatsion tizimini qo'llab-quvvatlash uchun. DOS / 360 (DOS / VS va boshqalar) ning keyingi versiyalari va keyinchalik IBM operatsion tizimlari virtual xotiradan foydalangan. Qisqartirilgan adreslash bazaviy arxitekturaning bir qismi bo'lib qoldi va bir nechta virtual modullar bir xil virtual manzil maydoniga yuklanganda ham foydali.

Boshqa erta segmentlangan kabi tizimlar Burrouz MCP ustida Burrouz B5000 (1961) va Multics (1964), IBM kabi disk xotira tizimlari TSS / 360 (1967)[a] yoki asos va chegaralar[b] kabi tizimlar GECOS ustida GE 625 va EXEC ustida UNIVAC 1107, kod tabiiy ravishda pozitsiyadan mustaqil edi, chunki dasturdagi manzillar mutlaq emas, balki joriy segmentga nisbatan edi.

Dinamik manzil tarjimasi ixtirosi (funktsiya an tomonidan taqdim etilgan MMU ) dastlab pozitsiyadan mustaqil kodga bo'lgan ehtiyojni kamaytirdi, chunki har bir jarayon o'ziga xos mustaqil bo'lishi mumkin manzil maydoni (manzillar oralig'i). Shu bilan birga, bir xil koddan foydalangan holda bir vaqtning o'zida bir nechta ish jismoniy xotirani behuda sarflashga olib keldi. Agar ikkita ish bir xil dasturlarda ishlasa, dinamik manzil tarjimasi tizimga dasturning bitta nusxasini o'z ichiga olgan ikki xil ish manzilining 32K manzilini bir xil real xotirada xaritada ko'rsatishga imkon berish orqali echim beradi.

Turli xil dasturlar umumiy kod bilan bo'lishishi mumkin. Masalan, ish haqi dasturi va debitorlik qarzlari dasturida ikkalasi ham bir xil turdagi pastki dasturni o'z ichiga olishi mumkin. Umumiy modul (umumiy kutubxona - bu umumiy modulning bir shakli) bir marta yuklanadi va ikkita manzil maydoniga joylashtiriladi.

Texnik ma'lumotlar

Umumiy kutubxona ichidagi protsedura qo'ng'iroqlari odatda kichik protsedura havolasi jadvali orqali amalga oshiriladi stublar, keyin aniq funktsiyani chaqiradi. Bu, ayniqsa, umumiy kutubxonaga o'z versiyalarini ishlatishdan ko'ra, avval yuklangan kutubxonalardan ma'lum funktsiya chaqiruvlarini meros qilib olishga imkon beradi.

Joylashuvga bog'liq bo'lmagan koddan ma'lumotlar havolalari odatda bilvosita, orqali amalga oshiriladi Global ofset jadvallar (GOTs), ular kirilgan barcha manzillarni saqlaydi global o'zgaruvchilar. Har bir kompilyatsiya birligi yoki ob'ekt moduli uchun bitta GOT mavjud va u koddan belgilangan ofsetda joylashgan (garchi bu ofset kutubxona bo'lmaguncha ma'lum emas) bog'langan ). Qachon bog'lovchi umumiy kutubxonani yaratish uchun modullarni bog'laydi, u GOT-larni birlashtiradi va oxirgi ofsetlarni kodga o'rnatadi. Keyinchalik umumiy kutubxonani yuklashda ofsetlarni sozlash shart emas.

Global ma'lumotlarga kiradigan pozitsiyalardan mustaqil funktsiyalar GOT-ning mutlaq manzilini aniqlashdan boshlanadi, chunki ular dasturning hisoblagich qiymatini hisobga olgan holda. Bu tez-tez stekka qaytish qiymatini olish uchun soxta funktsiya chaqiruvi shaklini oladi (x86 ) yoki maxsus reestrda (PowerPC, SPARC, MIPS, ehtimol hech bo'lmaganda boshqasi RISC protsessorlar[kaltakesak so'zlar ], ESA / 390 ), keyin ularni oldindan belgilangan standart registrda saqlash mumkin. Ba'zi protsessorlarning arxitekturalari, masalan Motorola 68000, Motorola 6809, WDC 65C816, Knutniki MMIX, ARM va x86-64 dan ofset orqali ma'lumotlarga murojaat qilishga ruxsat berish dastur hisoblagichi. Bu, ayniqsa, pozitsiyadan mustaqil kodni kichikroq, kamroq registrni talab qiladigan va shuning uchun yanada samarali qilishga qaratilgan.

Windows DLL-lari

Dinamik bog'langan kutubxonalar (DLL) Microsoft Windows CALL yo'riqnomasining E8 variantidan foydalaning (keyingi buyruqqa nisbatan yaqin, nisbiy, siljish). DLL yuklanganda ushbu ko'rsatmalar tuzatilishi shart emas.

Ba'zi global o'zgaruvchilar (masalan, qatorlar qatori, virtual funktsiya jadvallari) mos ravishda dinamik kutubxonaning kod qismida ma'lumotlar qismidagi ob'ekt manzilini o'z ichiga olishi kerak; shuning uchun global o'zgaruvchida saqlangan manzil DLL yuklangan manzilni aks ettirish uchun yangilanishi kerak. Dinamik yuklovchi global o'zgaruvchida ko'rsatilgan manzilni hisoblab chiqadi va qiymatni shunday global o'zgaruvchida saqlaydi; bu shunday global o'zgaruvchini o'z ichiga olgan xotira sahifasini nusxa ko'chirishni boshlaydi. Kodli va global ma'lumotlarga ega bo'lmagan global o'zgaruvchilarga ega sahifalar va global ma'lumot jarayonlar o'rtasida birgalikda qoladi. Ushbu operatsiyani ixtiyoriy manzil bo'yicha dinamik kutubxonani yuklashi mumkin bo'lgan har qanday OS-da bajarish kerak.

Windows Vista va undan keyingi Windows versiyalarida ko'chirish DLL va bajariladigan fayllarni yadro xotirasi menejeri amalga oshiradi, u ko'chirilgan ikkiliklarni bir nechta jarayonlar bilan bo'lishadi. Rasmlar har doim o'zlarining afzal ko'rgan asosiy manzillaridan boshqa joyga ko'chiriladi manzil maydonini tasodifiylashtirish (ASLR).[7]

Windows-ning Vista-dan oldingi versiyalari tizim DLL-larini talab qiladi oldindan bog'langan tasvirlarni ish vaqtini boshqa joyga ko'chirmaslik uchun bog'lanish vaqtida ziddiyatli bo'lmagan aniq manzillarda. Windows-ning ushbu eski versiyalarida ish vaqtini boshqa joyga ko'chirish har bir jarayon doirasida DLL yuklagichi tomonidan amalga oshiriladi va natijada har bir rasmning ko'chirilgan qismlari endi jarayonlar o'rtasida taqsimlanmaydi.

Windows-dagi DLL-lar bilan ishlash avvalgisidan farq qiladi OS / 2 u kelib chiqadigan protsedura. OS / 2 uchinchi alternativani taqdim etadi va pozitsiyadan mustaqil bo'lmagan DLL-larni xotirada ajratilgan "umumiy maydon" ga yuklashga urinib ko'radi va ularni yuklangandan so'ng ularni xaritada aks ettiradi. DLL-ning barcha foydalanuvchilari bir xil xotiradagi nusxadan foydalanishga qodir.

Multics

Yilda Multics har bir protsedura kontseptual ravishda[c] kod segmentiga va bog'lanish segmentiga ega. Kod segmentida faqat kod mavjud va bog'lanish bo'limi yangi bog'lanish segmenti uchun andoza vazifasini bajaradi. Pointer registr 4 (PR4) protseduraning bog'lanish segmentiga ishora qiladi. Protseduraga qo'ng'iroq ko'rsatgich bilan qo'ng'iroq qiluvchining bog'lanish segmentiga yuklamasdan oldin PR4-ni stakka saqlaydi. Protsedura chaqiruvi bilvosita ko'rsatgich juftligini ishlatadi[8] Dinamik bog'lanish mexanizmi ma'lum protsedura va uning bog'lanish segmentini ma'lum segmentlar jadvaliga (KST) qo'shishi, yangi bog'lash segmentini qurishi, qo'ng'iroq qiluvchining bog'lanish bo'limiga qo'yishi uchun birinchi qo'ng'iroqda tuzoqni keltirib chiqaradigan bayroq bilan. va bilvosita ko'rsatgich juftligidagi bayroqni qayta o'rnating.

TSS

IBM S / 360 vaqtni taqsimlash tizimida (TSS / 360 va TSS / 370) har bir protsedura faqat o'qish uchun ochiq CSECT va yoziladigan shaxsiy prototip bo'limiga (PSECT) ega bo'lishi mumkin. Qo'ng'iroq qiluvchi 15-reestrga (GR15) muntazam ravishda V-doimiyni yuklaydi va muntazam ravishda PSECT uchun R-doimiyni GR13 deb ko'rsatilgan tejash maydonining 19-so'ziga ko'chiradi.[9]

Dinamik yuklovchi[10] Dastur sahifalarini yuklamaydi yoki manzil barqarorligini birinchi sahifa xatosi paydo bo'lguncha hal qilmaydi.

Pozitsiyadan mustaqil bajariladigan fayllar

Pozitsiyadan mustaqil bajariladigan fayllar (PIE) - bu butunlay pozitsiyadan mustaqil koddan tuzilgan bajariladigan ikkilik fayllar. Ba'zi tizimlar faqat PIC-ning bajariladigan dasturlarini ishlatsa, ulardan foydalanishning boshqa sabablari ham bor. Ba'zilarida PIE ikkilik fayllari ishlatiladi xavfsizlikka qaratilgan Linux ruxsat berish uchun tarqatish PaX yoki Exec Shield foydalanish manzil maydonini tasodifiylashtirish tajovuzkorlarning xavfsizlik hujumi paytida mavjud bo'lgan bajariladigan kodning qaerdaligini bilishlariga yo'l qo'ymaslik ekspluatatsiya kabi ikkilikdagi bajariladigan kodning ofsetini bilishga tayanadi libc-ga qaytish hujumlari.

Olmalar macOS va iOS 10.7 va 4.3 versiyalari bo'yicha PIE dasturlarini to'liq qo'llab-quvvatlash; PIE-ga tegishli bo'lmagan iOS dasturlari Apple App Store-ga tasdiqlash uchun yuborilganda ogohlantirish beriladi, ammo hali hech qanday qiyin talab yo'q[qachon? ] va PIEga tegishli bo'lmagan dasturlar rad etilmaydi.[11][12]

OpenBSD 2013 yil 1 mayda chiqarilgan OpenBSD 5.3 dan beri ko'pgina arxitekturalarda PIE sukut bo'yicha yoqilgan.[13] PIE-ni qo'llab-quvvatlash statik ravishda bog'langan bajariladigan fayllar kabi ikkilik fayllar / bin va / sbin ma'lumotnomalar, 2014 yil oxiriga yaqin qo'shilgan.[14] openSUSE PIE-ni sukut bo'yicha 2015-02 yillarda qo'shib qo'ydi. Boshlash Fedora 23, Fedora texnik xizmatchilari sukut bo'yicha PIE yoqilgan paketlarni yaratishga qaror qilishdi.[15] Ubuntu 17.10 sukut bo'yicha barcha arxitekturalarda PIE yoqilgan.[16] Gentoo Endi yangi profillar sukut bo'yicha PIE-ni qo'llab-quvvatlaydi.[17]

Android in PIE-ni qo'llab-quvvatladi Jelly Bean[18] va PIE-ga aloqador bo'lmagan yordamni o'chirib tashladi Lolipop.[19]

Shuningdek qarang

Izohlar

  1. ^ TSS / 360 birgalikda PIC-ni qo'llab-quvvatlagan bo'lsa-da, bu barcha disk xotira tizimlarida to'g'ri kelmadi
  2. ^ Ammo har bir ish uchun kodning alohida nusxasi yuklandi.
  3. ^ Ushbu maqola doirasidan tashqarida bo'lgan ishlash sabablari bo'yicha ba'zi texnik og'ishlar mavjud.

Adabiyotlar

  1. ^ a b v d e f "Ob'ekt kodining turlari". iRMX 86 Application Loader uchun qo'llanma (PDF). Intel. 1-2, 1-3 betlar. Olingan 2017-08-21. […] 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. ^ Mustaqil bajariladigan dastur (PIE)
  3. ^ Levin, Jon R. (2000) [1999 yil oktyabr]. "8-bob: Yuklab olish va qoplamalar". Birlashtiruvchi va yuklagichlar. Dasturiy ta'minot va dasturlash bo'yicha Morgan Kaufmann seriyasi (1 nashr). San-Fransisko, AQSh: Morgan Kaufmann. 170–171 betlar. ISBN  1-55860-496-0. OCLC  42413382. ISBN  978-1-55860-496-4. Arxivlandi asl nusxasidan 2012-12-05. Olingan 2020-01-12. Kod: [1][2] Xato: [3]
  4. ^ Gabert, Aleksandr (2004 yil yanvar). "Mustaqil kod ichki pozitsiyasi". Qattiqlashtirilgan Gentoo. Olingan 2009-12-03. […] PIC-dan xabardor bo'lmagan to'g'ridan-to'g'ri adreslash har doim PIC-manzilga qaraganda arzonroq (o'qing: tezroq). […]
  5. ^ "701 e'lon qilindi", IBM, 1952-04-29
  6. ^ Ma'lumotlarni qayta ishlash bo'yicha qo'llanma UNIVAC III (PDF). Sperry Rand korporatsiyasi. 1962. UT-2488.
  7. ^ "Windows uchun xotira boshqaruvidagi yutuqlar". View.officeapps.live.com. Olingan 2017-06-23.
  8. ^ "6-bo'lim Virtual manzilni shakllantirish", DPS / LEVEL 68 & DPS 8M MULTICS PROCESSOR MANUAL (PDF) (Vah. 1 tahr.), Honeywell Information Systems Inc., 1982, 6-21 betlar, AL39
  9. ^ "3-bo'lim: Svslcm dasturchisi uchun TSS". IBM Time Sharing System tushunchalari va imkoniyatlari (PDF) (Ettinchi nashr). Aprel 1978. p. 61. GC28-2003-6.
  10. ^ IBM System / 360 Time Sharing System Dynamic Loader (PDF) (To'rtinchi nashr). Sentyabr 1971. GY28-2031-3.
  11. ^ "iphone - PIE bo'lmagan ikkilik - bajariladigan" loyiha nomi "Pozitsiya mustaqil bajariladigan dastur emas. - Stack overflow". stackoverflow.com.
  12. ^ "iOS Developer Library". apple.com.
  13. ^ "OpenBSD 5.3 versiyasi". 2013-05-01. Olingan 2020-05-09.
  14. ^ "Heads Up: Statik PIE uchun oniy tasvirni yangilash". 2014-12-24. Olingan 2014-12-24.
  15. ^ "O'zgarishlar / Barcha to'plamlarni qattiqlashtiring - FedoraProject". fedoraproject.org.
  16. ^ "Ubuntu Foundation Foundation - haftalik axborot byulleteni, 2017-06-15". 2017-06-15. Olingan 2017-06-17.
  17. ^ "Gentoo omboridagi yangi 17.0 profil". 2017-11-30. Olingan 2017-12-10.
  18. ^ "Android 1.5 va 4.1 orqali xavfsizlikni yaxshilash - Android Open Source loyihasi". Android Open Source loyihasi.
  19. ^ "Android 5.0-da xavfsizlik yaxshilanishlari - Android ochiq kodli loyihasi". Android Open Source loyihasi.

Tashqi havolalar