เหตุใดคำสั่ง BIOS แรกจึงอยู่ที่ 0xFFFFFFF0 (“ top” ของ RAM)


51

ฉันรู้ว่า BIOS โหลดคำสั่งแรกจาก 0xFFFFFFF0 แต่ทำไมที่อยู่นี้โดยเฉพาะ ฉันมีคำถามมากมายและหวังว่าคุณจะสามารถช่วยฉันได้บ้างอย่างน้อย

คำถามของฉัน:

  • เหตุใดคำสั่ง BIOS แรกจึงอยู่ที่ "ด้านบน" ของ RAM 4 GB
  • จะเกิดอะไรขึ้นหากคอมพิวเตอร์ของฉันมี RAM เพียง 1 GB เท่านั้น
  • ระบบที่มี RAM มากกว่า 4 GB (เช่น 8 GB, 16 GB เป็นต้น) เป็นอย่างไร
  • ทำไมสแต็กเริ่มต้นด้วยบางค่า (ในกรณีนี้ค่าอยู่ที่ 0xFFFFFFF0)

ฉันอ่านเกี่ยวกับบ่ายวันนี้และฉันยังไม่เข้าใจ


28
กรุณาหนึ่งคำถามต่อคำถาม
การแข่งขัน Lightness กับโมนิก้า

4
ฉันชอบวิธีที่คำตอบที่ได้รับการยอมรับไม่ได้กล่าวถึงหน่วยความจำแบบแบ่งส่วนหรือโหมดการกำหนดแอดเดรสเลยและที่เดียวที่สัมผัสได้กับสาย A20 คือความคิดเห็น
imallett

Atmel AVRs เริ่มการทำงานจากที่อยู่ 0 ในขณะที่ Freescale HCS08 เริ่มต้นจาก 0xFFFE, iirc โปรเซสเซอร์แต่ละตระกูลมีคุณสมบัติเป็นของตนเอง
Nick T

2
@imallett ฉันชอบวิธีที่คุณตัดสินใจที่จะบ่นเกี่ยวกับที่นี่แทนที่จะถามผู้โพสต์เพื่ออัปเดตคำตอบของพวกเขาพร้อมข้อมูลเพิ่มเติม ฉันชอบวิธีที่คุณคิดว่าความรู้ที่ว่า OP จะสามารถมองเห็นได้แม้ว่าจุดประสงค์ของการถามคำถามคือการรับความรู้เกี่ยวกับสิ่งต่าง ๆ ที่ตอนนี้อาจเข้าใจได้อย่างสมบูรณ์
MonkeyZeus

2
@MonkeyZeus จนถึงปัจจุบันมีผู้แสดงความคิดเห็นอีก 9 คนที่ทำเช่นนั้นและยังไม่เปลี่ยน ความคิดเห็นของฉันในขณะที่เหน็บแนมไม่ว่างเปล่า; มันเป็นคำเตือนสำหรับชาวเน็ตในอนาคตเช่นเดียวกับ OP
imallett

คำตอบ:


57

0xFFFFFFF0เป็นที่ที่ซีพียูที่ใช้งานร่วมกันได้กับ x86 เริ่มทำงานคำสั่งเมื่อเปิด นั่นคือการเดินสายที่ไม่สามารถเปลี่ยนได้ (โดยไม่ต้องมีฮาร์ดแวร์เพิ่มเติม) ของ CPU และ CPU ประเภทต่าง ๆ ทำงานแตกต่างกัน

เหตุใดคำสั่ง BIOS แรกจึงอยู่ที่ "ด้านบน" ของ RAM 4 GB

มันตั้งอยู่ที่ "ด้านบน" ของพื้นที่ที่อยู่ 4 GB - และในการเปิดเครื่อง BIOS หรือUEFI ROM ถูกตั้งค่าให้ตอบสนองต่อการอ่านที่อยู่เหล่านั้น

ทฤษฎีของฉันเกี่ยวกับสาเหตุที่เป็นเช่นนี้:

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

