IRQL_NOT_LESS_OR_EQUAL คืออะไร


15

IRQL_NOT_LESS_OR_EQUAL คืออะไร IRQL คืออะไร สิ่งที่ใช้ IRQL ทำไมต้องน้อยกว่าหรือเท่ากับ อะไรจะทำให้มันไม่น้อยกว่าหรือเท่ากับ เหตุใดระบบปฏิบัติการไม่สามารถกู้คืนจากมันไม่น้อยกว่าหรือเท่ากับ? IRQL มีผลกับ Windows หรือไม่

ข้อผิดพลาดนี้ดูเหมือนว่าจะรักกัน ฉันไม่ได้ขอความช่วยเหลือฉันขอคำอธิบาย




การตรวจสอบบั๊ก IRQL_NOT_LESS_OR_EQUAL มีค่า 0x0000000A สิ่งนี้บ่งชี้ว่า Microsoft Windows หรือไดรเวอร์โหมดเคอร์เนลเข้าถึงหน่วยความจำแบบเพจที่ที่อยู่ไม่ถูกต้องในขณะที่อยู่ในระดับคำขออินเตอร์รัปต์ (IRQL) IQL เป็นระบบสำคัญของเคอร์เนล ที่ IRQL บางตัวในเคอร์เนลคุณไม่สามารถเข้าถึงข้อมูลที่เก็บไว้ใน pagefile วิเคราะห์ dmp และดูว่าเกี่ยวข้องกับรหัสของบุคคลที่สามหรือไม่ ถ้าไม่ทดสอบหน่วยความจำของคุณสำหรับปัญหา
magicandre1981

1
สิ่งที่ตลกคือการตอบสนองที่เป็นประโยชน์มากที่สุดต่อข้อความมันไม่สำคัญว่ามันหมายถึงอะไรทั้งหมดที่สำคัญคือสิ่งที่ต้องทำเมื่อคุณได้รับข้อความนั้น .. หรือสิ่งที่สำคัญคือการแปลที่เกี่ยวข้องซึ่งในกรณีของ IRQL BSOD นั้นโดยทั่วไปจะเป็น "ปัญหาไดรเวอร์"! ลองหาไดร์เวอร์ตัวไหนแล้วถอดออกและติดตั้งไดรฟ์เวอร์แบบนั้นอีก .. แต่มันเป็นคำถามที่ดีที่มันพูดถึงอะไรกันแน่ ... ฉันรู้ว่า IRQ คืออะไร แต่ไม่รู้ว่า IRQL นั้นคืออะไรจนกระทั่ง คำตอบของเจมี่!
barlop

คำตอบ:


25

มันซับซ้อน. ;)

ไม่จริงมันเป็น

IRQL ย่อมาจาก "Interrupt Request Level" มันเป็นตัวเลขตั้งแต่ 0 ถึง 31 บนระบบ Windows x86 และ 0 ถึง 15 บนระบบ x64 มันแสดงถึง "ความสำคัญ" ของงานโหมดเคอร์เนลที่เกี่ยวข้องกับงานโหมดเคอร์เนลอื่น ๆ

IRQL เป็นสถานะที่กำหนดโดย Windows ของโปรเซสเซอร์ซึ่งไม่ใช่กระบวนการหรือเธรดซึ่งบ่งชี้ให้ Windows ทราบว่าสิ่งใดที่โปรเซสเซอร์กำลังทำอยู่สามารถถูกขัดจังหวะโดยงานอื่น ๆ หากงานใหม่ (เช่นรูทีนการบริการขัดจังหวะ) มี IRQL สูงกว่า IRQL ปัจจุบันของโปรเซสเซอร์แล้วใช่มันสามารถขัดจังหวะงานปัจจุบัน ไม่อย่างนั้น บนระบบมัลติโปรเซสเซอร์แต่ละโปรเซสเซอร์มี IRQL ของตัวเอง ซึ่งรวมถึง "ตัวประมวลผลเชิงตรรกะ" ที่สร้างโดยไฮเปอร์เธรด

