อ่าน 8 นาที
พื้นที่หน่วยความจำสูง
ใน การจัดการหน่วยความจำของ DOS พื้นที่ หน่วยความจำสูง ( HMA ) คือ พื้นที่ RAM ที่ประกอบด้วย 65520 ไบต์ แรกที่อยู่เหนือหนึ่ง เมกะไบต์ ใน คอมพิวเตอร์ IBM AT...
พื้นที่หน่วยความจำสูง

ในการจัดการหน่วยความจำของ DOSพื้นที่หน่วยความจำสูง ( HMA ) คือ พื้นที่ RAM ที่ประกอบด้วย 65520 ไบต์แรกที่อยู่เหนือหนึ่งเมกะไบต์ใน คอมพิวเตอร์ IBM ATหรือคอมพิวเตอร์ที่เข้ากันได้
การทำงาน
ในโหมดจริงสถาปัตยกรรมเซกชันของ โปรเซสเซอร์ Intel 8086และโปรเซสเซอร์รุ่นต่อมา ระบุตำแหน่งหน่วยความจำด้วยเซกชัน 16 บิตและออฟเซ็ต 16 บิต ซึ่งจะถูกแปลงเป็นแอดเดรสทางกายภาพผ่าน (เซกชัน) × 16 + (ออฟเซ็ต) แม้ว่าจะตั้งใจให้แอดเดรส หน่วยความจำ เพียง 1 เมกะไบต์ (MB) (2 20FFFF:0010 ไบต์) แต่เซกชัน:ออฟเซ็ตแอดเดรสที่ และเกินกว่าหน่วยความจำอ้างอิงที่เกิน 1 MB ( FFFF0 + 0010 = 100000) ดังนั้น บน โปรเซสเซอร์ 80286และโปรเซสเซอร์รุ่นต่อมา โหมดนี้สามารถแอดเดรสหน่วยความจำขยาย 65520 ไบต์แรกได้จริง ๆ ซึ่งเป็นส่วนหนึ่งของช่วง 64 KB ที่เริ่มต้น 16 ไบต์ก่อนเครื่องหมาย 1 MB — FFFF:0000 (0xFFFF0)ถึง โปรเซสเซอร์ FFFF:FFFF (0x10FFEF)Intel 8086และ8088ซึ่งมีหน่วยความจำเพียง 1 MB และ สายแอดเดรส เพียง 20 สาย จะวนกลับที่บิตที่ 20ดังนั้นแอดเดรสFFFF:0010จึงเทียบเท่ากับ0000:0000[ 1 ]
เพื่อให้สามารถใช้งานโปรแกรม DOS ที่มีอยู่ซึ่งอาศัยคุณสมบัตินี้ในการเข้าถึงหน่วยความจำต่ำบนคอมพิวเตอร์ IBM PC AT รุ่นใหม่ IBM จึงเพิ่ม วงจรพิเศษบนเมนบอร์ดเพื่อจำลองการวนรอบ วงจรนี้เป็นเกตตรรกะ อย่างง่าย ที่สามารถตัดการเชื่อมต่อสายแอดเดรสที่ 21 ของไมโครโปรเซสเซอร์A20ออกจากส่วนที่เหลือของเมนบอร์ด เกตนี้สามารถควบคุมได้ในตอนแรกผ่านตัวควบคุมแป้นพิมพ์เพื่อให้สามารถใช้งานโปรแกรมที่ต้องการเข้าถึง RAM ทั้งหมดได้[ 1 ]
ตัวจัดการ A20ที่เรียกว่าสามารถควบคุมโหมดการกำหนดแอดเดรสแบบไดนามิกได้[ 1 ]ซึ่งทำให้โปรแกรมสามารถโหลดตัวเองลงในพื้นที่ 1024–1088 KB และทำงานในโหมดจริงได้[ 1 ]
การจัดรูปแบบโค้ด
โค้ดที่เหมาะสมที่จะถูกเรียกใช้ใน HMA จะต้องเขียนโค้ดให้เป็นอิสระจากตำแหน่ง (โดยใช้การอ้างอิงแบบสัมพัทธ์เท่านั้น) [ 2 ] [ 1 ]คอมไพล์ให้ทำงานที่แอดเดรสเฉพาะใน HMA (โดยทั่วไปจะอนุญาตให้โค้ดเพียงหนึ่งหรือสองส่วนเท่านั้นที่ใช้ HMA ร่วมกัน) หรือต้องออกแบบให้สามารถ ย้ายตำแหน่งตาม ขอบเขตย่อหน้าหรือแม้แต่ ตำแหน่ง ออฟเซ็ตได้ (โดยที่แอดเดรสทั้งหมดจะถูกกำหนดตายตัวในระหว่างการโหลด) [ 2 ] [ 1 ]
ก่อนที่ CPUจะสามารถเข้าถึงโค้ด (หรือข้อมูล) ใน HMA ได้ไดรเวอร์ที่เกี่ยวข้องจะต้องตรวจสอบให้แน่ใจว่า HMA ได้รับการแมปไว้แล้ว ซึ่งจำเป็นต้องมีการส่งผ่านคำขอใดๆ ดังกล่าวผ่านstubที่ยังคงอยู่ในหน่วยความจำภายนอก HMA ซึ่งจะเรียกใช้ตัวจัดการ A20 เพื่อเปิดใช้งานเกต A20 (ชั่วคราว) [ 2 ] [ 1 ]หากไดรเวอร์ไม่มีโครงสร้างข้อมูลสาธารณะใดๆ และใช้เพียงการขัดจังหวะหรือการเรียกที่ควบคุมโดยระบบปฏิบัติการพื้นฐานอยู่แล้ว อาจเป็นไปได้ที่จะลงทะเบียนไดรเวอร์กับระบบในลักษณะที่ระบบจะดูแล A20 เอง ซึ่งจะช่วยลดความจำเป็นในการใช้ stub แยกต่างหาก[ 1 ] [ nb 1 ]
ประวัติศาสตร์
ผลิตภัณฑ์ ของ Microsoftที่ใช้ HMA เป็นครั้งแรกคือWindows/286 2.1 ในปี 1988 ซึ่งได้แนะนำ ไดรเวอร์อุปกรณ์ HIMEM.SYSตั้งแต่ปี 1990 เป็นต้นมา ด้วยDR DOS 5.0ของDigital Research [ 3 ] (ผ่าน[ 4 ]และCONFIG.SYS ) และตั้งแต่ปี 1991 ด้วยMS-DOS 5.0 [ 3 ] (ผ่าน ) ส่วนต่างๆ ของ BIOS และเคอร์เนล ของระบบปฏิบัติการสามารถโหลดลงใน HMA ได้เช่นกัน[ 3 ] [ 5 ]ทำให้หน่วยความจำแบบดั้งเดิมว่างลงได้ถึง 46 KB [ 1 ]ส่วนประกอบอื่นๆ เช่น ไดรเวอร์อุปกรณ์และโปรแกรมที่สิ้นสุดและคงอยู่ในหน่วยความจำ (TSR) อย่างน้อยก็สามารถโหลดลงในพื้นที่หน่วยความจำส่วนบน (UMA) ได้ แต่ไม่ใช่ใน HMA ภายใต้ DOS 5.0 และเวอร์ชันที่สูงกว่า ด้วยระบบยังพยายามย้ายบัฟเฟอร์ดิสก์ไปยัง HMA อีกด้วย[ 5 ]ภายใต้DR DOS 6.0 (1991) และเวอร์ชันที่สูงกว่า บัฟเฟอร์ดิสก์ (ผ่านและต่อมาด้วย) ส่วนต่างๆ ของตัวประมวลผลคำสั่งCOMMAND.COMรวมถึงไดรเวอร์ที่ย้ายตำแหน่งตัวเองได้ พิเศษหลายตัว เช่น KEYB , NLSFUNCและSHAREสามารถโหลดลงใน HMA ได้เช่นกัน (โดยใช้ตัวเลือก) ซึ่งจะทำให้หน่วยความจำแบบดั้งเดิมและหน่วยความจำส่วนบนว่างมากขึ้นสำหรับซอฟต์แวร์ DOS แบบดั้งเดิมในการทำงาน[ 1 ] TASKMAXดูเหมือนจะย้ายส่วนต่างๆ ของตัวเองไปยัง HMA เช่นกัน[ 6 ] [ 7 ] NLCACHEของNovellจากNetWare Lite และ NWCACHEเวอร์ชันแรกๆจากPersonal NetWareและNovell DOS 7สามารถใช้ HMA ได้เช่นกัน[ 8 ] [ 9 ] [ 7 ]ภายใต้ MS-DOS/PC DOS ประมาณ ส่วนที่ใช้ร่วมกันขนาด 2 KB ของ COMMAND.COM สามารถย้ายไปยัง HMA ได้[ 10 ]เช่นเดียวกับ บิตแมป DISPLAY.SYSสำหรับโค้ดเพจที่เตรียมไว้[ 10 ] [ 11 ]ภายใต้ MS -DOS 6.2 (1993) และสูงกว่านั้น ส่วนขนาดประมาณ 5 KB ของDBLSPACE.BINHIDOS.SYS /BDOS=FFFFHIDOS=ONDOS=HIGHDOS=HIGHHIBUFFERSBUFFERSHIGH/MH/ DRVSPACE.BINสามารถอยู่ร่วมกับ DOS ใน HMA ได้ (เว้นแต่ จะเรียกใช้ DBLSPACE / DRVSPACE/NOHMA ) [ 5 ] [ 12 ]ภายใต้PC DOS 7.0 (1995) และ2000 , DOSKEYจะถูกโหลดเข้าไปใน HMA (ถ้ามี) [ 13 ]และ SHARE ก็สามารถโหลดเข้าไปใน HMA ได้เช่นกัน (เว้นแต่/NOHMAจะมีตัวเลือกให้) [ 13 ]ภายใต้MS-DOS 7.0 (1995) ถึง8.0 (2000) ส่วนต่างๆ ของ HMA ยังถูกใช้เป็นพื้นที่สำหรับบันทึกโครงสร้างข้อมูลที่กำลังเติบโต ซึ่งบันทึกคุณสมบัติต่างๆ ของไดรเวอร์โหมดจริงที่โหลดไว้[ 7 ] [ 14 ] [ 15 ]
ดูเพิ่มเติม
- หน่วยความจำเสริม (EMS)
- หน่วยความจำเสริม (XMS)
- HMAREA (คำสั่ง CONFIG.SYS)ใช้สำหรับระบุเซ็กเมนต์ HMA (เฉพาะ PTS-DOS) คล้ายกับพารามิเตอร์ HIDOS.SYS /BDOS=xxxx ใน DR DOS
- การถอดรหัสที่อยู่ไม่สมบูรณ์
- การย้ายตำแหน่งออฟเซ็ตภายในเซกเมนต์
- การปรับฐานใหม่
- พารามิเตอร์ SHELLHIGH (คำสั่ง CONFIG.SYS) SIZE=xxxx เพื่อแทนที่การจัดสรร HMA ล่วงหน้าตามค่าเริ่มต้น (เฉพาะ DR-DOS 7.02 ขึ้นไป) [ 16 ]
- โหมดอันเรียล
หมายเหตุ
- ^ไม่จำเป็นต้องใช้ stub สำหรับส่วนขยายระบบแบบ resident SHAREและ NLSFUNCภายใต้ DR DOS 6.0และเวอร์ชันที่สูงกว่า เนื่องจากส่วนขยายเหล่านี้เพียงแค่ดักจับการขัดจังหวะแบบ multiplex INT 2Fh และสามารถใช้ backdoor interface เพื่อดักจับห่วงโซ่การขัดจังหวะในพื้นที่เคอร์เนลได้เพื่อให้ตัวจัดการ gate A20 ของเคอร์เนล ทำหน้าที่แทน stub
อ่านเพิ่มเติม
- Necasek, Michal (13 กันยายน 2011). "ใครต้องการการวนรอบของแอดเดรสกันแน่?" . พิพิธภัณฑ์ OS/2 . เก็บถาวรจากต้นฉบับเมื่อ 19 กุมภาพันธ์ 2020 . เรียกดูเมื่อ19 กุมภาพันธ์ 2020 .
[…] 86-DOSและด้วยเหตุนี้PC DOS / MS-DOSจึงใช้กลอุบายอันชาญฉลาด ไบต์ที่ตำแหน่งออฟเซ็ต 5 ของPSPมีรหัสคำสั่งเรียกไกล (9Ah); คำที่ตำแหน่งออฟเซ็ต 6 ของ PSP มีค่าที่เหมาะสมเพื่อระบุขนาดเซ็กเมนต์ของโปรแกรม และยังมีส่วนออฟเซ็ตของการเรียกไกลด้วย คำที่ตำแหน่งออฟเซ็ต 8 ซึ่งทำหน้าที่เป็นส่วนเซ็กเมนต์ของการเรียกไกล ถูกสร้างขึ้นเพื่อให้เมื่อรวมกับออฟเซ็ตแล้ว จะวนรอบ (คุณสมบัติที่เข้าใจได้ดีของ CPU 8086 ) และชี้ไปยังแอดเดรส 0:C0h ซึ่งมีเวกเตอร์การขัดจังหวะ 30h […] อินเทอร์เฟซ CALL 5ทำงานได้แม้ในการจำลอง DOS ภายใต้ Windows NT และ OS/2 ซึ่งระบบเหล่านั้นไม่สามารถทำงานได้หาก ปิดใช้งาน สาย A20แล้วมันทำงานอย่างไรล่ะ? […] แทนที่จะตัดบิตแอดเดรสออก ระบบจะจำลองไบต์ห้าไบต์ที่ 0:C0h ที่ 1000C0h เทคนิคเดียวกันนี้เคยใช้ใน DOS 5 และเวอร์ชันที่สูงกว่าที่ทำงานร่วมกับDOS=HIGHในกรณีนั้น DOS จะตรวจสอบให้แน่ใจว่าแอดเดรสเชิงเส้น 1000C0h มีการเรียก far ที่เหมาะสม […]
- Kozierok, Charles M. (17 เมษายน 2544) [1997]. "High Memory Area (HMA)" . The PC Guide . 2.2.0. เก็บถาวรจากต้นฉบับเมื่อ 16 ตุลาคม 2549 . สืบค้นเมื่อ15 ตุลาคม 2549 .
- Paul, Matthias R. (2002-04-11). "Re: [fd-dev] ประกาศ: CuteMouse 2.0 alpha 1" . freedos-dev . เก็บถาวรจากต้นฉบับเมื่อ 2020-02-21 . เรียกดูเมื่อ2020-02-21 .
[…] ในกรณีของพอยเตอร์ที่ผิดเพี้ยน เช่นนี้ […] หลายปีก่อน Axel และผมกำลังคิดหาวิธีที่จะใช้จุดเริ่มต้น *หนึ่ง* จุดในไดรเวอร์สำหรับเวกเตอร์การขัดจังหวะหลายตัว (เนื่องจากจะช่วยประหยัดพื้นที่สำหรับจุดเริ่มต้นหลายจุดและโค้ดเฟรมการเริ่มต้น/ออกที่เหมือนกันในทุกจุด) จากนั้นจึงสลับไปยังตัวจัดการการขัดจังหวะที่แตกต่างกันภายใน ตัวอย่างเช่น: 1234h:0000h […] 1233h:0010h […] 1232h:0020h […] 1231h:0030h […] 1230h:0040h […] ทั้งหมดชี้ไปยังจุดเริ่มต้นเดียวกัน หากคุณเชื่อมต่อ INT 21h กับ 1234h:0000h และ INT 2Fh กับ 1233h:0010h และอื่นๆ พวกมันทั้งหมดจะผ่าน "ช่องโหว่" เดียวกัน แต่คุณยังคงสามารถแยกแยะความแตกต่างระหว่างพวกมันและแยกไปยังตัวจัดการต่างๆ ภายในได้ ลองนึกถึงจุดเริ่มต้นที่ "บีบอัด" ลงในA20 stub สำหรับการโหลด HMA วิธีนี้ใช้ได้ตราบใดที่ไม่มีโปรแกรมใดเริ่มทำเวทมนตร์ segment:offset […] เปรียบเทียบกับวิธีการตรงกันข้ามในการมีจุดเริ่มต้นหลายจุด (อาจรองรับโปรโตคอลการแบ่งปันการขัดจังหวะของIBM ด้วยซ้ำ ) ซึ่งจะใช้หน่วยความจำมากกว่ามากหากคุณเชื่อมต่อการขัดจังหวะจำนวนมาก […] เราได้ข้อสรุปว่า วิธีนี้อาจไม่ปลอดภัยในทางปฏิบัติ เพราะคุณไม่มีทางรู้ได้เลยว่าไดรเวอร์อื่นๆ จะปรับค่าตัวชี้ให้เป็นมาตรฐานหรือไม่เป็นมาตรฐานด้วยเหตุผลใดก็ตาม […]