ใช่พวกเขาต้องการรหัสเครื่องและตัวถูกดำเนินการหน่วยความจำทั้งหมด
ซีพียูไม่ควรเข้าถึงหน้าหน่วยความจำตามลำดับหรือไม่เช่นอ่านคำสั่งก่อนจากนั้นจึงเข้าถึงตัวถูกดำเนินการหน่วยความจำ
ใช่นั่นคือเหตุผลที่เกิดขึ้น แต่ข้อผิดพลาดหน้าขัดจังหวะที่กระบวนการ 2 ขั้นตอนและยกเลิกความคืบหน้าใด ๆ ซีพียูไม่มีวิธีใดที่จะจำได้ว่าคำสั่งนั้นตรงไหนเมื่อเกิดข้อผิดพลาดของหน้า
เมื่อตัวจัดการ page-fault ส่งคืนหลังจากจัดการ page fault ที่ถูกต้อง RIP = ที่อยู่ของคำสั่ง faulting ดังนั้น CPU จะพยายามดำเนินการอีกครั้ง จากรอยขีดข่วน
มันจะถูกกฎหมายสำหรับระบบปฏิบัติการที่จะแก้ไขรหัสเครื่องของคำแนะนำการผิดพลาดและคาดว่ามันจะดำเนินการคำสั่งที่แตกต่างกันหลังจากiret
จากตัวจัดการข้อบกพร่องหน้า (หรือข้อยกเว้นอื่น ๆ หรือตัวจัดการขัดจังหวะ) ดังนั้น AFAIK จำเป็นต้องใช้สถาปัตยกรรมในการที่ CPU ทำซ้ำการดึงรหัสจาก CS: RIP ในกรณีที่คุณกำลังพูดถึง (สมมติว่ามันจะกลับสู่ความผิดพลาด CS: RIP แทนการกำหนดเวลากระบวนการอื่นในขณะที่รอดิสก์ในความผิดพลาดของหน้ากระดาษหรือส่ง SIGSEGV ไปยังตัวจัดการสัญญาณบนความผิดพลาดของหน้าไม่ถูกต้อง)
อาจจำเป็นต้องมีสถาปัตยกรรมสำหรับการเข้า / ออกของไฮเปอร์ไวเซอร์ และถึงแม้ว่ามันจะไม่ถูกห้ามอย่างชัดเจนบนกระดาษก็ไม่ใช่วิธีการทำงานของซีพียู
@torek ความคิดเห็นที่ตัวประมวลผลไมโครโปรเซสเซอร์ (CISC) บางส่วนถอดรหัสคำสั่งและถ่ายโอนข้อมูลสถานะ microregister ในความผิดพลาดของหน้าแต่ x86 ไม่เป็นเช่นนั้น
คำแนะนำบางอย่างสามารถขัดจังหวะและสามารถทำให้บางส่วนความคืบหน้าเช่นrep movs
(memcpy ในกระป๋อง) และคำแนะนำสตริงอื่น ๆ หรือรวบรวมร้านค้าโหลด / กระจาย แต่กลไกเดียวคือการอัพเดตรีจิสเตอร์สถาปัตยกรรมเช่น RCX / RSI / RDI สำหรับ string ops หรือปลายทางและมาสก์รีจิสเตอร์สำหรับการรวบรวม (เช่นคู่มือสำหรับAVX2vpgatherdd
) ไม่รักษา opcode / ถอดรหัสผลลัพธ์ในการลงทะเบียนภายในบางอย่างที่ซ่อนอยู่และเริ่มใหม่หลังจาก iret จากตัวจัดการข้อบกพร่องของหน้า เหล่านี้คือคำแนะนำที่เข้าถึงข้อมูลแยกกันหลายแห่ง
นอกจากนี้โปรดทราบว่า x86 (เหมือน ISAs ส่วนใหญ่) รับประกันได้ว่าคำแนะนำนั้นเป็นอะตอมมิก WRT การขัดจังหวะ / ข้อยกเว้น: พวกมันเกิดขึ้นอย่างเต็มที่หรือไม่เกิดขึ้นเลยก่อนที่จะถูกขัดจังหวะ ขัดขวางการเรียนการสอนการชุมนุมขณะที่มันเป็นปฏิบัติการ ตัวอย่างเช่นadd [mem], reg
จะต้องยกเลิกการโหลดถ้าส่วนร้านผิดพลาดแม้ไม่มีlock
คำนำหน้า
จำนวนเคสที่แย่ที่สุดของเพจพื้นที่ผู้ใช้ของผู้เยี่ยมชมที่มีอยู่เพื่อดำเนินการไปข้างหน้าอาจเป็น 6 (รวมทั้งแผนผังย่อยของตารางเพจเกสต์เคอร์เนลแยกต่างหากสำหรับแต่ละอัน):
movsq
หรือmovsw
คำสั่ง 2 ไบต์ขยายขอบเขตหน้าดังนั้นทั้งสองหน้าจึงจำเป็นต้องถอดรหัส
- ตัวดำเนินการซอร์สของ qword
[rsi]
ยังเป็นการแบ่งหน้า
- qword ปลายทางตัวถูกดำเนินการ
[rdi]
ยังแบ่งหน้า
หากความผิดพลาด 6 หน้าใด ๆ เรากลับไปที่สี่เหลี่ยมจัตุรัส
rep movsd
ยังเป็นคำสั่ง 2 ไบต์และทำให้ความคืบหน้าในขั้นตอนเดียวของมันจะมีความต้องการเดียวกัน กรณีที่คล้ายกันเช่นpush [mem]
หรือpop [mem]
สามารถสร้างขึ้นด้วยสแต็กที่ไม่ตรงแนว
หนึ่งในเหตุผล (หรือผลประโยชน์ด้านข้าง) สำหรับ / ของการรวบรวมเก็บ / กระจายร้านค้า "ขัดจังหวะ" (ปรับปรุงหน้ากากเวกเตอร์ด้วยความคืบหน้าของพวกเขา) คือการหลีกเลี่ยงการเพิ่มรอยขั้นต่ำนี้เพื่อดำเนินการคำสั่งเดียว นอกจากนี้เพื่อปรับปรุงประสิทธิภาพของการจัดการข้อบกพร่องหลายอย่างในระหว่างการรวบรวมหรือกระจาย
@Brandon ชี้ให้เห็นในความคิดเห็นว่าแขกจะต้องใช้หน้าตารางในหน่วยความจำและการแยกหน้าพื้นที่ผู้ใช้ยังสามารถแยก 1GiB เพื่อให้ทั้งสองฝ่ายอยู่ในต้นไม้ย่อยที่แตกต่างกันของ PML4 ระดับสูงสุด การเดินหน้า HW จะต้องแตะหน้าโต๊ะหน้าแขกเหล่านี้เพื่อดำเนินการ สถานการณ์ทางพยาธิวิทยานี้ไม่น่าจะเกิดขึ้นโดยบังเอิญ
TLB (และผู้ดำเนินการประกวดหน้า) ได้รับอนุญาตให้แคชข้อมูลบางส่วนของหน้าตารางและไม่จำเป็นต้องเริ่มต้นการเดินหน้าใหม่ตั้งแต่ต้นเว้นแต่ระบบปฏิบัติการทำinvlpg
หรือตั้งค่าไดเรกทอรีหน้าระดับบนสุด CR3 ใหม่ สิ่งเหล่านี้ไม่จำเป็นเมื่อเปลี่ยนหน้าจากไม่เป็นปัจจุบัน; x86 บนกระดาษรับประกันได้ว่าไม่จำเป็น (ดังนั้นจึงไม่อนุญาตให้ "การแคชเชิงลบ" ของ PTE ที่ไม่อยู่ในปัจจุบันอย่างน้อยก็มองไม่เห็นด้วยซอฟต์แวร์) ดังนั้น CPU อาจไม่ VMexit แม้ว่าบางหน้าเพจตารางผู้เยี่ยมชมทางกายภาพจะไม่มีอยู่จริง
ตัวนับประสิทธิภาพ PMUสามารถเปิดใช้งานและกำหนดค่าเพื่อให้คำสั่งยังต้องการเหตุการณ์ perf เพื่อเขียนลงในบัฟเฟอร์ PEBSสำหรับคำสั่งนั้น ด้วยมาสก์ของตัวนับที่กำหนดค่าให้นับเฉพาะคำแนะนำพื้นที่ผู้ใช้ไม่ใช่เคอร์เนลอาจเป็นไปได้ว่ามันจะพยายามล้นตัวนับและเก็บตัวอย่างในบัฟเฟอร์ทุกครั้งที่คุณกลับไปที่ userspace ทำให้เกิดความผิดพลาดของหน้า