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

อ่าน 3 นาที

ข้อผิดพลาดการป้องกันทั่วไป

ข้อผิดพลาดการป้องกันทั่วไป ( GPF ) ในสถาปัตยกรรมชุดคำสั่งx86 (ISA) คือข้อผิดพลาด (ประเภทหนึ่งของการขัดจังหวะ ) ที่เริ่มต้นโดยกลไกการป้องกันที่กำหนดโดย ISA...

ข้อผิดพลาดการป้องกันทั่วไป

ข้อความแสดงข้อผิดพลาดในกล่องโต้ตอบสีขาวระบุว่า "ข้อผิดพลาดของแอปพลิเคชันที่ไม่สามารถแก้ไขได้: กำลังยุติแอปพลิเคชันปัจจุบัน"
ข้อความแสดงข้อผิดพลาดทั่วไปสำหรับความผิดพลาดด้านการป้องกันทั่วไป (ข้อผิดพลาดแอปพลิเคชันที่ไม่สามารถแก้ไขได้) ในWindows 3.0
ข้อความแสดงข้อผิดพลาดสำหรับความผิดพลาดในการป้องกันทั่วไปใน Windows 3.1x
ตัวอย่างข้อความแสดงข้อผิดพลาดสำหรับความผิดพลาดด้านการป้องกันทั่วไปในWindows 3.1x

ข้อผิดพลาดการป้องกันทั่วไป ( GPF ) ในสถาปัตยกรรมชุดคำสั่งx86 (ISA) คือข้อผิดพลาด (ประเภทหนึ่งของการขัดจังหวะ ) ที่เริ่มต้นโดยกลไกการป้องกันที่กำหนดโดย ISA เพื่อตอบสนองต่อการละเมิดการเข้าถึงที่เกิดจากโค้ดที่กำลังทำงานอยู่ ไม่ว่าจะเป็นในเคอร์เนลหรือโปรแกรมของผู้ใช้ กลไกนี้ได้รับการอธิบายครั้งแรกในคู่มือและเอกสารข้อมูลของ Intel สำหรับ ซีพียู Intel 80286ซึ่งเปิดตัวในปี 1983 และยังได้รับการอธิบายไว้ในส่วนที่ 9.8.13 ใน คู่มืออ้างอิงสำหรับโปรแกรมเมอร์ของ Intel 80386จากปี 1986 ด้วย ข้อผิดพลาดการป้องกันทั่วไปถูกนำไปใช้ในรูปแบบของการขัดจังหวะ ( เวกเตอร์หมายเลข 13 (0Dh)) ระบบปฏิบัติการ บางระบบ อาจจัดประเภทข้อยกเว้นบางอย่างที่ไม่เกี่ยวข้องกับการละเมิดการเข้าถึง เช่น ข้อยกเว้น โอเปอเรเตอร์โค้ด ที่ไม่ถูกต้อง เป็นข้อผิดพลาดการป้องกันทั่วไป แม้ว่าจะไม่มีส่วนเกี่ยวข้องกับการป้องกันหน่วยความจำก็ตาม หากซีพียูตรวจพบการละเมิดการป้องกัน มันจะหยุดการทำงานของโค้ดและส่งการขัดจังหวะ GPF ในกรณีส่วนใหญ่ ระบบปฏิบัติการจะลบกระบวนการ ที่ล้มเหลว ออกจากคิวการทำงาน ส่งสัญญาณไปยังผู้ใช้ และดำเนินการกระบวนการอื่นๆ ต่อไป อย่างไรก็ตาม หากระบบปฏิบัติการไม่สามารถตรวจจับข้อผิดพลาดการป้องกันทั่วไปได้ กล่าวคือ เกิดการละเมิดการป้องกันอีกครั้งก่อนที่ระบบปฏิบัติการจะกลับมาจากการขัดจังหวะ GPF ครั้งก่อน CPU จะส่งสัญญาณข้อผิดพลาดสองครั้ง (double fault) ทำให้ระบบปฏิบัติการหยุดทำงาน หากเกิดความล้มเหลวอีกครั้ง ( ข้อผิดพลาดสามครั้ง ) CPU จะไม่สามารถกู้คืนได้ ตั้งแต่ 80286 เป็นต้นมา CPU จะเข้าสู่สถานะหยุดทำงานพิเศษที่เรียกว่า "Shutdown" ซึ่งสามารถออกจากสถานะนี้ได้โดยการรีเซ็ตฮาร์ดแวร์ เท่านั้น IBM PC AT ซึ่งเป็นระบบ ที่เข้ากันได้กับพีซีเครื่องแรกที่มี 80286 มีฮาร์ดแวร์ที่ตรวจจับสถานะ Shutdown และรีเซ็ต CPU โดยอัตโนมัติเมื่อเกิดขึ้น ระบบที่สืบทอดมาจาก PC AT ทั้งหมดทำเช่นเดียวกัน ดังนั้นในพีซี ข้อผิดพลาดสามครั้งจะทำให้ระบบรีเซ็ตทันที

