กลับไปหน้าบทความ

อ่าน 9 นาที

การย้ายที่อยู่ด้วยตนเอง

ใน การเขียนโปรแกรมคอมพิวเตอร์ โปรแกรม ที่ย้ายตำแหน่งตัวเองได้ คือโปรแกรมที่ ย้าย ตำแหน่งคำสั่งและข้อมูลที่ขึ้นอยู่กับที่อยู่ของตัวเองเมื่อทำงาน...

การย้ายที่อยู่ด้วยตนเอง

ในการเขียนโปรแกรมคอมพิวเตอร์โปรแกรมที่ย้ายตำแหน่งตัวเองได้คือโปรแกรมที่ย้ายตำแหน่งคำสั่งและข้อมูลที่ขึ้นอยู่กับที่อยู่ของตัวเองเมื่อทำงาน และด้วยเหตุนี้จึงสามารถโหลดลงในหน่วยความจำที่อยู่ใดก็ได้[ 1 ] [ 2 ]ในหลายกรณี โค้ดที่ย้ายตำแหน่งตัวเองได้ยังเป็นรูปแบบหนึ่งของโค้ดที่แก้ไขตัวเองได้อีก ด้วย

ภาพรวม

การย้ายตำแหน่งด้วยตนเองนั้นคล้ายคลึงกับ กระบวนการ ย้ายตำแหน่งที่ใช้โดยตัวเชื่อมโยง - ตัวโหลด เมื่อคัดลอกโปรแกรมจากหน่วยเก็บข้อมูลภายนอกไปยังหน่วยความจำหลัก ความแตกต่างคือ โปรแกรมที่ถูกโหลดเองเป็นผู้ทำการ ย้ายตำแหน่ง ไม่ใช่ตัวโหลดในระบบปฏิบัติการหรือเชลล์

รูปแบบหนึ่งของการย้ายตำแหน่งตัวเองเกิดขึ้นเมื่อโปรแกรมคัดลอกรหัสคำสั่งจากลำดับตำแหน่งหนึ่งไปยังลำดับตำแหน่งอื่นภายในหน่วยความจำหลักของคอมพิวเตอร์เครื่องเดียว จากนั้นจึงถ่ายโอนการควบคุมโปรเซสเซอร์จากคำสั่งที่พบในตำแหน่งหน่วยความจำต้นทางไปยังคำสั่งที่พบในตำแหน่งหน่วยความจำปลายทาง ด้วยเหตุนี้ ข้อมูลที่อัลกอริทึมของโปรแกรมประมวลผลจึงเป็นลำดับของไบต์ที่กำหนดโปรแกรมนั้น

การย้ายตำแหน่งตัวเองแบบคงที่มักเกิดขึ้นในระหว่างการโหลด (หลังจากที่ระบบปฏิบัติการโหลดซอฟต์แวร์และส่งการควบคุมไปยังซอฟต์แวร์แล้ว แต่ก่อนที่การเริ่มต้นจะเสร็จสิ้น) บางครั้งอาจเกิดขึ้นเมื่อเปลี่ยนการกำหนดค่าของโปรแกรมในภายหลังระหว่างรันไทม์[ 3 ] [ 4 ]

ตัวอย่าง

บูตโหลดเดอร์

ตัวอย่างเช่น การย้ายตำแหน่งตัวเองมักถูกนำมาใช้ในขั้นตอนแรกของการบูตระบบปฏิบัติการบนสถาปัตยกรรมเช่น คอมพิวเตอร์ที่เข้ากันได้กับ IBM PC ซึ่ง ตัวโหลดบูตระดับล่าง(เช่นมาสเตอร์บูตเรคคอร์ด (MBR), วอลุ่มบูตเรคคอร์ด (VBR) และขั้นตอนการบูตเริ่มต้นของระบบปฏิบัติการเช่นDOS ) จะย้ายตัวเองออกจากตำแหน่งเดิมเพื่อโหลดขั้นตอนถัดไปเข้าสู่หน่วยความจำ

ส่วนขยาย CP/M

ภายใต้CP/Mเครื่องมือดีบักแบบไดนามิก (DDT) จะย้ายตัวเองไปยังส่วนบนสุดของหน่วยความจำที่มีอยู่โดยการย้ายขอบเขตหน้าเพื่อเพิ่มพื้นที่โปรแกรมชั่วคราว (TPA) ให้สูงสุดสำหรับโปรแกรมที่จะทำงาน[ 5 ] [ 6 ]

ในปี พ.ศ. 2531 โปรเซสเซอร์บรรทัดคำสั่งทางเลือกZCPR 3.4 สำหรับระบบ Zได้แนะนำ โปรแกรม ประเภท 4ซึ่งสามารถย้ายตำแหน่งได้เองผ่านสตับที่ฝังอยู่เช่นกัน[ 7 ] [ 8 ] [ 9 ] [ 10 ] [ 11 ]