ใน 8086 มีเวกเตอร์ขัดจังหวะอยู่ที่ตำแหน่งหน่วยความจำ 0 ขึ้นไป เวกเตอร์ที่ขัดจังหวะจะต้องอยู่ในที่อยู่ที่รู้จักและต้องการให้อยู่ใน RAM เพื่อความยืดหยุ่น ดังนั้นเริ่มต้นจาก 0 และทำงานได้เหมาะสมสำหรับสิ่งเหล่านั้น (เพราะไม่มีระบบในปี 1978 เมื่อมีการประดิษฐ์ 8086 จะมี RAM 4 Gbytes - ดังนั้นการคาดหวังว่า RAM จะอยู่ที่ 0xFFFFFFF0 นั้นไม่ใช่ความคิดที่ดี) จากนั้น ROM จะต้องเป็น ที่ขอบเขตบน

แน่นอนว่าเริ่มต้นด้วยอย่างน้อย 80286 เวกเตอร์ขัดจังหวะสามารถถูกย้ายไปยังตำแหน่งเริ่มต้นอื่นที่ไม่ใช่ 0 แต่ซีพียู 64- บิต x86 ที่ทันสมัยยังคงบูทในโหมด 8086 ดังนั้นทุกอย่างยังคงทำงานได้เหมือนกันเพื่อความเข้ากันได้ ตามที่ฟังในปี 2558 ยังคงต้องการซีพียู x86 ของคุณเพื่อให้สามารถเรียกใช้ DOS)

ดังนั้นตั้งแต่เวกเตอร์ขัดจังหวะเริ่มต้นจาก 0 และทำงานขึ้น ROM จะต้องเริ่มจากด้านบนและทำงานลง

จะเกิดอะไรขึ้นหากคอมพิวเตอร์ของฉันมี RAM เพียง 1 GB

CPU แบบ 32 บิตมีที่อยู่ 4,294,967,296 หมายเลข 0 (0x00000000) ถึง 4294967295 (0xFFFFFFFF) ROM สามารถใช้งานได้ในบางที่อยู่และ RAM สามารถใช้งานที่อื่นได้ ด้วย MMU ของ CPU สิ่งนี้สามารถเปิดใช้งานได้ทันที RAM ไม่จำเป็นต้องอยู่กับที่อยู่ทั้งหมด

ด้วย RAM ขนาด 1 GB เท่านั้นที่อยู่บางแห่งจะไม่ตอบสนองเมื่อมีการอ่านหรือเขียน ซึ่งอาจทำให้ข้อมูลที่ไม่ถูกต้องถูกอ่านเมื่อเข้าถึงที่อยู่ดังกล่าวหรือการล็อคระบบ

ระบบที่มี RAM มากกว่า 4 GB (เช่น: 8 GB, 16 GB เป็นต้น)

ทำให้มันค่อนข้างง่าย: ซีพียู 64- บิตมีที่อยู่เพิ่มเติม (ซึ่งเป็นหนึ่งในสิ่งที่ทำให้พวกเขา 64- บิต - เช่น 0x00000000000000000000 ผ่าน 0xFFFFFFFFFFFFFFFFFF) ตัวอย่างเช่น RAM พิเศษจึงเหมาะกับ สมมติว่าซีพียูที่อยู่ในโหมดยาว จนกว่าจะถึงตอนนั้น RAM ก็อยู่นั่นไม่สามารถจัดการได้

ทำไมสแต็กเริ่มต้นด้วยบางค่า (ในกรณีนี้ค่าอยู่ที่ 0xFFFFFFF0)

ฉันไม่พบสิ่งใดในทันทีที่สิ่งที่ x86 กำหนดตัวชี้สแต็คที่เปิดเครื่อง แต่ในที่สุดจะต้องมีการกำหนดค่าเริ่มต้นใหม่ตามขั้นตอนการเริ่มต้นอย่างไรก็ตามเมื่อรูทีนดังกล่าวพบว่า RAM มีจำนวนเท่าใดในระบบ (@Eric Towers ในความคิดเห็นด้านล่างรายงานว่ามีการตั้งค่าเป็นศูนย์เมื่อเปิดเครื่อง)