พฤติกรรมเฉพาะ

ไมโครซอฟต์ วินโดวส์

ในระบบปฏิบัติการ Microsoft Windowsข้อผิดพลาดการป้องกันทั่วไปจะแสดงขึ้นในภาษาที่แตกต่างกันไป ขึ้นอยู่กับเวอร์ชันของผลิตภัณฑ์:

ระบบปฏิบัติการข้อความแสดงข้อผิดพลาดหมายเหตุ
วินโดวส์ 3.0ข้อผิดพลาดของแอปพลิเคชันที่ไม่สามารถแก้ไขได้

กำลังยกเลิกแอปพลิเคชันปัจจุบัน

[ 1 ]
วินโดวส์ 3.1x[ชื่อโปรแกรม] ทำให้เกิดข้อผิดพลาดการป้องกันทั่วไปในโมดูล [ชื่อโมดูล] ที่ [ที่อยู่หน่วยความจำ]ข้อความแสดงข้อผิดพลาดนี้ (ที่มีรูปแบบการออกแบบเดียวกัน) อาจปรากฏในเวอร์ชันที่ใหม่กว่า (95, 98 และ Me) ในบางกรณี ข้อความของข้อผิดพลาดนี้จะปรากฏในเวอร์ชัน 95, 98 และ Me หากคลิกปุ่ม 'รายละเอียด' หรือกด Alt+D โดยจะมีข้อมูลเพิ่มเติมเกี่ยวกับ Registers, Bytes at CS:EIP และ Stack Dump ด้วย
วินโดวส์ 95 วินโดวส์ 98โปรแกรมนี้ได้ดำเนินการที่ผิดกฎหมายและจะถูกปิดลง

หากปัญหายังคงอยู่ โปรดติดต่อผู้จำหน่ายโปรแกรม

บางครั้ง ข้อความแสดงข้อผิดพลาดอาจระบุว่า "ปิดโปรแกรมทั้งหมด แล้วรีสตาร์ทคอมพิวเตอร์" โดยเฉพาะอย่างยิ่งเมื่อปัญหาค่อนข้างรุนแรงหรือระบบไม่เสถียร และที่อยู่ส่งคืนชี้ไปยัง DLL ของ Windows หรือกระบวนการระบบอื่นๆ ข้อความนี้อาจปรากฏขึ้นหากไม่สามารถระบุโปรแกรมได้อย่างง่ายดาย เมื่อติดตั้งดีบักเกอร์แล้ว จะมีปุ่ม Debug อยู่ระหว่างปุ่ม Close และ Details ด้วย
ระบบปฏิบัติการ Windows NT 4.0 และWindows 2000[ชื่อโปรแกรม] เกิดข้อผิดพลาดและจะถูกปิดโดย Windows คุณจะต้องเริ่มโปรแกรมใหม่

กำลังสร้างไฟล์บันทึกข้อผิดพลาด

วินโดวส์ มี[ชื่อโปรแกรม] ทำให้เกิดข้อผิดพลาดใน [ชื่อโมดูล] [ชื่อโปรแกรม] จะปิดตัวลงในขณะนี้

หากยังคงพบปัญหาอยู่ ให้ลองรีสตาร์ทคอมพิวเตอร์ของคุณ

