เหตุใดระบบ x86-64 จึงมีพื้นที่แอดเดรสเสมือน 48 บิตเท่านั้น


98

ในหนังสือฉันอ่านสิ่งต่อไปนี้:

โปรเซสเซอร์ 32 บิตมีแอดเดรสที่เป็นไปได้ 2 ^ 32 ในขณะที่โปรเซสเซอร์ 64 บิตปัจจุบันมีพื้นที่แอดเดรส 48 บิต

ความคาดหวังของฉันคือถ้าเป็นโปรเซสเซอร์ 64 บิตพื้นที่แอดเดรสควรเป็น 2 ^ 64

ผมเลยสงสัยว่าเหตุผลของข้อ จำกัด นี้คืออะไร?


12
หนังสือเล่มนี้ต้องพูดถึงโดยเฉพาะเกี่ยวกับการนำสถาปัตยกรรม AMD64 (x86-64) มาใช้ในปัจจุบัน ใช้เฉพาะ 48 บิตลำดับต่ำเท่านั้น นี่ไม่ใช่ข้อ จำกัด ของฮาร์ดแวร์ แต่มี 64 บิตทั้งหมด
โคดี้เกรย์

8
ควรระบุหนังสือเล่มนี้เสมอ
Henk Holterman

1
ฉันเดาว่าบรรทัดที่อยู่ทางกายภาพไม่ฟรี (คุณต้องมีหมุด cpu เสริม 16 ตัวเป็นอย่างน้อย) และฉันไม่ทราบถึงฮาร์ดแวร์ใด ๆ ที่สามารถเติมพื้นที่ 48 บิตด้วยชิป RAM จริงบนโปรเซสเซอร์เดียวกันได้ เมื่อเป็นไปได้ฉันแน่ใจว่า AMD จะเพิ่ม 16 พินที่หายไป :)
Torp

7
แม้The 32-bit processors have 2^32 possible addressesไม่จำเป็นต้องเป็นจริง แต่ก็มีซีพียู 32 บิตที่มีเพียง 24 "พิน" สำหรับระบุหน่วยความจำ เช่น 68EC020 (รุ่น 68020 ราคาถูกกว่า) เป็นซีพียู 32 บิต แต่มี 24 บิตสำหรับระบุหน่วยความจำ
ShinTakezou

21
มีปัญหาที่แท้จริงเกี่ยวกับการระบุที่อยู่ทางกายภาพ 64 บิตขนาดเพจหน่วยความจำเสมือนเล็กเกินไป ซึ่งทำให้ไดเร็กทอรีเพจขนาดใหญ่และการล้างแคช TLB ที่มีราคาแพงมากในทุกสวิตช์บริบท การย้ายจากหน้า 4KB เป็น 4MB เป็นตัวเลือก แต่ใช้ไม่ได้กับระบบปฏิบัติการปัจจุบัน
Hans Passant

คำตอบ:


136

เพราะนั่นคือทั้งหมดที่จำเป็น 48 บิตให้พื้นที่แอดเดรส 256 เทราไบต์ นั่นเป็นจำนวนมาก คุณจะไม่เห็นระบบที่ต้องการมากกว่านั้นในเร็ว ๆ นี้

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

ดังนั้นเมื่อเราเข้าใกล้ขีด จำกัด 48 บิตมันเป็นเพียงเรื่องของการปล่อยซีพียูที่จัดการพื้นที่แอดเดรสเต็มรูปแบบ แต่จะไม่ต้องการการเปลี่ยนแปลงใด ๆ กับชุดคำสั่งและจะไม่ทำลายความเข้ากันได้


121
640kb เพียงพอสำหรับทุกคน

7
คุณยังใช้ระบบ 8088 อยู่หรือเปล่า?
โจ

25
@bdares: การเปรียบเทียบที่ไม่ดี ชุดคำสั่งของซุ้มประตู 8088/8086 มีขีด จำกัด 640k ในตัว การสร้าง ISA ใหม่ (386) เท่านั้นที่สามารถทำลายกำแพงได้ ในทางกลับกัน x86_64 รองรับ 64 บิตทั้งหมดใน ISA เป็นเพียงฮาร์ดแวร์รุ่นปัจจุบันที่ไม่สามารถใช้ประโยชน์ได้ทั้งหมด ...
R .. GitHub STOP HELPING ICE

16
@ ร. ที่จริงข้อ จำกัด ใน CPU คือหนึ่งเมกะไบต์ IBM PC กำหนดส่วนนั้นสำหรับอุปกรณ์ต่อพ่วงที่แมปหน่วยความจำ BIOS และอื่น ๆ การออกแบบ 8088/8086 อื่น ๆ (Zenith Z100 หากหน่วยความจำให้บริการ) กำหนดให้น้อยลงสำหรับอุปกรณ์ต่อพ่วงและอื่น ๆ ตามลำดับสำหรับโปรแกรมแอปพลิเคชัน
Jerry Coffin

25
lwn.net/SubscriberLink/655437/9a48cd3e7a8cbe8a <- สามปีหลังจากการตอบกลับนี้เราถึงขีด จำกัด เหล่านี้แล้ว :) HP Machine จะมีหน่วยความจำ 320TB และไม่สามารถให้เป็นพื้นที่ที่อยู่แบบแบนเนื่องจาก 48 ข้อ จำกัด ที่อยู่ -bit
กัม