7
เป็นการดีที่สุดที่จะคิดว่าพื้นที่ที่อยู่เป็นพื้นที่ขนาดใหญ่ที่สามารถกำหนดสิ่งต่าง ๆ โดยฮาร์ดแวร์ เมื่อซีพียูอ่าน / เขียนหน่วยความจำจริง ๆ แล้วมันทำการสื่อสารผ่านบัสและฮาร์ดแวร์สามารถทำให้แน่ใจว่าสิ่งต่าง ๆ เช่น RAM หรือ ROM ตอบสนองในช่วงที่อยู่ที่เฉพาะเจาะจง ดังนั้นฮาร์ดแวร์ดังกล่าวจะต้องแน่ใจว่า ROM ตอบสนองที่ 0xFFFFFFF0 เมื่อมีการรีเซ็ต CPU ไม่มีข้อผูกมัดโดยธรรมชาติที่ ROM จะปรากฏขึ้นหลังจาก RAM มันสามารถปรากฏที่ใดก็ได้ที่ฮาร์ดแวร์บอกมันเช่นกันขึ้นอยู่กับความสามารถของฮาร์ดแวร์ดังกล่าว
LawrenceC

4
เป็นไปได้ที่จะมี "ช่อง" หรือช่องว่างที่ไม่ได้กำหนดซึ่งไม่ได้ใช้โดย ROM, RAM หรืออะไรก็ตาม - โดยทั่วไปการเข้าถึงช่องเหล่านั้นจะทำให้เกิดการล็อคระบบ
LawrenceC

16
คำตอบนี้อนุมานว่า CPU สามารถใช้บิตแอดเดรส 32 บิตขณะอยู่ในโหมด 16 บิต แต่ในโหมด 16 บิตสามารถใช้ที่อยู่ 20 บิตเท่านั้น ที่อยู่0xFFFFFFF0ไม่สามารถเข้าถึงได้จนกว่าหลังจาก CPU ได้ถูกเปลี่ยนเป็นโหมด 32 บิต 0xFFFF0ครั้งสุดท้ายที่ผมมองอย่างใกล้ชิดที่รหัสไบออสจุดเริ่มต้นอยู่ที่
kasperd

6
@ MichaelKjörlingการคำนวณของคุณผิด ส่วนที่เลื่อนและการชดเชยไม่ได้ถูก ORed แต่จะถูกเพิ่ม ดังนั้นตรรกะ FFFF: FFF0 เป็นทางกายภาพ (1) 0FFE0 (โดยที่หน้า 1 อยู่ถ้าเปิดใช้งาน A20)
Ruslan

9
@kasperd มีแฮ็คอยู่ - ตัวจัดการหน่วยความจำมี high 12 bits ที่ตั้งค่าเป็น 1 จนกระทั่งการกระโดดไกลครั้งแรกเกิดขึ้น ดังนั้นใช่เหตุผลที่คุณกำลังทำงานด้วยแต่ในความเป็นจริงมันแมปไป0xFFFF0 0xFFFFFFF0ฉันคาดว่าสิ่งนี้ทำเพื่อความเข้ากันได้กับ 8086 - ทั้งมันและซีพียูที่ทันสมัยกว่าดูเหมือนจะใช้0xFFFF0แต่ซีพียู 32- บิตเข้าถึงได้จริง0xFFFFFFF0(แมปกับ BIOS ROM)
Luaan

26