เมื่อติดตั้งดีบักเกอร์แล้ว จะมีปุ่ม Debug อยู่ด้านล่างปุ่ม Close ด้วย ยังสามารถดูรายละเอียดได้โดยการกด Alt+D และผ่านไฟล์ faultlog.txt
Windows XP Windows Server 2003 Windows Server 2003 R2[ชื่อโปรแกรม] เกิดปัญหาและจำเป็นต้องปิดตัวลง ขออภัยในความไม่สะดวก

หากคุณกำลังทำอะไรอยู่ ข้อมูลที่คุณกำลังประมวลผลอยู่อาจสูญหายไปได้

[...]

สำหรับข้อมูลเพิ่มเติมเกี่ยวกับข้อผิดพลาดนี้โปรดคลิกที่นี่

ข้อความแสดงข้อผิดพลาดนี้ยังมีตัวเลือกให้ส่งรายละเอียดข้อผิดพลาดไปยัง Microsoft เพื่อทำการวิเคราะห์ด้วย
ระบบปฏิบัติการ Windows Vistaและรุ่นที่ใหม่กว่า ยกเว้น Windows 10 และ Windows Server 2008และรุ่นที่ใหม่กว่า[ชื่อโปรแกรม] หยุดทำงานแล้ว

เกิดปัญหาทำให้โปรแกรมหยุดทำงานอย่างถูกต้อง Windows จะปิดโปรแกรมและแจ้งให้คุณทราบหากมีวิธีแก้ไขปัญหา

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

Windows 11 จะไม่แสดงข้อความแสดงข้อผิดพลาดสำหรับความผิดพลาดด้านการป้องกันทั่วไปอีกต่อไป หากเกิดข้อผิดพลาด โปรแกรมจะปิดลงโดยอัตโนมัติ

ใน Windows 95, 98 และ Me มีข้อความแสดงข้อผิดพลาดอีกแบบหนึ่ง ซึ่งส่วนใหญ่ใช้กับโปรแกรม Windows 3.x: "เกิดข้อผิดพลาดในโปรแกรมของคุณ หากต้องการทำงานต่อ ให้คลิก ละเว้น และบันทึกงานของคุณในไฟล์ใหม่ หากต้องการออกจากโปรแกรมนี้ ให้คลิก ปิด คุณจะสูญเสียข้อมูลที่คุณป้อนตั้งแต่การบันทึกครั้งล่าสุด" การคลิก "ปิด" จะทำให้เกิดข้อความแสดงข้อผิดพลาดอย่างใดอย่างหนึ่งข้างต้น ขึ้นอยู่กับเวอร์ชันของ Windows บางครั้งการคลิก "ละเว้น" ก็ทำให้เกิดข้อผิดพลาดเช่นเดียวกัน

ยูนิกซ์

ในLinuxและระบบปฏิบัติการ Unix อื่นๆ ข้อผิดพลาดจะถูกรายงานแยกกัน (เช่นsegmentation faultสำหรับข้อผิดพลาดเกี่ยวกับหน่วยความจำ)

ข้อผิดพลาดของหน่วยความจำ

ในกรณีเกิดข้อผิดพลาดเกี่ยวกับหน่วยความจำ โปรแกรมที่ก่อให้เกิดข้อผิดพลาดจะเข้าถึงหน่วยความจำที่ไม่ควรเข้าถึง ตัวอย่างเช่น:

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

อย่างไรก็ตาม ระบบปฏิบัติการสมัยใหม่หลายระบบใช้การแบ่งหน้า (paging) แทนการแบ่งส่วน (segmentation) ในการควบคุมการเข้าถึงหน่วยความจำ ดังนั้น การอ้างอิงหน่วยความจำที่ไม่ถูกต้องในระบบปฏิบัติการ เช่น Windows มักจะถูกรายงานผ่านข้อผิดพลาดในการแบ่งหน้า (page fault ) แทนที่จะเป็นข้อผิดพลาดในการป้องกันทั่วไป (general protection fault) โดยทั่วไป ระบบปฏิบัติการจะมีเลเยอร์นามธรรม (เช่น การจัดการข้อยกเว้นหรือสัญญาณ) ที่ซ่อนกลไกภายในของโปรเซสเซอร์ที่ใช้ในการสร้างข้อผิดพลาดในการเข้าถึงหน่วยความจำจากโปรแกรม เพื่อให้มีอินเทอร์เฟซมาตรฐานสำหรับการจัดการเงื่อนไขข้อผิดพลาดที่สร้างขึ้นโดยโปรเซสเซอร์หลายประเภท

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