18

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

ฉันคิดว่าคำตอบที่แท้จริงคือ AMD นั้นถูกและหวังว่าจะไม่มีใครสนใจในตอนนี้ แต่ฉันไม่มีข้อมูลอ้างอิงในการอ้างอิง


15
"ถูก" ฉันเดาว่าคุณหมายถึงการไม่เพิ่มพินที่จะไม่ถูกใช้ไม่กินเนื้อที่ชิปสำหรับทรานซิสเตอร์ที่จะไม่ใช้และใช้พื้นที่ว่างเพื่อทำให้คำสั่งที่มีอยู่เร็วขึ้น? ถ้าถูกฉันก็เข้า!
Olof Forshell

80386 ช่วยให้ตัวเลือก 2 * 4096 แต่ละตัวมีหน่วยความจำสูงสุด 4GB (รวม 32TB) 80286 อนุญาตให้ใช้ตัวเลือก 2 * 4096 ซึ่งแต่ละตัวมีขนาดไม่เกิน 64KB (1GB)
Olof Forshell

การแฮ็กแบบแบ่งส่วนที่ไม่ใช่เชิงเส้นจะไม่นับเป็นพื้นที่ที่อยู่ในหนังสือของฉัน ไม่มีทางที่ซอฟต์แวร์พกพาจะใช้ประโยชน์จากซอฟต์แวร์เหล่านี้ได้
R .. GitHub STOP HELPING ICE

@R .. - ผมคิดว่าคำนิยามของซอฟแวร์แบบพกพาก็คือว่ามันสามารถ :-) ตัวอย่างเช่น C ++ ห้ามไม่ให้เปรียบเทียบพอยน์เตอร์เป็นอาร์เรย์ต่างๆเพื่อให้สามารถอยู่ในส่วน 4GB แยกกันได้
Bo Persson

หากคอมไพล์ของคุณสร้างพอยน์เตอร์ขนาดใหญ่และโหลดเซกเมนต์รีจิสเตอร์สำหรับการแยกหน่วยความจำแต่ละครั้งใช่ แต่ในความเป็นจริงมันช้าอย่างน่ากลัวและทุกคนกลับใช้แบบจำลองหน่วยความจำขนาดเล็กและตัวชี้__far(หรือแย่กว่านั้นก็คือFAR/ far!) ...
R .. GitHub STOP HELPING ICE

10

อ่านส่วนข้อ จำกัด ของบทความวิกิพีเดีย :

พีซีไม่สามารถมีหน่วยความจำได้ 4 เพตะไบต์ (เนื่องจากขนาดของชิปหน่วยความจำในปัจจุบันหากไม่มีอะไรอื่น) แต่ AMD มองเห็นเซิร์ฟเวอร์ขนาดใหญ่คลัสเตอร์หน่วยความจำที่ใช้ร่วมกันและการใช้พื้นที่ที่อยู่ทางกายภาพอื่น ๆ ที่อาจเข้าใกล้สิ่งนี้ในอนาคตอันใกล้และ 52 ที่อยู่จริงบิตให้พื้นที่กว้างขวางสำหรับการขยายในขณะที่ไม่ต้องเสียค่าใช้จ่ายในการนำที่อยู่ทางกายภาพ 64 บิต

นั่นคือไม่มีประเด็นที่จะใช้การกำหนดแอดเดรส 64 บิตเต็มรูปแบบ ณ จุดนี้เนื่องจากเราไม่สามารถสร้างระบบที่สามารถใช้พื้นที่แอดเดรสได้เต็มรูปแบบดังนั้นเราจึงเลือกสิ่งที่ใช้ได้จริงสำหรับระบบของวันนี้ (และในอนาคต)


4 มาจากไหนใน 4 เพตาไบต์? หากเรากำลังพูดถึง 64 บรรทัดที่อยู่เราควรจะลงท้ายด้วยกำลังสองของพื้นที่แอดเดรสที่ทำได้โดย 32 บรรทัดแอดเดรสซึ่งมีขนาด 4 กิกะไบต์ สี่เหลี่ยมนั่นและเราควรมี 16 ไม่ใช่ 4 เพตะไบต์ ฉันพลาดอะไรไปรึเปล่า?
Olof Forshell

1
มันมาจากขีด จำกัด ทางกายภาพในปัจจุบัน (52 บิต) - ประเด็นคือเราไม่สามารถใส่ RAM ในพีซีได้เพียงพอเพื่อรองรับช่วงที่ จำกัด นี้นับประสาอะไรกับพื้นที่ที่อยู่ 64 บิตเต็ม
Damien_The_Unbeliever

9

ความกว้างของรีจิสเตอร์เนทีฟภายใน / การดำเนินการไม่จำเป็นต้องแสดงในความกว้างบัสแอดเดรสภายนอก

สมมติว่าคุณมีโปรเซสเซอร์ 64 บิตซึ่งต้องการเข้าถึง RAM 1 เมกะไบต์เท่านั้น แอดเดรสบัส 20 บิตเป็นสิ่งที่จำเป็น ทำไมต้องกังวลกับต้นทุนและความซับซ้อนของฮาร์ดแวร์ของพินเสริมทั้งหมดที่คุณจะไม่ใช้?