มันไม่ได้อยู่ที่ด้านบนของ RAM; มันอยู่ใน ROM ซึ่งมีที่อยู่ด้านบนของพื้นที่ที่อยู่หน่วยความจำพร้อมกับหน่วยความจำใด ๆ ในการ์ดเอ็กซ์แพนชันเช่นคอนโทรลเลอร์อีเธอร์เน็ต มีไว้เพื่อไม่ให้ขัดแย้งกับ RAM อย่างน้อยก็จนกว่าคุณจะติดตั้ง 4 GB ระบบที่มี RAM ขนาด 4 GB ขึ้นไปสามารถทำสองสิ่งเพื่อแก้ไขข้อขัดแย้ง เมนบอร์ดราคาถูกก็ไม่สนใจส่วนของ RAM ที่ขัดแย้งกับที่ตั้งของ ROM คนที่มีคุณค่าทำการแมปแรมใหม่อีกครั้งว่ามีที่อยู่เหนือเครื่องหมาย 4 GB

ฉันไม่แน่ใจว่าสิ่งที่คุณถามเกี่ยวกับสแต็ค แน่นอนว่าจะไม่ได้รับการเริ่มต้นให้อยู่ใน ROM เมื่อ CPU รีเซ็ตจะเริ่มต้นใน "โหมดจริง" ซึ่งทำหน้าที่เหมือนกับ 8086 ดั้งเดิมและใช้การกำหนดแอดเดรสที่แบ่งเป็น 16 บิตทำให้สามารถเข้าถึงหน่วยความจำ 1 MB เท่านั้น รหัส BIOS อยู่ที่ด้านบนของ 1 MB นั้น BIOS เลือกที่ใดที่หนึ่งใน RAM เพื่อตั้งค่าสแต็กและโหลดและเรียกใช้เซกเตอร์แรกของไดรฟ์ที่สามารถบูตได้ครั้งแรก มันขึ้นอยู่กับระบบปฏิบัติการที่จะเปลี่ยนเป็นโหมด 32 หรือ 64 บิตเมื่อมันเข้ามาและตั้งค่าสแต็คของตัวเอง (หนึ่งรายการต่อภารกิจ / เธรด)


1
ขอบคุณมากสำหรับคำตอบ แต่ @LawrenceC ให้รายละเอียดเพิ่มเติมเกี่ยวกับคำตอบของเขาและช่วยฉันในการทำงานทั้งหมด ยังไงก็ขอบคุณนะ! ฉันให้คุณ upvote: 3
เฟอร์นันโด Paladini

13

อย่างแรกนี่ไม่เกี่ยวอะไรกับ RAM จริงๆ เรากำลังพูดถึงพื้นที่ที่อยู่ที่นี่ - แม้ว่าคุณจะมีหน่วยความจำเพียง 16 MiB แต่คุณยังมีพื้นที่ที่อยู่ 32 บิตเต็มรูปแบบใน CPU 32 บิต

นี่เป็นคำตอบสำหรับคำถามแรกของคุณจริง ๆ แล้วในตอนนี้ที่ได้รับการออกแบบพีซีในโลกแห่งความเป็นจริงแทบจะไม่มีหน่วยความจำ 4 GiB เต็ม พวกเขาอยู่ในช่วงของหน่วยความจำ 1-16 MiB มากขึ้น ที่อยู่พื้นที่สำหรับทุกเจตนาและวัตถุประสงค์ฟรี