ไดรเวอร์ x86 DOS

ภายใต้DOS บางครั้งการย้ายตำแหน่งตัวเองยังถูกใช้โดย ไดรเวอร์ขั้นสูงและส่วนขยายระบบแบบอยู่ประจำ (RSX) หรือโปรแกรมที่สิ้นสุดและคงอยู่ในระบบ (TSR) โดยการโหลดตัวเอง "สูง" เข้าไปในหน่วยความจำส่วนบนได้อย่างมีประสิทธิภาพมากกว่าตัวโหลด "สูง" ที่จัดหาจากภายนอก (เช่นLOADHIGH / HILOAD , INSTALLHIGH / HIINSTALLหรือDEVICEHIGH / HIDEVICEเป็นต้น[ 12 ]ตั้งแต่ DOS 5) เพื่อเพิ่มหน่วยความจำที่ใช้ได้สำหรับแอปพลิเคชันให้สูงสุด ทั้งนี้เนื่องจากระบบปฏิบัติการไม่มีความรู้เกี่ยวกับการทำงานภายในของไดรเวอร์ที่จะโหลด ดังนั้นจึงต้องโหลดลงในพื้นที่หน่วยความจำว่างที่มีขนาดใหญ่พอที่จะเก็บไดรเวอร์ทั้งหมดเป็นบล็อกรวมถึงรหัสการเริ่มต้น แม้ว่ารหัสเหล่านั้นจะถูกปล่อยหลังจากเริ่มต้นแล้วก็ตาม สำหรับ TSR ระบบปฏิบัติการยังต้องจัดสรรProgram Segment Prefix (PSP) และส่วนของสภาพแวดล้อมด้วย[ 13 ]สิ่งนี้อาจทำให้ไดรเวอร์ไม่ถูกโหลดลงในพื้นที่หน่วยความจำว่างที่เหมาะสมที่สุด หรือแม้กระทั่งป้องกันไม่ให้ถูกโหลดขึ้นสูงเลย ในทางตรงกันข้าม ไดรเวอร์ที่ย้ายตำแหน่งตัวเองได้สามารถโหลดได้ทุกที่ (รวมถึงในหน่วยความจำทั่วไป ) จากนั้นจึงย้ายเฉพาะส่วนที่ใช้งานอยู่ (ซึ่งโดยทั่วไปจะมีขนาดเล็กกว่ามาก) ไปยังพื้นที่หน่วยความจำว่างที่เหมาะสมในหน่วยความจำส่วนบน นอกจากนี้ TSR ที่ย้ายตำแหน่งตัวเองได้ขั้นสูง (แม้ว่าจะถูกโหลดลงในหน่วยความจำส่วนบนโดยระบบปฏิบัติการแล้วก็ตาม) สามารถย้ายตำแหน่งทับส่วน PSP และบัฟเฟอร์บรรทัดคำสั่งส่วนใหญ่ของตนเอง และปล่อยส่วนสภาพแวดล้อมเพื่อลดขนาดหน่วยความจำ ที่เกิดขึ้น และหลีกเลี่ยงการแตกกระจาย[ 14 ] TSR ที่ย้ายตำแหน่งตัวเองได้บางตัวยังสามารถเปลี่ยน "ลักษณะ" ของตนเองแบบไดนามิกและแปลงร่างเป็นไดรเวอร์อุปกรณ์ได้ แม้ว่าเดิมทีจะถูกโหลดเป็น TSR ซึ่งโดยทั่วไปแล้วจะช่วยปล่อยหน่วยความจำบางส่วนด้วย[ 4 ]ในที่สุด เป็นไปไม่ได้ในทางเทคนิคที่ตัวโหลดภายนอกจะย้ายไดรเวอร์ไปยังหน่วยความจำขยาย (EMS) พื้นที่หน่วยความจำสูง (HMA) หรือหน่วยความจำขยาย (ผ่านDPMSหรือCLOAKING ) เนื่องจากวิธีการเหล่านี้ต้องการส่วนย่อย เฉพาะไดรเวอร์ขนาดเล็ก ที่ยังคงอยู่ในหน่วยความจำแบบดั้งเดิมหรือหน่วยความจำส่วนบนเพื่อประสานการเข้าถึงพื้นที่เป้าหมายการย้าย[ 15 ] [ nb 1 ] [ nb 2 ]และในกรณีของไดรเวอร์อุปกรณ์ก็เช่นกัน เนื่องจากส่วนหัวของไดรเวอร์จะต้องคงอยู่ในเมกะไบต์แรกเสมอ[ 15 ] [ 13 ]เพื่อให้บรรลุเป้าหมายนี้ ไดรเวอร์จะต้องได้รับการออกแบบเป็นพิเศษเพื่อรองรับการย้ายตำแหน่งตัวเองไปยังพื้นที่เหล่านี้[ 15 ]

ไดรเวอร์ DOS ขั้นสูงบางตัวยังประกอบด้วยทั้งไดรเวอร์อุปกรณ์ (ซึ่งจะถูกโหลดที่ออฟเซ็ต +0000h โดยระบบปฏิบัติการ) และ TSR (โหลดที่ออฟเซ็ต +0100h) ที่ใช้ส่วนโค้ดร่วมกันภายในเป็นไบนารีแบบอ้วน[ 13 ]หากโค้ดที่ใช้ร่วมกันไม่ได้ออกแบบให้เป็นอิสระจากตำแหน่งจะต้องมีการแก้ไขที่อยู่ภายในบางรูปแบบที่คล้ายกับสิ่งที่ตัวโหลดที่ย้ายตำแหน่ง จะดำเนินการ อยู่แล้ว ซึ่งคล้ายกับขั้นตอนการแก้ไขของการย้ายตำแหน่งตัวเอง แต่โค้ดจะถูกโหลดที่ตำแหน่งเป้าหมายโดยตัวโหลดของระบบปฏิบัติการแล้ว (แทนที่จะทำโดยไดรเวอร์เอง)

โปรแกรม IBM DOS/360 และ OS/360

IBM DOS/360ไม่มีความสามารถในการย้ายตำแหน่งโปรแกรมระหว่างการโหลด บางครั้งมีการรักษาโปรแกรมหลายเวอร์ชัน โดยแต่ละเวอร์ชันสร้างขึ้นสำหรับที่อยู่การโหลด ( พาร์ติชัน ) ที่แตกต่างกัน โปรแกรมประเภทพิเศษที่เรียกว่าโปรแกรมที่ย้ายตำแหน่งตัวเองได้ถูกเขียนโค้ดให้ย้ายตำแหน่งตัวเองหลังจากโหลด[ 16 ] IBM OS/360ย้ายตำแหน่งโปรแกรมที่สามารถเรียกใช้งานได้เมื่อโหลดเข้าสู่หน่วยความจำ จำเป็นต้องมีโปรแกรมเพียงสำเนาเดียว แต่เมื่อโหลดแล้ว โปรแกรมจะไม่สามารถย้ายได้ (เรียกว่าโค้ดที่ไม่ขึ้นกับตำแหน่งแบบครั้งเดียว )

ตัวอย่างอื่นๆ

ตัวอย่างสุดขั้วของการย้ายตำแหน่งตัวเอง (หลายครั้ง) หรือที่เรียกว่าการย้ายตำแหน่งตัวเองแบบไดนามิก คือการสร้างโปรแกรมคอมพิวเตอร์เพื่อให้มันไม่อยู่ที่ที่อยู่คงที่ในหน่วยความจำ แม้ในขณะที่กำลังทำงานอยู่ เช่นที่ใช้ในการทดสอบหน่วยความจำของเวิร์ม [ 17 ] [ 18 ] [ 19 ] [ 20 ] Apple Worm ก็เป็นตัวย้ายตำแหน่งตัวเองแบบไดนามิกเช่นกัน[ 21 ]

ดูเพิ่มเติม

หมายเหตุ

  1. ^ข้อยกเว้นสำหรับข้อกำหนดเรื่อง stub คือ เมื่อหน่วยความจำที่ขยายแล้วถูกแปลงเป็นหน่วยความจำส่วนบนถาวรโดยตัวจัดการหน่วยความจำผ่านทาง EMSUMBดังนั้นจึงสามารถเข้าถึงได้ในฐานะหน่วยความจำส่วนบนไม่ใช่ผ่านทาง EMS
  2. ^มีข้อยกเว้นสองประการสำหรับข้อกำหนดของ stub สำหรับไดรเวอร์ที่จะโหลดลงใน HMA : ไม่จำเป็นต้องใช้ stub เมื่อเปิดใช้งานหน่วยความจำสูง อย่างถาวรบนเครื่องที่ไม่มีตรรกะ gate A20อย่างไรก็ตาม เนื่องจากเงื่อนไขนี้โดยทั่วไปไม่เป็นไปตามที่กำหนด ไดรเวอร์ DOS ทั่วไปจึงไม่สามารถใช้ประโยชน์จากเงื่อนไขนี้ได้ (เว้นแต่ว่าพวกเขาจะทดสอบเงื่อนไขนี้อย่างชัดเจนก่อน) นอกจากนี้ ไม่จำเป็นต้องใช้ stub ภายใต้ DR DOS 6.0และเวอร์ชันที่สูงกว่า เมื่อส่วนขยายระบบแบบ resident (เช่น SHAREและ NLSFUNC ) ดักจับเฉพาะการขัดจังหวะมัลติเพล็กซ์ INT 2Fh เท่านั้น เนื่องจากพวกเขาสามารถใช้อินเทอร์เฟซ backdoor เพื่อดักจับห่วงโซ่การขัดจังหวะในพื้นที่เคอร์เนลเพื่อให้ตัวจัดการ gate A20 ของเคอร์เนลจะให้ฟังก์ชันการทำงานของ stub [a]อย่างไรก็ตาม ไดรเวอร์จะต้องทำการย้ายตำแหน่งตัวเองเพื่อให้ทำงานได้อย่างถูกต้องใน HMA

อ่านเพิ่มเติม

  • Harrell III, John B. (ตุลาคม 1983). "DOSPLUS 3.5" . 80 Micro . บทวิจารณ์ (45). 1001001, Inc. : 160, 162, 164– 168, 170. ISSN  0744-7868 . ark:/13960/t8z906r42 . สืบค้นเมื่อ2020-02-06 .[20] [21]
  • Smith, Lee; Haines, Lionel (2 กุมภาพันธ์ 1989) [14 สิงหาคม 1987]. รูปแบบภาพแอปพลิเคชัน RISC OS (เดิมชื่อรูปแบบภาพ Arthur) (บันทึกทางเทคนิค) (ฉบับที่ 1.00). เคมบริดจ์ สหราชอาณาจักร: Acorn Computers Limited , กลุ่มภาษาโปรแกรม. PLG-AIF. เก็บถาวรจากต้นฉบับเมื่อ 30 สิงหาคม 2017. เรียกดูเมื่อ30 สิงหาคม 2017 .
  • คุณสมบัติของรูปแบบภาพ ARM . 1993.เก็บถาวรจากต้นฉบับเมื่อ 2017-08-31 . เรียกดูเมื่อ2017-08-31 .
  • Huck, Alex (14 สิงหาคม 2559). "Nachladbare Treiber unter CP/M – PRL2COM" . Homecomputer DDR (ในภาษาเยอรมัน). เก็บถาวรจากต้นฉบับเมื่อ 21 กุมภาพันธ์ 2563. เรียกดูเมื่อ21 กุมภาพันธ์ 2563 ;Pohlers, Volker (2017-04-24) [2012-02-20, 2009, 2002, 1988-07-26, 1987-10-11]. "PRL2COM" . คอมพิวเตอร์บ้าน DDR (ในภาษาเยอรมัน). เก็บถาวรจากต้นฉบับเมื่อ 2020-02-21 . เรียกดูเมื่อ2020-02-21 .
ดึงข้อมูลมาจาก " https://en.wikipedia.org/w/index.php?title=Self-relocation&oldid=1356555491 "

สรุปเนื้อหา

ข้อมูลสำคัญจากบทความ

ข้อมูลสำคัญเกี่ยวกับ การย้ายที่อยู่ด้วยตนเอง

ใน การเขียนโปรแกรมคอมพิวเตอร์ โปรแกรม ที่ย้ายตำแหน่งตัวเองได้ คือโปรแกรมที่ ย้าย ตำแหน่งคำสั่งและข้อมูลที่ขึ้นอยู่กับที่อยู่ของตัวเองเมื่อทำงาน...

ภาพรวม

การย้ายตำแหน่งด้วยตนเองนั้นคล้ายคลึงกับ กระบวนการ ย้ายตำแหน่ง ที่ใช้โดย ตัวเชื่อมโยง - ตัวโหลด เมื่อคัดลอกโปรแกรมจากหน่วยเก็บข้อมูลภายนอกไปยังหน่วยความจำหลัก ความแตกต่างคือ โปรแกรมที่ถูกโหลดเองเป็นผู้ทำการ ย้ายตำแหน่ง ไม่ใช่ตัวโหลดใน ระบบปฏิบัติการ หรือ เชลล์

บูตโหลดเดอร์

ตัวอย่างเช่น การย้ายตำแหน่งตัวเองมักถูกนำมาใช้ในขั้นตอนแรกของการบูตระบบปฏิบัติการบนสถาปัตยกรรมเช่น คอมพิวเตอร์ ที่เข้ากันได้กับ IBM PC ซึ่ง ตัวโหลดบูต ระดับล่าง(เช่น มาสเตอร์บูตเรคคอร์ด (MBR), วอลุ่มบูตเรคคอร์ด (VBR)...

ส่วนขยาย CP/M

ภายใต้ CP/M เครื่องมือ ดีบักแบบไดนามิก (DDT) จะย้าย ตัว เอง ไปยังส่วนบนสุดของหน่วยความจำที่มีอยู่โดย การย้ายขอบเขตหน้า เพื่อเพิ่ม พื้นที่โปรแกรมชั่วคราว (TPA) ให้สูงสุดสำหรับโปรแกรมที่จะทำงาน [ 5 ] [ 6 ]