(ฉันใช้คำว่า "ความสำคัญ" มากกว่า "ลำดับความสำคัญ" เพราะ "ลำดับความสำคัญ" ใน Windows หมายถึงลำดับความสำคัญของเธรดและ IRQL นั้นเป็นสิ่งที่แตกต่างจากลำดับความสำคัญของเธรดงานเคอร์เนลที่ IRQL เดียวกันไม่ได้ถูกแบ่งเวลา t อยู่ภายใต้การเพิ่มและการสลายอัตโนมัติ)

(ฉันควรจะพูดถึงว่าคำว่า "งานเคอร์เนล" ที่นี่ไม่เป็นทางการ Windows ไม่ได้เรียกสิ่งเหล่านี้ว่า "งานเคอร์เนล" พวกเขาจะไม่จัดการวัตถุเช่นกระบวนการและกระทู้และไม่มีความสัมพันธ์กับงาน x86 " ประตู "หรืออะไรก็ตามที่แสดงใน" ตัวจัดการงาน "ในขณะที่ฉัน (และคนอื่น ๆ ) ใช้คำศัพท์ที่นี่" งานโหมดเคอร์เนล "จริง ๆ " อะไรก็ตามที่มีจุดเริ่มต้นและจุดสิ้นสุดที่กำหนดซึ่งจะต้องทำในโหมดเคอร์เนล "รูทีนการบริการขัดจังหวะเป็นตัวอย่างหนึ่งของ" งานโหมดเคอร์เนล "ดังนั้นเป็นงานประจำ DPC แต่อีกตัวอย่างหนึ่งสามารถเป็นรหัสในเธรดโหมดเคอร์เนลเธรดดังกล่าวเริ่มต้นที่ IRQL 0 แต่ถ้าเป็นส่วนหนึ่งของรหัสยกเป็น IRQL 2 หรือสูงกว่าทำอะไรแล้วกลับไปที่ IRQL ก่อนหน้าส่วน IRQL ที่สูงของรหัสเป็นตัวอย่างหนึ่งของสิ่งที่ฉันเรียกว่า "งานเคอร์เนล" ที่นี่ )

การตรวจสอบประสิทธิภาพจะแสดงเวลาที่ IRQL 2 เป็น "% DPC time" และเวลาที่ IRQL> 2 เป็น "% interrupt time" โดยไม่คำนึงว่าเวลาที่ใช้จริงใน DPC หรือ ISR หรือเป็นผลมาจากการเพิ่ม IRQL จาก ค่าที่ต่ำกว่า แต่ละชุดย่อยของสิ่งที่ PerfMon แสดงเป็น "เวลาที่มีสิทธิ์%" ซึ่งควรมีการระบุว่า "เวลาโหมดเคอร์เนล"

เมื่องานเคอร์เนลเริ่มต้นที่ IRQL 2 ขึ้นไปมันจะทำงานให้เสร็จก่อนสิ่งอื่นใดที่เหมือนกัน IRQLจะเริ่มทำงานบนโปรเซสเซอร์เดียวกัน มันอาจถูกขัดจังหวะโดยงาน IRQL ที่สูงขึ้น (ซึ่งอาจถูกขัดจังหวะโดยงาน IRQL ที่สูงกว่า ฯลฯ ) แต่เมื่องาน IRQL ที่สูงขึ้นเสร็จสมบูรณ์การควบคุมจะส่งกลับไปยังงานที่ขัดจังหวะ

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

ตัวอย่างเช่นข้อมูลจำนวนมากในเคอร์เนล Windows โดยเฉพาะข้อมูลการจัดการหน่วยความจำและข้อมูลที่ใช้โดยตัวกำหนดเวลาเธรดคือ"อนุกรม"ที่ IRQL 2 นั่นหมายความว่างานใด ๆ ที่ต้องการแก้ไขข้อมูลดังกล่าวจะต้องทำงานที่ IRQL 2 เมื่อทำเช่นนั้น หากงาน IRQL ที่สูงกว่าพยายามเขียนข้อมูลดังกล่าวนั่นอาจทำให้เกิดความเสียหายเนื่องจากอาจขัดจังหวะงาน IRQL 2 ซึ่งอาจอยู่ในช่วงกลางของวงจรอ่าน - แก้ไข - เขียนในข้อมูลเดียวกันนั้น ดังนั้นงาน IRQL ที่สูงกว่าก็ไม่ได้รับอนุญาตให้ทำเช่นนั้น

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

IRQLs 2 ขึ้นไปใช้สำหรับงานเคอร์เนลที่ไม่ได้ถูกทริกเกอร์โดยการขัดจังหวะของฮาร์ดแวร์ แต่ในระหว่างที่การตั้งเวลาเธรดปกติ - รวมถึงการรอ - ไม่สามารถเกิดขึ้นได้ ดังนั้นเมื่อโปรเซสเซอร์อยู่ที่ IRQL 2 หรือสูงกว่าจะไม่มีสวิทช์บริบทของเธรดเกิดขึ้นในโปรเซสเซอร์นั้นจนกว่า IRQL จะลดลงต่ำกว่า 2

รหัสโหมดผู้ใช้อยู่เสมอที่ IRQL 0 รหัสโหมดเคอร์เนลสามารถเรียกใช้ที่ IRQL ใด ๆ จาก 0 ถึงสิ่งที่สูงสุด IRQL 1 เป็นกรณีพิเศษ มันเป็นโหมดเคอร์เนลเท่านั้น แต่ไม่มีผลกระทบต่อการกำหนดเวลาและเป็นสถานะของเธรดมากกว่าตัวประมวลผล - มันจะถูกบันทึกและกู้คืนในระหว่างการสลับบริบทเธรด

เพื่อรักษาการรับประกันการทำให้เป็นอนุกรมต่างๆข้อยกเว้นส่วนใหญ่ (สิ่งต่าง ๆ เช่นหารด้วยศูนย์หรือการละเมิดการเข้าถึงหน่วยความจำเช่นความผิดพลาดหน้า) นั้นไม่สามารถจัดการได้ที่ IRQL 2 หรือสูงกว่า (IRQL 2 btw โดยทั่วไปเรียกว่า "ระดับการแจกจ่าย" หรือ "ระดับ DPC")

และในที่สุดเราก็สามารถอธิบายรหัสข้อผิดพลาดนี้ได้!

กรณีที่พบบ่อยที่สุดของ IRQL_NOT_LESS_OR_EQUAL เกิดจากความผิดพลาดของหน้า (พยายามเข้าถึงที่อยู่เสมือน "ไม่อาศัย") หรือการละเมิดการเข้าถึงหน่วยความจำ (พยายามเขียนไปยังหน้าอ่านอย่างเดียวหรือเข้าถึงหน้าเว็บที่ไม่ได้กำหนดไว้ เลย) ที่เกิดขึ้นที่ IRQL 2 หรือสูงกว่า

หากมีการยกข้อยกเว้นดังกล่าวที่ IRQL 0 หรือ 1 พวกเขาสามารถ "จัดการ" โดยรหัสที่มาจากระบบ (เช่นตัวจัดการข้อบกพร่องของหน้า) หรือโดยตัวจัดการข้อยกเว้นที่ได้รับจากนักพัฒนา อย่างไรก็ตามข้อยกเว้นส่วนใหญ่ไม่สามารถจัดการได้เลยหากเกิดขึ้นที่ IRQL 2 หรือสูงกว่า

ดังนั้น ... รหัส bugcheck หมายถึง "ข้อยกเว้นประเภทที่สามารถจัดการได้ที่ IRQL 0 หรือ 1 เกิดขึ้นเมื่อ IRQL อยู่ที่ 2 หรือสูงกว่า" คือ "ไม่น้อยกว่าหรือเท่ากับ 1" ใช้ถ้อยคำแปลก ๆ แต่ก็มีอยู่

มีสิ่งอื่น ๆ อีกเล็กน้อยที่สามารถกระตุ้นการตรวจสอบจุดบกพร่องนี้และค่าที่ IRQL นั้นไม่น้อยกว่าหรือเท่ากับไม่เสมอไป 1 แต่มันเกิดขึ้นเพียงเล็กน้อยเท่านั้น เอกสารประกอบ WinDBG แสดงรายการไว้


คำตอบที่ยอดเยี่ยม คุณรู้จักสิ่งที่รู้จักกันดีที่ทำงานที่ IRQL มากกว่า 2 หรือไม่?
Scott Chamberlain

1
อาจเป็นไดรเวอร์อุปกรณ์
LawrenceC

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