ตอนนี้ทำไม 0xFFFFFFF0 อย่างแน่นอน CPU ไม่รู้จำนวน BIOS ที่มีอยู่ BIOSes บางตัวอาจใช้เวลาเพียงไม่กี่กิโลไบต์ในขณะที่คนอื่นอาจใช้หน่วยความจำเต็มเมกะไบต์ - และฉันไม่ได้เข้าสู่ RAM เสริมอื่น ๆ ซีพียูจะต้องเดินสายไปยังที่อยู่บางแห่งเพื่อเริ่มต้น - ไม่มีการกำหนดค่าซีพียู แต่นี่เป็นเพียงการแมปพื้นที่ที่อยู่ - ที่อยู่นั้นถูกแมปโดยตรงกับชิพ BIOS ROM (ใช่หมายความว่าคุณไม่สามารถเข้าถึง RAM 4GB เต็มรูปแบบได้ ณ จุดนี้หากคุณมีจำนวนมาก - แต่ ที่ไม่ได้เป็นอะไรพิเศษอุปกรณ์จำนวนมากต้องการช่วงของตัวเองในพื้นที่ที่อยู่) บน CPU แบบ 32 บิตที่อยู่นี้ให้คุณเต็ม 16 ไบต์เพื่อทำการเริ่มต้นขั้นพื้นฐาน - ซึ่งเพียงพอที่จะตั้งค่าเซกเมนต์ของคุณและถ้าจำเป็นโหมดที่อยู่ (จำไว้บูตจริง "ขั้นตอน" ณ จุดนี้คุณไม่ได้ใช้ RAM เลย - มันเป็นเพียงแค่แมป ROM ในความเป็นจริง RAM ยังไม่พร้อมที่จะใช้งาน ณ จุดนี้นั่นเป็นหนึ่งในงานของโพสต์ BIOS! ตอนนี้คุณอาจกำลังคิดว่าโหมด 16 บิตจริงเข้าถึงที่อยู่ 0xFFFFFFF0 อย่างไร แน่นอนว่ามีกลุ่มดังนั้นคุณมีที่อยู่ 20 บิต แต่ก็ยังไม่ดีพอ มีเคล็ดลับอยู่ - ที่อยู่ 12 บิตสูงถูกตั้งค่าจนกว่าคุณจะดำเนินการกระโดดไกลครั้งแรกของคุณให้คุณเข้าถึงพื้นที่ที่อยู่สูง (ในขณะที่ปฏิเสธการเข้าถึงสิ่งที่ต่ำกว่า 0xFFF00000 - จนกว่าคุณจะดำเนินการกระโดดไกล) .

ทั้งหมดนี้เป็นสิ่งที่ส่วนใหญ่ซ่อนอยู่จากโปรแกรมเมอร์ (ไม่พูดถึงผู้ใช้) ในระบบปฏิบัติการที่ทันสมัย โดยปกติคุณจะไม่สามารถเข้าถึงสิ่งใดในระดับที่ต่ำมาก - มีบางสิ่งเกินกว่าที่จะกอบกู้ (คุณไม่สามารถเปลี่ยนโหมด CPU ได้โดยไม่ตั้งใจ), บางตัวถูกจัดการโดยเคอร์เนลระบบปฏิบัติการโดยเฉพาะ

ดังนั้นมุมมองที่ดีขึ้นมาจากการเขียนโค้ดแบบเก่าใน MS DOS อีกตัวอย่างทั่วไปของหน่วยความจำอุปกรณ์ที่ถูกแมปโดยตรงกับพื้นที่ที่อยู่คือการเข้าถึงหน่วยความจำวิดีโอโดยตรง ตัวอย่างเช่นหากคุณต้องการเขียนข้อความไปยังจอแสดงผลอย่างรวดเร็วคุณเขียนไปยังที่อยู่โดยตรงB800:0000(รวมถึงออฟเซ็ต - ในโหมดข้อความ 80x25 นี่หมายความว่า(y * 80 + x) * 2หากหน่วยความจำของฉันทำหน้าที่ฉันถูกต้อง - สองไบต์ต่อตัวอักษรต่อบรรทัด) หากคุณต้องการวาดพิกเซลทีละพิกเซลคุณใช้โหมดกราฟิกและที่อยู่เริ่มต้นของA000:0000(โดยทั่วไปคือ 320x200 ที่ 8 บิตต่อพิกเซล) การทำอะไรที่มีประสิทธิภาพสูงมักจะหมายถึงการดำน้ำในคู่มืออุปกรณ์เพื่อหาวิธีเข้าถึงพวกเขาโดยตรง

สิ่งนี้มีชีวิตรอดมาจนถึงทุกวันนี้ - มันซ่อนเร้นอยู่ ใน Windows คุณสามารถดูที่อยู่หน่วยความจำที่แมปกับอุปกรณ์ในตัวจัดการอุปกรณ์ - เพียงแค่เปิดคุณสมบัติของการ์ดเครือข่ายของคุณไปที่แท็บทรัพยากร - รายการช่วงหน่วยความจำทั้งหมดจะถูกแมปจากหน่วยความจำอุปกรณ์ไปยังพื้นที่ที่อยู่หลักของคุณ และใน 32- บิตคุณจะเห็นว่าอุปกรณ์เหล่านั้นส่วนใหญ่ถูกแมปเหนือเครื่องหมาย 2 GiB (ภายหลัง 3 GiB) - อีกครั้งเพื่อลดความขัดแย้งกับหน่วยความจำที่ผู้ใช้สามารถใช้งานได้แม้ว่านี่จะไม่เป็นปัญหาจริง ๆ กับหน่วยความจำเสมือน แอปพลิเคชันไม่ได้อยู่ใกล้กับพื้นที่ที่อยู่ของฮาร์ดแวร์จริง - พวกมันมีหน่วยความจำเสมือนจริงของตัวเองซึ่งอาจถูกแมปกับ RAM, ROM, อุปกรณ์หรือไฟล์หน้าตัวอย่างเช่น)

สำหรับสแต็คก็ควรช่วยให้เข้าใจว่าโดยค่าเริ่มต้นกองขึ้นจากด้านบน ดังนั้นถ้าคุณทำ a push, ตัวชี้สแต็กใหม่จะอยู่ที่0xFFFFFEC- ในคำอื่น ๆ , คุณไม่ได้พยายามเขียนไปยังที่อยู่ BIOS init :) แน่นอนว่าหมายความว่ากิจวัตร BIOS BIOS สามารถใช้สแต็กได้อย่างปลอดภัยก่อนทำการแมปใหม่ มีประโยชน์มากกว่า ในการเขียนโปรแกรมโรงเรียนเก่าก่อนที่เพจจะกลายเป็นค่าเริ่มต้นพฤตินัยสแต็กมักจะเริ่มในตอนท้ายของ RAM และ "กองมากเกิน" เกิดขึ้นเมื่อคุณเริ่มเขียนทับหน่วยความจำแอปพลิเคชันของคุณ การป้องกันหน่วยความจำเปลี่ยนไปมาก แต่โดยทั่วไปแล้วมันรักษาความเข้ากันได้ย้อนหลังให้มากที่สุด - โปรดทราบว่าแม้แต่ซีพียู x86-64 ที่ทันสมัยที่สุดยังสามารถบู๊ต MS DOS 5 ได้ - หรือวิธีที่ Windows ยังคงสามารถเรียกใช้แอปพลิเคชัน DOS จำนวนมากที่ไม่มีความคิดเกี่ยวกับการเพจ


3
คำตอบที่ยอดเยี่ยมเพียงแค่ขยายและพูดว่าโปรเซสเซอร์รุ่นใหม่เริ่มวางแฮ็กอย่างเช่นการปิดบังบรรทัด A20ดังนั้นการสนับสนุนกรณีขอบที่เก่ากว่ากำลังจะตาย
พื้นฐาน

2
ในย่อหน้าสุดท้าย: BIOS ไม่สามารถใช้สแต็ก "อิสระ": มันไม่สามารถเขียนไปยัง ROM (ซึ่ง0xFFFFFFECจะถูกแมป) ซึ่งหมายความว่าไม่เพียง แต่ไม่มีpushแต่สำหรับตัวอย่างเช่นไม่มีcallอย่างใดอย่างหนึ่ง สิ่งเหล่านี้จะต้องรอจนกว่า RAM จะพร้อม
Vee

7

นอกจากประเด็นอื่น ๆ ที่กล่าวถึงแล้วอาจเป็นประโยชน์ในการทำความเข้าใจว่าที่อยู่คืออะไร ในขณะที่สถาปัตยกรรมใหม่ ๆ สร้างความซับซ้อนสิ่งต่าง ๆ เครื่องจักรในอดีตแต่ละรอบหน่วยความจำเอาท์พุทที่ต้องการอยู่ที่ 20 ถึง 32 สาย (ขึ้นอยู่กับสถาปัตยกรรมด้วยเทคนิคพิเศษที่จะต้องทราบว่ามันจำเป็นต้องมีคู่หรือสี่ไบต์พร้อมกัน); ส่วนต่าง ๆ ของระบบหน่วยความจำจะตรวจสอบสถานะของสายไฟเหล่านั้นและเปิดใช้งานตัวเองเมื่อพวกเขาเห็นการรวมกันบางอย่างของค่าสูงและต่ำ

หากเครื่องที่มีสายที่อยู่ 32 สายจำเป็นต้องใช้ RAM ขนาด 1MB และ ROM 64KB เท่านั้น [อาจเป็นไปได้สำหรับคอนโทรลเลอร์แบบฝังตัวบางตัว) มันอาจเปิดใช้งาน RAM สำหรับที่อยู่ทั้งหมดที่สายลวดที่อยู่ด้านบนเหลือน้อยและ ROM สำหรับที่อยู่ทั้งหมด สูง. สายไฟที่อยู่ด้านล่าง 20 จะเชื่อมโยงกับ RAM เพื่อเลือกหนึ่งใน 1,048,576 ไบต์และ 16 สายล่างจะเชื่อมต่อกับ ROM เช่นกันเพื่อเลือกหนึ่งใน 65,536 ไบต์ ที่อยู่ 11 สายที่เหลือจะไม่สามารถเชื่อมต่อกับอะไรก็ได้

บนเครื่องดังกล่าวการเข้าถึงที่อยู่ 0x00100000-0x001FFFFF จะเทียบเท่ากับการเข้าถึงที่อยู่ RAM 0x00000000-0x000FFFFF เช่นเดียวกันกับที่อยู่ 0x000200000-0x0002FFFFF หรือ 0x7FF00000-0x7FFFFFFFF ที่อยู่ด้านบน 0x80000000 ทุกคนจะอ่าน ROM ด้วยรูปแบบ 64K ซ้ำทั่วทั้งพื้นที่

แม้ว่าโปรเซสเซอร์จะมีพื้นที่ที่อยู่ 4,294,967,296 ไบต์ แต่ก็ไม่จำเป็นต้องให้ฮาร์ดแวร์รับรู้ถึงที่อยู่ที่แตกต่างกันมากมาย การวางเวกเตอร์รีเซ็ตใกล้ส่วนบนของพื้นที่ที่อยู่เป็นการออกแบบที่จะทำงานได้ดีไม่ว่าระบบ RAM และ ROM จะมีขนาดเท่าใดหรือน้อยแค่ไหนและหลีกเลี่ยงความต้องการในการถอดรหัสพื้นที่ที่อยู่


ข้อดี: คุณจะไม่พบฮาร์ดแวร์ 64 บิตใด ๆ ที่จะรองรับทุกสิ่งที่อยู่ใกล้กับพื้นที่หน่วยความจำ 64 บิตที่อยู่ (หรือแม้แต่ 1x10 ^ -12 ของมัน)
พื้นฐาน

3

Teory ของฉันเป็นเพราะเราใช้ลอจิกเชิงลบดิจิตอลหนึ่ง (1) ไม่มีความตึงเครียดเลย (โวลต์โอ) เราต้องใส่ความตึงเครียดใน 4 บิตสุดท้ายเมื่อเริ่มต้นดังนั้นตัวนับโปรแกรม (หรือตัวชี้คำแนะนำ) lacates ที่ 1111 1111 1111 1111 1111 1111 1111 0000 เราไม่ต้องพูดถึง 28 บิตส่วนบนเนื่องจากซีพียูเก่า (ส่วนใหญ่) เป็น 16 บิตและปลายปากกาล่างสามารถแก้ไขได้ด้วยชิปแอดเดรสเดียวในสมัยก่อน ขณะนี้เนื่องจากเรามี 64 บิตที่เข้ากันได้กับ 32 บิตและ 32 บิตถึง 16 บิตฮาร์ดแวร์ couild ได้รับการปรับปรุง แต่วิธีการยังคงอยู่ ไบออสยังไม่ได้ตั้งโปรแกรมเสมอ 64 บิตหรือ 32 บิต ความคิดเห็นของฉันก็คือเนื่องจากความทรงจำไม่เหมือนกันเสมอไบออสจะต้องอยู่ในส่วนแรกเหมือนกัน วิธีที่เราเห็นประวัติที่แก้ไขไม่ใช่ที่อยู่จริงตลอดเวลา เป็นเพียงการสอนของฉัน ...


2

เมื่อ RESET cpu ที่ใช้งานร่วมกันได้ 8088/8086 จะดำเนินการตามคำแนะนำที่ 0FFFF0 ซึ่งมีขนาด 16 ไบต์ต่ำกว่าขีด จำกัด 1 เมกะไบต์ โดยปกติแล้ว ROM ที่ตำแหน่งนี้ (ในการใช้งานบนพีซี) จะเป็น BIOS ดังนั้นในตอนท้ายของ ROM ROM จะมีการข้ามไปยังจุดเริ่มต้นของ BIOS ROM

แสดงที่นี่: เริ่มเวกเตอร์และลายเซ็น 'date' ที่อยู่ด้านหลัง IBM 5150 PC 8KB วันที่ถ่ายโอนข้อมูล eprom eprom: 10/19/1981

00001FEE  FF                db 0xff
00001FEF  FF                db 0xff
00001FF0  EA5BE000F0        jmp word 0xf000:0xe05b
00001FF5  3130              xor [bx+si],si
00001FF7  2F                das
00001FF8  3139              xor [bx+di],di

โปรดทราบว่าการกำหนดแอดเดรสเป็นรอม 8KB $ 2,000 ซึ่งวางที่อยู่เริ่มต้น (JMP ที่สมบูรณ์ที่สุดไปยังตำแหน่งอื่นใดในกรณีนี้ภายในรอม 8KB เองแม้ว่าจะไม่ใช่แอดเดรสที่ต่ำที่สุดภายในรอมนั้น) ที่ $ FFFF: $ 0 แบ่งเป็นส่วนหรือ $ เชิงเส้น $ FFFF0

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

(ในระบบที่มี ram เพียง 1mb และ rom อยู่ท้ายสุดของ ram นั้นและไม่มีอะไรอื่นมันจะ 'คิด' อย่างมีความสุขที่ได้พูดคุยกับที่อยู่ที่สูงกว่า แต่ได้รับข้อมูลที่เหมือนกันเพราะการใช้งานเหล่านั้นไม่เคยได้ยิน บรรทัดที่อยู่สูงกว่า A19)

โปรดจำไว้ว่าโลกไม่ได้เป็นเพียง 'พีซี' ... ibm pc เป็น 'อุบัติเหตุ' โปรเซสเซอร์เหล่านี้ไม่ได้ถูกออกแบบมาเป็นพิเศษสำหรับ 'พีซี' และเข้าสู่สิ่งต่าง ๆ มากมายมากกว่าแค่คอมพิวเตอร์ (เช่นดาวเทียม อาวุธระบบ ฯลฯ ) โหมดที่ได้รับการป้องกันแบบ 32 และ 64 บิตมักไม่ต้องการ (โหมด 8086 เสมือนเป็นสิ่งที่น่าสนใจมากขึ้นสำหรับเหตุผลที่เลือกรุ่นที่ใหม่กว่า (386+)) ดังนั้นมีจำนวนมากที่ 'เข้ากันได้ย้อนหลัง' มากกว่าเพียงแค่ 'มันจะเรียกใช้ dos'


1

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

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.