ในทางทฤษฎีแล้ว ระบบปฏิบัติการสามารถใช้ทั้งการแบ่งหน้าหน่วยความจำ (paging) และการแบ่งส่วนหน่วยความจำ (segmentation) ได้ แต่โดยส่วนใหญ่แล้ว ระบบปฏิบัติการทั่วไปมักใช้การแบ่งหน้าหน่วยความจำ (paging) เป็นหลักในการควบคุมการเข้าถึงหน่วยความจำ

ข้อผิดพลาดเกี่ยวกับสิทธิ์

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

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

สาเหตุทางเทคนิคที่ทำให้เกิดข้อผิดพลาด

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

ระบบปฏิบัติการสมัยใหม่สามารถตรวจจับและจัดการกับข้อผิดพลาดด้านการป้องกันทั่วไปได้ โดยทั่วไปแล้ว หากข้อผิดพลาดเกิดขึ้นในโปรแกรมโหมดผู้ใช้ โปรแกรมโหมดผู้ใช้จะถูกยุติลง อย่างไรก็ตาม หากข้อผิดพลาดเกิดขึ้นในไดรเวอร์ระบบหลักหรือระบบปฏิบัติการเอง ระบบปฏิบัติการมักจะบันทึกข้อมูลการวินิจฉัยลงในไฟล์หรือบนหน้าจอ แล้วหยุดการทำงาน จากนั้นอาจรีสตาร์ทคอมพิวเตอร์หรือแสดงหน้าจอแสดงข้อผิดพลาดเช่นหน้าจอสีน้ำเงินแห่งความตาย (Blue Screen of Death ) หรือKernel Panic

เกินขีดจำกัดของส่วน

ขีดจำกัดของส่วนต่างๆ อาจถูกละเมิดได้:

สิทธิ์การเข้าถึงส่วนนั้นถูกละเมิด

สิทธิ์การเข้าถึงส่วนต่างๆ อาจถูกละเมิดได้โดย:

  • การกระโดดไปยังส่วนที่ไม่สามารถเรียกใช้งานได้
  • การเขียนไปยังเซ็กเมนต์โค้ด หรือเซ็กเมนต์แบบอ่านอย่างเดียว
  • การอ่านเซ็กเมนต์ที่เรียกใช้ได้อย่างเดียว

โหลดส่วนต่างๆ อย่างผิดกฎหมาย

เหตุการณ์นี้อาจเกิดขึ้นได้เมื่อ:

  • เซ็กเมนต์สแต็ก (SS) จะถูกโหลดด้วยตัวเลือกเซ็กเมนต์สำหรับเซ็กเมนต์แบบอ่านอย่างเดียว เซ็กเมนต์ที่สามารถเรียกใช้งานได้ เซ็กเมนต์ว่าง หรือเซ็กเมนต์ที่มีสิทธิ์ในการอธิบายที่ไม่ตรงกับสิทธิ์ปัจจุบันใน CS
  • เซ็กเมนต์รหัส (CS) ที่โหลดด้วยตัวเลือกเซ็กเมนต์สำหรับเซ็กเมนต์ข้อมูล เซ็กเมนต์ระบบ หรือเซ็กเมนต์ว่าง
  • SS, DS, ES, FS หรือ GS คือเซ็กเมนต์ที่โหลดด้วยตัวเลือกเซ็กเมนต์สำหรับเซ็กเมนต์ระบบ
  • SS, DS, ES, FS หรือ GS คือเซ็กเมนต์ที่โหลดด้วยตัวเลือกเซ็กเมนต์สำหรับเซ็กเมนต์โค้ดที่ทำงานอย่างเดียว
  • การเข้าถึงหน่วยความจำโดยใช้รีจิสเตอร์ DS, ES, FS หรือ GS เมื่อรีจิสเตอร์เหล่านั้นมีตัวเลือกค่าว่าง (null selector)

การสลับ