Motorola 68000 เป็นแบบนี้ ภายใน 32 บิต แต่มีแอดเดรสบัส 23 บิต (และบัสข้อมูล 16 บิต) ซีพียูสามารถเข้าถึงแรม 16 เมกะไบต์และในการโหลดประเภทข้อมูลเนทีฟ (32 บิต) ใช้การเข้าถึงหน่วยความจำสองครั้ง (แต่ละตัวมีข้อมูล 16 บิต)


1
แต่ 68000 ถือเป็นซีพียูแบบ "16/32 บิต" ไม่ใช่ซีพียู 32 บิต "เต็ม" ดังนั้นใคร ๆ ก็บอกได้ว่ามันยังคงอยู่ในช่วง 16 บิตที่ผ่านมา ฉันได้เลือก 68020 มาเป็นตัวอย่างเนื่องจากรุ่น 68EC020 ราคาประหยัดมี 24 บิตสำหรับแอดเดรสเท่านั้นแม้ว่า 68020 จะเป็นซีพียูแบบ 32 บิต "เต็ม" ... +1 ถือว่าเป็นตระกูลโปรเซสเซอร์ที่ยอดเยี่ยมนี้!
ShinTakezou

@ShinTakezou: จริงๆแล้ว 80386SX เป็น CPU 16 บิต (เพราะมีพื้นที่แอดเดรสเหมือน 80286) หรือเป็น 32 บิต (เพราะมีสถาปัตยกรรมภายในเป็น 80386DX)? คนหนึ่งสามารถพูดได้ในขณะที่คุณทำ แต่อีกคนหนึ่ง (คนนี้) พูดว่า "ภายในคือสิ่งที่มีค่า" - และคุณสามารถอ้างฉันได้
Olof Forshell

@Olof ฉันคิดว่าในบริบทของ "หน่วยความจำ" (ซึ่งเป็นโลกภายนอก) ภายนอกคือสิ่งที่นับได้ดังนั้น 68000 จึงเป็น CPU 16 บิต (ต้องการ 2 "ขั้นตอน" เพื่ออ่านข้อมูล 32 บิต): D
ShinTakezou

@ShinTakezou: บริบทหน่วยความจำแม้กระทั่งแคชก็มักจะอยู่ภายนอกของซีพียูแม้ว่าจะมีการทำงานร่วมกันอย่างแน่นหนาในโปรเซสเซอร์สมัยใหม่ก็ตาม 8088 มีค่าเท่ากับ 8086 ภายในแม้ว่าจะมีบัสข้อมูลแปดสายถึง 8086 ของสิบหก ฉันไม่เห็นสิ่งที่คุณเห็นชัดเจนว่า 8088 ควรถูกจัดอยู่ในกลุ่มเดียวกับ Z80, 8080, 8085 เป็นต้นคำถามเกี่ยวกับความกว้างของบัสข้อมูลดูเหมือนจะไม่สำคัญในบริบทนั้น
Olof Forshell

ฉันไม่ใช่ผู้เชี่ยวชาญในเรื่องดังกล่าวเลยดังนั้นฉันจึงไม่มีอะไรชัดเจนสำหรับฉันฉันต้องการเพียงแค่สังเกตเห็นความจำเป็นในการตัดต่อที่คมชัดกว่าในอดีตซึ่งใคร ๆ ก็คิดว่า 68000 ยังคงเป็นโปรเซสเซอร์ "เวลาเก่า" ดังนั้น อาจดูเหมือน "เป็นธรรมชาติ" ที่พื้นที่แอดเดรสถูก จำกัด ให้น้อยกว่า 32 บิตในขณะที่ 68020 สามารถ 32 บิตดังนั้นการมีอยู่ของ 68EC020 ที่มีขีด จำกัด ทำให้ชัดเจนว่าเป็นตัวเลือกที่ไม่ได้เกิดจาก "ขีด จำกัด ของสิ่งนั้น ( หรือสิ่งนี้) เวลา "แต่สำหรับการพิจารณาอื่น ๆ (เช่นจะทำให้ถูกกว่าหากไม่มีข้อได้เปรียบที่แท้จริงในการมี 64 พิน) ซึ่งเป็นข้อโต้แย้งของคำตอบนี้มากหรือน้อย
ShinTakezou

8

มีเหตุผลที่รุนแรงกว่าการประหยัดทรานซิสเตอร์ในพา ธ แอดเดรสของ CPU: ถ้าคุณเพิ่มขนาดของพื้นที่แอดเดรสคุณต้องเพิ่มขนาดเพจเพิ่มขนาดของตารางเพจหรือมีโครงสร้างตารางเพจที่ลึกกว่า (นั่น เป็นตารางการแปลระดับอื่น ๆ ) สิ่งเหล่านี้เพิ่มต้นทุนของการพลาด TLB ซึ่งส่งผลเสียต่อประสิทธิภาพ


2
Intel กำลังเสนอรูปแบบการเพจ 5 ระดับเพื่อขยายจาก 48 บิตปัจจุบันเป็น 57 บิต (9 บิตต่อระดับ / หน้า 4k เช่นเดียวกับตารางหน้า x86-64 ปัจจุบัน) การใช้ 10 หรือ 11 บิตต่อระดับจะต้องมีการเปลี่ยนฮาร์ดแวร์ page-walk ดังนั้นนี่อาจไม่ใช่การออกแบบที่เหมาะสมที่สุดสำหรับหน่วยความจำขนาดใหญ่ แต่เป็นส่วนขยายที่เหมาะสมสำหรับ CPU แบบดูอัลโหมดที่ต้องรองรับประสิทธิภาพสูงสุดสำหรับ 4- ตารางระดับในรูปแบบปัจจุบัน
Peter Cordes

แน่นอนว่าด้วยหน้าขนาดใหญ่ 2M หรือ 1G มันเป็นเพียง 4 หรือ 3 ระดับของตารางหน้าจากระดับบนสุดไปจนถึงรายการตารางขนาดใหญ่แทนที่จะเป็นตัวชี้ไดเรกทอรีหน้า
Peter Cordes

6

จากมุมมองของฉันนี่เป็นผลมาจากขนาดหน้าแต่ละหน้ามากที่สุดมี 4096/8 = 512 รายการของตารางหน้า และ 2 ^ 9 = 512 ดังนั้น 9 * 4 + 12 = 48


4

เพื่อตอบคำถามเดิม: ไม่จำเป็นต้องเพิ่ม PA มากกว่า 48 บิต

เซิร์ฟเวอร์ต้องการหน่วยความจำสูงสุดดังนั้นเรามาลองขุดลึกลงไป

1) การกำหนดค่าเซิร์ฟเวอร์ที่ใหญ่ที่สุด (ที่ใช้กันทั่วไป) คือระบบ 8 Socket ระบบ 8S ไม่ใช่อะไรนอกจาก 8 Server CPU ที่เชื่อมต่อกันด้วยการเชื่อมต่อระหว่างกันความเร็วสูง (หรือเรียกง่ายๆว่า "บัส" ความเร็วสูง) เพื่อสร้างโหนดเดียว มีคลัสเตอร์ขนาดใหญ่อยู่ที่นั่น แต่มีอยู่ไม่มากนักเรากำลังพูดถึงการกำหนดค่าที่ใช้กันทั่วไปที่นี่ โปรดทราบว่าในโลกแห่งความเป็นจริงระบบ 2 Socket เป็นหนึ่งในเซิร์ฟเวอร์ที่ใช้กันมากที่สุดและโดยทั่วไปแล้ว 8S ถือว่าสูงมาก

2) ประเภทหน่วยความจำหลักที่เซิร์ฟเวอร์ใช้ ได้แก่ หน่วยความจำ DRAM ปกติที่สามารถแอดเดรสแบบไบต์ (เช่นหน่วยความจำ DDR3 / DDR4), Memory Mapped IO - MMIO (เช่นหน่วยความจำที่ใช้โดยการ์ดเพิ่มเติม) และ Configuration Space ที่ใช้ในการกำหนดค่า อุปกรณ์ที่มีอยู่ในระบบ หน่วยความจำประเภทแรกคือหน่วยความจำที่ใหญ่ที่สุด (และด้วยเหตุนี้จึงต้องการบิตแอดเดรสจำนวนมากที่สุด) เซิร์ฟเวอร์ระดับไฮเอนด์บางตัวใช้ MMIO จำนวนมากเช่นกันขึ้นอยู่กับการกำหนดค่าที่แท้จริงของระบบ

3) สมมติว่า CPU ของเซิร์ฟเวอร์แต่ละตัวสามารถรองรับ DDR4 DIMM ได้ 16 ตัวในแต่ละสล็อต ด้วยขนาดสูงสุด DDR4 DIMM 256GB (ขึ้นอยู่กับเวอร์ชันของเซิร์ฟเวอร์จำนวน DIMM ที่เป็นไปได้ต่อซ็อกเก็ตนี้จริง ๆ แล้วน้อยกว่า 16 DIMM แต่อ่านต่อไปเพื่อประโยชน์ของตัวอย่าง)

ดังนั้นแต่ละซ็อกเก็ตในทางทฤษฎีสามารถมี 16 * 256GB = 4096GB = 4 TB สำหรับระบบ 8S ตัวอย่างของเราขนาด DRAM สามารถมีขนาดได้สูงสุด 4 * 8 = 32 TB ซึ่งหมายความว่าจำนวนบิตสูงสุดที่จำเป็นในการจัดการกับพื้นที่ DRAM นี้คือ 45 (= log2 32TB / log2 2)

เราจะไม่เข้าไปดูรายละเอียดของหน่วยความจำประเภทอื่น ๆ (MMIO, MMCFG และอื่น ๆ ) แต่ประเด็นก็คือหน่วยความจำประเภทที่ "ต้องการ" มากที่สุดสำหรับระบบซ็อกเก็ต 8 ตัวที่มี DDR4 DIMM ประเภทใหญ่ที่สุดในปัจจุบัน (256 GB DIMM) ใช้เพียง 45 บิต

สำหรับระบบปฏิบัติการที่รองรับ 48 บิต (เช่น WS16) จะมี (48-45 =) เหลือ 3 บิต ซึ่งหมายความว่าถ้าเราใช้ 45 บิตที่ต่ำกว่าเพียงอย่างเดียวสำหรับ 32TB ของ DRAM เราจะยังมีหน่วยความจำแอดเดรส 2 ^ 3 เท่าซึ่งสามารถใช้กับ MMIO / MMCFG สำหรับพื้นที่แอดเดรสทั้งหมด 256 TB

ดังนั้นเพื่อสรุป: 1) ที่อยู่ทางกายภาพ 48 บิตเป็นบิตจำนวนมากเพื่อรองรับระบบที่ใหญ่ที่สุดในปัจจุบันซึ่ง "โหลดเต็มที่" ด้วย DDR4 จำนวนมากและยังมีอุปกรณ์ IO อื่น ๆ อีกมากมายที่ต้องการพื้นที่ MMIO 256TB เป็นที่แน่นอน

โปรดทราบว่าพื้นที่แอดเดรส 256TB นี้ (= 48 บิตของที่อยู่จริง) ไม่รวมดิสก์ไดรฟ์ใด ๆ เช่นไดรฟ์ SATA เนื่องจากไม่ได้เป็นส่วนหนึ่งของแอดเดรสแมปจึงรวมเฉพาะหน่วยความจำที่แอดเดรสแอดเดรสแบบไบต์และเปิดเผยกับระบบปฏิบัติการ

2) ฮาร์ดแวร์ของ CPU อาจเลือกใช้ 46, 48 หรือ> 48 บิตขึ้นอยู่กับรุ่นของเซิร์ฟเวอร์ แต่อีกปัจจัยที่สำคัญคือระบบปฏิบัติการรับรู้ได้กี่บิต วันนี้ WS16 รองรับที่อยู่จริง 48 บิต (= 256 TB)

สิ่งนี้หมายถึงผู้ใช้แม้ว่าจะมี CPU เซิร์ฟเวอร์ขนาดใหญ่ที่ทันสมัยเป็นพิเศษซึ่งสามารถรองรับการกำหนดแอดเดรส> 48 บิตหากคุณใช้ระบบปฏิบัติการที่รองรับ PA 48 บิตคุณก็สามารถใช้ประโยชน์จาก 256 TB เท่านั้น .

3) สรุปแล้วมีสองปัจจัยหลักในการใช้ประโยชน์จากจำนวนบิตแอดเดรสที่สูงขึ้น (= ความจุหน่วยความจำมากขึ้น)

ก) CPU HW ของคุณรองรับกี่บิต? (สามารถกำหนดได้โดยคำสั่ง CPUID ใน CPU ของ Intel)

b) คุณใช้ระบบปฏิบัติการเวอร์ชันใดและมีกี่บิตของ PA ที่รู้จัก / รองรับ

ขั้นต่ำของ (a, b) จะกำหนดจำนวนพื้นที่แอดเดรสที่ระบบของคุณสามารถใช้ประโยชน์ได้ในท้ายที่สุด

ฉันเขียนคำตอบนี้โดยไม่ได้ดูคำตอบอื่น ๆ โดยละเอียด นอกจากนี้ฉันยังไม่ได้เจาะลึกรายละเอียดเกี่ยวกับความแตกต่างของ MMIO, MMCFG และการสร้างแผนที่ที่อยู่ทั้งหมด แต่ฉันหวังว่านี่จะช่วยได้

ขอขอบคุณ Anand K Enamandram สถาปนิกแพลตฟอร์มเซิร์ฟเวอร์ Intel Corporation


คำถามนี้ถามเกี่ยวกับขนาดพื้นที่ที่อยู่เสมือน 48 บิต(กำหนดให้ที่อยู่เสมือนเป็นรูปแบบบัญญัติ) คุณต้องการบิตเสมือนมากกว่าบิตทางกายภาพดังนั้นเคอร์เนลครึ่งสูงสามารถแมปหน่วยความจำฟิสิคัลทั้งหมดลงในพื้นที่แอดเดรสเดียว (เป็นของตัวเองหรือพื้นที่ของผู้ใช้) อย่างที่คุณพูด HW ต้องการเพียงใช้ PA บิตให้มากที่สุดเท่าที่ตัวควบคุม DRAM + MMIO สามารถใช้ได้และสามารถใช้ตัวเลขใดก็ได้ถึงขีด จำกัด 52 บิตในรูปแบบ x86-64 page-table ( ทำไมใน 64 บิตที่อยู่เสมือนจึงสั้น 4 บิต (ยาว 48 บิต) เมื่อเทียบกับที่อยู่จริง (ยาว 52 บิต) )
ปีเตอร์คอร์เดส

1
รูปแบบตารางเพจ 4 ระดับยังกำหนดขีด จำกัด VA 48 บิตจนกว่า HW + SW จะรองรับตารางเพจ PML5 สำหรับ VAs 57 บิต อย่างไรก็ตามนี่เป็นคำตอบที่มีประโยชน์ แต่ดูเหมือนว่าจะโพสต์ไว้ภายใต้คำถามที่ไม่ถูกต้อง ฉันไม่แน่ใจว่ามีสถานที่ที่ดีกว่านี้หรือไม่ดังนั้นฉันเดาว่าเราสามารถทิ้งไว้ที่นี่ได้หวังว่าจะมีการแก้ไขเพื่อเพิ่มส่วนหัวเพื่อพูดบางอย่างเกี่ยวกับ PA กับ VA
Peter Cordes

2

หลายคนมีความเข้าใจผิดนี้ แต่ฉันสัญญากับคุณถ้าคุณอ่านอย่างละเอียดหลังจากอ่านสิ่งนี้ความเข้าใจผิดทั้งหมดของคุณจะกระจ่างขึ้น

การบอกว่าโปรเซสเซอร์ 32 บิตหรือ 64 บิตไม่ได้หมายความว่าควรมีแอดเดรสบัส 32 บิตหรือบัสแอดเดรส 64 บิตตามลำดับ! ... ขอย้ำว่าไม่ !!

โปรเซสเซอร์ 32 บิตหมายความว่ามี 32 บิต ALU (หน่วยเลขคณิตและลอจิก) ... ซึ่งหมายความว่าสามารถทำงานบนตัวดำเนินการไบนารี 32 บิต (หรือพูดง่ายๆว่าเลขฐานสองที่มี 32 หลัก) และในทำนองเดียวกันโปรเซสเซอร์ 64 บิตสามารถทำงานบนไบนารี 64 บิต ตัวถูกดำเนินการ ดังนั้นสภาพอากาศโปรเซสเซอร์ 32 บิตหรือ 64 บิตไม่ได้หมายถึงจำนวนหน่วยความจำสูงสุดที่สามารถติดตั้งได้ เพียงแค่แสดงให้เห็นว่าตัวถูกดำเนินการมีขนาดใหญ่เพียงใด ... (สำหรับการเปรียบเทียบคุณสามารถคิดว่าเครื่องคิดเลข 10 หลักสามารถคำนวณผลลัพธ์ได้ไม่เกิน 10 หลัก ... มันไม่สามารถให้ตัวเลข 11 หลักแก่เราหรือผลลัพธ์ที่ใหญ่กว่าอื่น ๆ ได้ ... แม้ว่าจะเป็น เป็นทศนิยม แต่ฉันกำลังบอกการเปรียบเทียบนี้เพื่อความเรียบง่าย) ... แต่สิ่งที่คุณกำลังพูดคือพื้นที่แอดเดรสซึ่งเป็นขนาดหน่วยความจำ (RAM) ที่เชื่อมต่อโดยตรงสูงสุด แรม ' ขนาดสูงสุดที่เป็นไปได้ถูกกำหนดโดยขนาดของแอดเดรสบัสและไม่ใช่ขนาดของบัสข้อมูลหรือแม้แต่ ALU ที่กำหนดขนาดของโปรเซสเซอร์ (32/64 บิต) ได้ถ้าโปรเซสเซอร์มี "Address bus" 32 บิตแสดงว่าสามารถระบุที่อยู่ 2 ^ 32 ไบต์ = RAM 4GB (หรือสำหรับ 64 บิตจะเป็น 2 ^ 64) ... แต่การบอกว่าโปรเซสเซอร์ 32 บิตหรือ 64 บิตมี ไม่มีอะไรเกี่ยวข้องกับพื้นที่แอดเดรสนี้ (พื้นที่แอดเดรส = ระยะที่สามารถเข้าถึงหน่วยความจำหรือขนาดสูงสุดของ RAM) และขึ้นอยู่กับขนาดของ ALU เท่านั้น แน่นอนบัสข้อมูลและแอดเดรสบัสอาจมีขนาดเท่ากันและดูเหมือนว่าโปรเซสเซอร์ 32 บิตหมายความว่าจะเข้าถึงหน่วยความจำ 2 ^ 32 ไบต์หรือ 4 GB ... แต่มันเป็นเรื่องบังเอิญเท่านั้นและมันจะไม่เหมือนกัน สำหรับทุกอย่าง.... ตัวอย่างเช่น intel 8086 เป็นโปรเซสเซอร์ 16 บิต (เนื่องจากมี 16 บิต ALU) ดังนั้นตามที่คุณบอกว่าควรเข้าถึงหน่วยความจำ 2 ^ 16 ไบต์ = 64 KB แต่ไม่เป็นความจริง สามารถเข้าถึงหน่วยความจำได้ไม่เกิน 1 MB สำหรับการมีแอดเดรสบัส 20 บิต .... คุณสามารถ google ได้หากมีข้อสงสัย :)

ฉันคิดว่าฉันได้ชี้แจงประเด็นของฉันแล้วตอนนี้มาถึงคำถามของคุณ ... เนื่องจากโปรเซสเซอร์ 64 บิตไม่ได้หมายความว่าจะต้องมีแอดเดรสบัส 64 บิตดังนั้นจึงไม่ผิดที่จะมีบัสที่อยู่ 48 บิตในโปรเซสเซอร์ 64 บิต ... พวกเขาทำให้พื้นที่แอดเดรสเล็กลงเพื่อให้การออกแบบและการประดิษฐ์มีราคาถูก .... เนื่องจากไม่มีใครใช้หน่วยความจำขนาดใหญ่เช่นนี้ (2 ^ 64 ไบต์) ... โดยที่ 2 ^ 48 ไบต์นั้นเกินพอในปัจจุบัน


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

2
อืม ... การทำงาน 2 ขั้นตอน การลงทะเบียนเซ็กเมนต์มีเฉพาะ 16 บิตบน จากนั้นจะคูณด้วย 10H เพื่อให้เป็น 20 บิตจากนั้นจึงเพิ่มค่าชดเชย
hafiz031

1

ไม่เป็นความจริงที่จะใช้เฉพาะ VA แบบ 64 บิตลำดับต่ำ 48 บิตเท่านั้นอย่างน้อยก็กับ Intel 64 ใช้ 16 บิตด้านบนเรียงลำดับชนิดของ.

ส่วน 3.3.7.1 Canonical Addressing ในคู่มือสำหรับนักพัฒนาซอฟต์แวร์สถาปัตยกรรมIntel® 64 และ IA-32ระบุว่า:

ที่อยู่มาตรฐานต้องมีบิต 63 ถึง 48 ตั้งค่าเป็นศูนย์หรือหนึ่ง (ขึ้นอยู่กับว่าบิต 47 เป็นศูนย์หรือหนึ่ง)

ดังนั้นบิต 47 ถึง 63 จึงเป็น super-bit ทั้งหมด 1 หรือทั้งหมด 0 หากที่อยู่ไม่ได้อยู่ในรูปแบบบัญญัติการใช้งานควรมีข้อผิดพลาด

บน AArch64 สิ่งนี้แตกต่างกัน ตามภาพรวมชุดคำสั่ง ARMv8เป็น VA 49 บิต

ระบบแปลหน่วยความจำ AArch64 รองรับแอดเดรสเสมือน 49 บิต (48 บิตต่อตารางการแปล) แอดเดรสเสมือนถูกขยายจาก 49 บิตและจัดเก็บไว้ภายในตัวชี้ 64 บิต หรือภายใต้การควบคุมของการลงทะเบียนระบบตัวชี้ 64 บิตที่สำคัญที่สุด 8 บิตอาจมี "แท็ก" ซึ่งจะถูกละเว้นเมื่อใช้เป็นที่อยู่โหลด / จัดเก็บหรือเป้าหมายของสาขาทางอ้อม


1
เฉพาะ 48 ตัวล่างเท่านั้นที่มีความสำคัญ แต่ฮาร์ดแวร์จะตรวจสอบว่ามีการขยายการลงชื่อเป็น 64 บิต IDK ทำไมพวกเขาไม่ระบุส่วนขยายเป็นศูนย์ บางทีพวกเขาอาจต้องการทำให้สะดวกยิ่งขึ้นในการตรวจสอบที่อยู่ครึ่งสูงและต่ำ (เพียงแค่ตรวจสอบบิตเครื่องหมาย) หรืออาจจะเพื่อหลีกเลี่ยงการทำให้ขอบเขต 2 ^ 48 เป็นแบบพิเศษดังนั้นแอดเดรสที่อยู่ใกล้ด้านบนจะพอดีกับค่าคงที่ที่ขยายการลงชื่อ 32 บิต ผมคิดว่าอย่างหลังมีโอกาสมากกว่า
Peter Cordes

อย่างไรก็ตามการตรวจสอบ HW ในปัจจุบันสำหรับ Canonical จะป้องกันไม่ให้ซอฟต์แวร์ใช้บิตที่ถูกละเว้นสำหรับตัวชี้ที่ติดแท็กซึ่งจะทำลาย HW ในอนาคตดังนั้นจึงเป็นส่วนหนึ่งของกลไกที่ทำให้สามารถขยายฮาร์ดแวร์ในอนาคตได้หาก / เมื่อจำเป็น (ซึ่งอาจเร็วกว่าที่คาดไว้เนื่องจากหน่วยความจำที่ไม่ลบเลือนถูกเชื่อมต่อโดยตรงกับพื้นที่ที่อยู่จริงและเสมือนจริง)
Peter Cordes

procfs บน Linux บน Core i5 ของฉันบอกว่าแมปกับ 7ffd5ea41000-7ffd5ea62000 ช่วงที่อยู่นี้เหมาะสมตามกฎ "บัญญัติ" ข้างต้น บิต 48-63 เป็น 0 ทำให้เป็นที่อยู่ตามรูปแบบบัญญัติที่ถูกต้อง สิ่งที่แปลกเล็กน้อยคือที่อยู่บางส่วนในซอร์ส Linux ใน include / asm / pgtable_64_types จะระบุว่า #define __VMALLOC_BASE _AC (0xff92000000000000, UL) นี่ไม่ใช่ที่อยู่ตามรูปแบบบัญญัติ ที่อยู่ดังกล่าวจะเริ่มต้นด้วย 0xffff8 Dunno ทำไม
Olsonist

ใช่ IIRC Linux ใช้ครึ่งล่างของช่วงมาตรฐานสำหรับพื้นที่ผู้ใช้และ (ส่วนใหญ่) ใช้ครึ่งสูงสำหรับการแมปเฉพาะเคอร์เนล แต่หน่วยความจำเคอร์เนลบางส่วนจะถูกส่งออกไปยังพื้นที่ผู้ใช้เช่น[vsyscall]เพจ (นั่นอาจเป็นการส่งออกสิ่งต่างๆเช่น PID ปัจจุบันเพื่อให้getpid()เป็นพื้นที่ผู้ใช้ล้วนๆนอกจากนี้ยังgettimeofday()สามารถใช้ rdtsc ในปัจจัยพื้นที่ผู้ใช้ + มาตราส่วนที่ส่งออกโดยเคอร์เนลแม้ว่าฉันคิดว่าบางส่วนนั้นอยู่[vdso]ซึ่งอยู่ใกล้ด้านบนสุดของ ครึ่งล่าง)
Peter Cordes

IDK ทำอะไร__VMALLOC_BASE. สันนิษฐานว่าไม่ได้ใช้โดยตรง
Peter Cordes

0

CPU ถือเป็น "N-bits" เป็นหลักตามขนาดบัสข้อมูลและส่วนใหญ่ของเอนทิตี (สถาปัตยกรรมภายใน) : Registers, Accumulators, Arithmetic-Logic-Unit (ALU), Instruction Set เป็นต้นตัวอย่างเช่น ซีพียู Motorola 6800 (หรือ Intel 8050) รุ่นเก่าที่ดีคือ CPU 8 บิต มีบัสข้อมูล 8 บิตสถาปัตยกรรมภายใน 8 บิตและแอดเดรสบัส 16 บิต


  • แม้ว่า N-bits CPU อาจมีเอนทิตีอื่นที่ไม่ใช่ขนาด N ตัวอย่างเช่นการเพิ่มประสิทธิภาพใน 6809 ในช่วง 6800 (ทั้งสองเป็น CPU 8 บิตพร้อมบัสข้อมูล 8 บิต) ในบรรดาการปรับปรุงที่สำคัญที่นำมาใช้ใน 6809 ได้แก่ การใช้ตัวสะสม 8 บิตสองตัว (A และ B ซึ่งสามารถรวมกันเป็นทะเบียน 16 บิตเดียว D) ทะเบียนดัชนี 16 บิตสองตัว (X, Y) และสองตัว ตัวชี้สแต็ก 16 บิต

มีคำตอบที่ทำให้ประเด็นนี้กับ Motorola 68000/68020 เป็นตัวอย่าง คำถามนี้เป็นคำถามเกี่ยวกับ x86-64 โดยเฉพาะไม่ใช่ซีพียู 8/16 บิตรุ่นเก่า ในกรณีของ x86-64 ปัจจัยสำคัญประการหนึ่งคือที่อยู่เสมือนที่กว้างขึ้นจะต้องมีตารางหน้าเว็บที่ลึกขึ้นและปัจจัยนั้นไม่มีอยู่สำหรับชิปเก่าที่คุณกำลังพูดถึง
Peter Cordes

ความกว้างของบัสข้อมูลไม่จำเป็นต้องตรงกับความกว้างของการลงทะเบียนหรือ ALU ตัวอย่างเช่น P5 Pentium มีบัสข้อมูล 64 บิต (รับประกันว่าการโหลด / การจัดเก็บ 64 บิตในแนวเดียวกันจะเป็นแบบปรมาณู) แต่การลงทะเบียน / ALU จะเป็นเพียง 32 บิตเท่านั้น (ยกเว้น FPU ในตัวและใน Pentium MMX ในภายหลังจะเป็น SIMD ALUs.)
Peter Cordes

OP เขียน: "ความคาดหวังของฉันคือถ้าเป็นโปรเซสเซอร์ 64 บิตพื้นที่แอดเดรสควรเป็น 2 ^ 64 ด้วย" ........ คุณเขียนว่า: "คำถามนี้เกี่ยวกับ x86-64 โดยเฉพาะไม่ใช่ CPU 8/16-bit รุ่นเก่า" ........ ฉันคิดว่าคุณพลาดสาระสำคัญของคำถาม OP คำถาม OP เป็นผลลัพธ์ของสมมติฐานที่ไม่ถูกต้องที่ว่า CPU 64 บิตควรมีแอดเดรสบัส 64 บิต เกี่ยวกับ ALU ฉันเขียนส่วนใหญ่ของเอนทิตี ไม่ใช่ทั้งหมด.
Amit G.

หยุดสแปมฉันด้วยการโพสต์ความคิดเห็นนี้ใหม่ ใช่แน่นอน OP ผิดด้วยเหตุผลที่คุณอธิบาย แต่ฉันชี้ให้เห็นว่าคำตอบของคุณดูเหมือนว่าจะทำผิดพลาดเหมือนกัน คุณพูดว่า " และส่วนใหญ่ของเอนทิตี: Registers and Accumulators, Arithmetic-Logic-Unit (ALU) ... " ซึ่งดูเหมือนว่าคุณกำลังพูดว่าสิ่งเหล่านั้นตรงกับความกว้างของบัสข้อมูล วลีที่ว่า "ส่วนใหญ่" ก็หมายความว่าคุณกำลังจะบอกว่าที่ส่วนไม่ว่ามันเป็นบางครั้งเท่านั้นที่เป็นจริงสำหรับชิ้นส่วนเหล่านั้น
Peter Cordes
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.