ความผิดพลาดอาจเกิดขึ้นใน โครงสร้าง ส่วนสถานะงาน (TSS) เมื่อ:

  • เปลี่ยนไปทำภารกิจที่ยุ่งยากระหว่างการโทรหรือการฝึกกระโดด
  • การสลับไปยังงานที่ว่างอยู่ระหว่างคำสั่งส่งคืนการขัดจังหวะ (IRET)
  • โดยใช้ตัวเลือกเซ็กเมนต์บนสวิตช์ที่ชี้ไปยังตัวอธิบาย TSS ใน LDT

เบ็ดเตล็ด

สาเหตุอื่นๆ ที่ทำให้เกิดความผิดพลาดในการป้องกันทั่วไป ได้แก่:

  • การพยายามเข้าถึงตัวจัดการการขัดจังหวะ/ข้อยกเว้นจากโหมดเสมือน 8086 เมื่อ ระดับสิทธิ์ของตัวอธิบายส่วนโค้ด (DPL) ของตัวจัดการนั้นมากกว่าศูนย์
  • พยายามเขียนเลข 1 ลงในบิตที่สงวนไว้ของCR4
  • พยายามเรียกใช้ คำสั่ง ที่มีสิทธิ์พิเศษเมื่อระดับสิทธิ์ปัจจุบัน (CPL) ไม่ใช่ศูนย์
  • พยายามดำเนินการคำสั่งเดียวที่มีความยาวมากกว่า 15 ไบต์ (อาจทำได้โดยการเพิ่มคำนำหน้าที่ไม่จำเป็นเข้าไป) [ 2 ]
  • การเขียนไปยังบิตที่สงวนไว้ในคำสั่งMSR
  • การเข้าถึงเกตที่มีตัวเลือกเซกเมนต์ว่าง
  • เรียกใช้การขัดจังหวะซอฟต์แวร์เมื่อ CPL มากกว่า DPL ที่ตั้งไว้สำหรับเกตการขัดจังหวะ
  • ตัวเลือกเซ็กเมนต์ในเกตการเรียก การขัดจังหวะ หรือการดักจับ ไม่ได้ชี้ไปยังเซ็กเมนต์โค้ด
  • การละเมิดกฎสิทธิพิเศษ
  • เปิดใช้งานการเรียกเพจพร้อมปิดใช้งานการป้องกัน
  • การอ้างอิงตารางคำอธิบายการขัดจังหวะหลังจากเกิดการขัดจังหวะหรือข้อยกเว้นที่ไม่ใช่การขัดจังหวะ การดักจับ หรือเกตงาน
  • Legacy SSE : ตัวดำเนินการหน่วยความจำไม่ได้จัดเรียงให้ตรงกับ 16 ไบต์

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

  • คู่มือสำหรับนักพัฒนาซอฟต์แวร์ด้านสถาปัตยกรรมของ Intel – เล่มที่ 3: การเขียนโปรแกรมระบบ

สรุปเนื้อหา

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

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

ข้อผิดพลาดการป้องกันทั่วไป ( GPF ) ในสถาปัตยกรรมชุดคำสั่งx86 (ISA) คือข้อผิดพลาด (ประเภทหนึ่งของการขัดจังหวะ ) ที่เริ่มต้นโดยกลไกการป้องกันที่กำหนดโดย ISA...

ไมโครซอฟต์ วินโดวส์

ใน ระบบปฏิบัติการ Microsoft Windows ข้อผิดพลาดการป้องกันทั่วไปจะแสดงขึ้นในภาษาที่แตกต่างกันไป ขึ้นอยู่กับเวอร์ชันของผลิตภัณฑ์:

ยูนิกซ์

ใน Linux และ ระบบปฏิบัติการ Unix อื่นๆ ข้อผิดพลาดจะถูกรายงานแยกกัน (เช่น segmentation fault สำหรับข้อผิดพลาดเกี่ยวกับหน่วยความจำ)

ข้อผิดพลาดของหน่วยความจำ

ในกรณีเกิดข้อผิดพลาดเกี่ยวกับหน่วยความจำ โปรแกรมที่ก่อให้เกิดข้อผิดพลาดจะเข้าถึง หน่วยความจำ ที่ไม่ควรเข้าถึง ตัวอย่างเช่น: