מהי IRQL (רמת בקשת פסיקה) ב-Windows וכיצד היא קשורה ל-BSODs?

העדכון אחרון: 01/10/2025
מחבר: יצחק
  • IRQL מגדיר עדיפויות ביצוע ומסוות פסיקות לפי רמה, מעל DISPATCH הוא מצווה על ה-IRQL, לא על עדיפות ה-thread.
  • ل BSOD 0xA/0xD1 נגרמים בדרך כלל כתוצאה מגישה לזיכרון הניתן לדף או זיכרון לא חוקי ב-IRQL גבוה וכתובות או קוד הניתן לדף שגויים.
  • WinDbg ו-Driver Verifier הם המפתח: השתמשו ב-!analyze, !irql, ln, .trap, !pool, !address ובדקו את הפרמטרים 1, 3 ו-4.
  • En נהגים, מונע תקלות עמוד ב-IRQL גבוה, משתמש בזיכרון שאינו מדופף ובנעילות ספין; עבור המשתמש, מעדכן/בודד מנהלי התקנים בעייתיים.

Irq

אם אי פעם ראיתם מסך כחול עם הודעות כמו IRQL_NOT_LESS_OR_EQUAL o DRIVER_IRQL_NOT_LESS_OR_EQUAL, כנראה שנתקלתם במושג שפחות מוכר מחוץ לעולם הדרייברים: IRQL (רמת בקשת פסיקה). ב... Windows, רמת עדיפות פסיקה זו מקבלת עדיפות על עדיפות הליך כאשר המערכת נמצאת מעל סף מסוים, ויש לכך השלכות ישירות על היציבות.

בשורות הבאות תמצאו אונה מדריך שלם ובספרדית מספרד על מהו IRQL, איך הוא עובד, מדוע זה גורם למסכים כחולים, כיצד לאבחן את הבעיה עם WinDbg, ומה לעשות בין אם אתה משתמש שחווה את השגיאה או מפתח מנהלי התקנים במצב ליבה. בואו ניגש לעניין.

מהי IRQL (רמת בקשת פסיקה) ב-Windows?

ב- Windows, ה- IRQL מגדיר את העדיפות של חומרה שבו פועל מעבד בכל זמן נתון. בתוך מודל מנהל ההתקן של Windows (WDM), קוד הפועל ב-IRQL נמוך יכול להיות מופרע על ידי קוד הפועל ב-IRQL גבוה יותר. למעשה, במחשב מרובה ליבות יחיד, כל מעבד יכול להיות ב-IRQL שונה, מה שמסבך את הסנכרון.

יש כלל אחד מרכזי: כאשר מעבד פועל ב-IRQL מעל PASSIVE_LEVEL, ניתן להקדים אותו רק על ידי פעילות ב-IRQL גבוה אף יותר.זה מארגן את הדו-קיום בין קוד משתמש, פונקציות ליבה, קוראים נדחים (DPCs) ושגרות שירות פסיקות של התקן (ISRs).

שגיאה 0x0000000A
Artaculo relacionado:
שגיאה 0x0000000a (מסך מוות כחול). 6 פתרונות

רמות וסדרי עדיפויות: PASSIVE_LEVEL, APC_LEVEL, DISPATCH_LEVEL ו-DIRQL

באופן כללי, ב-x86, נעשה שימוש בערכי IRQL בין 0 ל-31; ב-x64, בין 0 ל-15המשמעות המעשית זהה: IRQL 0 (PASSIVE_LEVEL) הוא המקום שבו מבוצעים קוד משתמש רגיל ופונקציות רבות של מנהלי התקנים; תקלות APC ודף הם בדרך כלל ממופים ל-IRQL 1 (APC_LEVEL); IRQL 2 (DISPATCH_LEVEL) כולל את מתזמן השלבים ואת ה-DPCs. מעל DISPATCH_LEVEL ישנן רמות השמורות לפסיקות התקן (הידועות בשם DIRQL) ולשימושים פנימיים אחרים כגון HIGH_LEVEL.

במערכת האקולוגית של הנהגים, שגרות נפוצות רבות פועלות ב-DISPATCH_LEVELלדוגמה, DPC ו-StartIo. עיצוב זה מבטיח שבעוד שאחד מהם נוגע בתורים פנימיים או במשאבים משותפים אחרים, שגרה אחרת באותה רמה לא תבצע פסיקה מקדימה על אותו מעבד, מכיוון שכלל הפסיקה מאפשר פסיקות רק ברמות גבוהות יותר.

בין DISPATCH_LEVEL לרמות הפרופילינג/הגבוהות יש מקום ל- פסיקות חומרה של כל התקן (DIRQL)IRQL של ​​התקן מגדיר את העדיפות שלו על פני התקנים אחרים. מנהל התקן WDM משיג IRQL זה במהלך IRP_MJ_PNP עם IRP_MN_START_DEVICE. IRQL ההתקן אינו ערך קבוע וכללי, אלא הערך המשויך לקו פסיקה ספציפי.

IRQL לעומת עדיפות שרשור

מומלץ לא לבלבל בין מושגים: עדיפות השרשור קובעת מתי המתזמן מפסיק לבצע את הפעולה ואיזה שרשור מבוצע.; ה-IRQL שולט באיזה סוג פעילות ניתן לבצע ואילו פסיקות מוסתרות. מעל DISPATCH_LEVEL, אין החלפת רצף: ה-IRQL הוא ששולט, לא עדיפות הרצף.

  מדריך לצפייה וניהול של סיסמאות שנשמרו ב-Microsoft Edge

IRQL ו-Paging: מה שאסור לעשות

השפעה מיידית של העלאת IRQL היא שהמערכת לא יכול לטפל בשגיאות עמודכלל הזהב: קוד הפועל ב-DISPATCH_LEVEL ומעלה אינו יכול לגרום לתקלות בדף. בפועל, משמעות הדבר היא שהרוטינות הללו והנתונים שהן נוגעות בהם חייב להימצא בזיכרון שאינו מדופףבנוסף, תוכנות עזר ליבה מסוימות מגבילות את השימוש בהן בהתבסס על IRQL: לדוגמה, KeWaitForSingleObject ניתן לקרוא ל-DISPATCH_LEVEL רק אם אינך חוסם (אפס פסק זמן), ועבור פסק זמן שאינו אפס, עליך להיות מתחת ל-DISPATCH_LEVEL.

שליטה מרומזת ומפורשת על IRQL

רוב הזמן, המערכת עצמה מפעילה את השגרה שלך ב-IRQL הנכון למה שהם צריכים לעשות. שגרות שיגור עבור IRPs פועלות ב-PASSIVE_LEVEL (הן יכולות לחסום או לקרוא לכל עוזר), StartIo ו-DPC פועלים ב-DISPATCH_LEVEL כדי להגן על תורים משותפים, ו-ISRs פועלים ב-DIRQL.

אם אתה צריך לשלוט בזה באופן מפורש, ניתן להעלות ולהוריד את ה-IRQL באמצעות KeRaiseIrql y KeLowerIrqlיש קיצור דרך נפוץ מאוד: KeRaiseIrqlToDpcLevel() מחזירה את ה-IRQL הקודם ומשאירה אותך ב-DISPATCH_LEVEL. חשוב: לעולם אל תוריד את ה-IRQL מתחת לערך שהיה בו כשהמערכת קראה לך; שבירת הסנכרון הזה עלולה לפתוח חלונות מרוץ רציניים מאוד.

שגיאות מסך כחול הקשורות ל-IRQL: IRQL_NOT_LESS_OR_EQUAL ו- DRIVER_IRQL_NOT_LESS_OR_EQUAL

אירקל

שתי בדיקות באגים קלאסיות הקשורות לבעיות אלו הן IRQL_NOT_LESS_OR_EQUAL (0xA) y מנהל התקן IRQL לא פחות או שווה (0xD1)שניהם מצביעים על ניסיון גישה לכתובת ניתנת לעמוד (או לא חוקית) ב-IRQL גבוה מדי. זה בדרך כלל נובע משימוש בכתובות שגויות של דרייברים, הסרת הפניות ממצביעים שגויים, או ביצוע קוד ניתן לעמוד ברמות לא מתאימות.

במקרה הספציפי של מנהל התקן IRQL_NOT_LESS_OR_EQUAL (0x000000D1), הפרמטרים אינפורמטיביים מאוד: 1) כתובת הזיכרון שאליה הפנתה; 2) IRQL באותו זמן; 3) סוג גישה (0 קריאה, 1 כתיבה, 2/8 ביצוע); 4) כתובת ההוראה שהפנתה לזיכרון. בעזרת ניפוי הבאגים ניתן להשתמש ln על פרמטר 4 עבור רשום את הסמל הקרוב ביותר ודעת איזו פונקציה פעלה.

סיבות נפוצות שכדאי לזכור

מעבר לקוד הספציפי, ישנם דפוסים שחוזרים על עצמם. ביטול הפניה של מצביע לא חוקי ל-DISPATCH_LEVEL או גבוה יותר זהו מתכון בטוח לאסון. גישה לנתונים ניתנים לעמוד ברמה זו, או הרצת קוד ניתן לעמוד (למשל, פונקציה המסומנת כניתנת לעמוד), גם מפעילה את בדיקת הבאגים.

מקרים נפוצים אחרים כוללים קריאה לפונקציה בדרייבר אחר שכבר הורד (מצביע פונקציה תלוי), או מופעל בעקיפין באמצעות מצביע פונקציה לא חוקי. לעתים קרובות, אם המערכת מצליחה לזהות מודול, תראו את שמו על המסך הכחול עצמו, והוא גם נשמר ב KiBugCheckDriver, נגיש עם dx KiBugCheckDriver מ-WinDbg.

פרט מעשי: ברוב ה-D1/A, הבעיה האמיתית אינה ה-IRQL עצמו, אלא כתובת הזיכרון שאליה מתייחסים. זו הסיבה שפרמטרים 1, 3 ו-4 הם קריטיים למיקוד האבחון.

אבחון עם WinDbg: פקודות שימושיות וקריאת פרמטרים

כדי לעבוד על מקרים אלה, WinDbg הוא הכלי המרכזי, ואם ה-BSOD מזכיר ntoskrnl.exe מידע זה מספק הרבה הנחיות לגבי האם התקלה היא בתת-מערכת הליבה. התחל על ידי !analyze -v כדי לקבל סיכום של בדיקת הבאגים, המחסנית, ואם יתמזל מזלכם, המודול המעורב. אם קובץ ה-dump כולל מסגרת לכידה, .trap שם אותך בהקשר של המעבד הכושל.

ل פקוד של ערימה כמו k, kb, kc, kd, kp, kP, kv הם מראים לך רמות שונות של פירוט מעקב לאחור. עם ln על פרמטר 4 ניתן לדלג להוראה שהפנתה לזיכרון ולקבל את הסמל הסמוך. ואם אתם חושדים שרמת העדיפות פועלת לפני ההפרעה, !irql מראה לך את IRQL השמור עבור מעבד היעד (למשל DISPATCH_LEVEL).

  ענקיות הטכנולוגיה הסיניות אוגרות שבבי Nvidia H20 על רקע ההגבלות של ארה"ב

כדי לנתח את כיוון פרמטר 1, !pool זה יגיד לך אם זה שייך למאגר מדופם; !address y !pte להתעמק במיפוי הזיכרון של אזור זה. אתה יכול להשתמש פקודות תצוגת הזיכרון כדי לבדוק את התוכן שניסו לגשת אליו. לבסוף, u, ub, uu מאפשרים לך לפרק סביב הכתובת של פרמטר 4.

אל תשכח lm t n לרשימת מודולים טעונים y !memusage עבור המצב הכללי של הזיכרון. אם KiBugCheckDriver יש בו משהו, dx KiBugCheckDriver זה יחזיר את שם מודול יוניקוד: בדוגמה טיפוסית, "Wdf01000.sys" נצפה כמנהל ההתקן המעורב במהלך בדיקת הבאגים.

כלי מערכת: אימות מנהלי התקנים, מציג אירועים ואבחון

El אימות נהגים בוחן את התנהגות הדרייברים בזמן אמת וכופה שגיאות כאשר הוא מזהה שימוש שגוי במשאבים (כגון המאגר), תוך יצירת חריג כדי לבודד את האזור הבעייתי בקוד. הוא מופעל עם verifier מן שורת הפקודה ומומלץ לבחור את סט הדרייברים הקטן ביותר האפשרי כדי להימנע מהוספת תקורה רבה מדי.

אם אינך רואה את עצמך עם WinDbg, ליישם אמצעים בסיסייםבדוק את יומן המערכת במציג האירועים עבור שגיאות המצביעות על התקן/מנהל התקן ספציפי; עדכן או השבת את מנהל ההתקן המצוין על ידי המסך הכחול; ודא תאימות חומרה לגרסת Windows שלך; והשתמש באבחון זיכרון של Windows אם אתה חושד ב-RAM. פעולות אלה, למרות שהן פשוטות, הם פותרים מספר רב של מקרים.

מקרים מהחיים האמיתיים: כאשר הודעות BSOD נראות אקראיות

משתמש עם Windows 10 Pro (מעבד AMD Ryzen 5 3400G, GPU NVIDIA GeForce GTX 1660 Ti ולוח WIFI של ג'יגה-בייט B450 AORUS PRO, 16 ג'יגה-בייט של זיכרון RAM) חווה מסכי "IRQL_LESS_OR_NOT_EQUAL" לסירוגין. כבר עדכנתי מנהלי התקנים חיוניים (רשת, כרטיס מסך), התקנתי את כל עדכוני Windows והפעלתי את כלי הזיכרון, והכל מבלי לזהות בעיות.

בתרחישים כאלה, השלב הבא הוא ניתוח קבצי dump באמצעות WinDbg ולחפש דפוסים: תהליכים המעורבים כאשר הוא נופל (לדוגמה, explorer.exe), מודולי ממשק גרפי (win32kfull.sys) ופונקציות כגון xxxProcessNotifyWinEvent מופיעים במחסנית. למרות שמודול זה הוא Windows, הגורם המפעיל הוא לעתים קרובות מנהל התקן של צד שלישי (גרפיקה, קלט, שכבת כיסוי, כרטיסי לכידה) המשתמש בזיכרון ב-IRQL לא מתאים והתקלה מתעוררת בתוך win32k.

ההמלצה המעשית כאן היא השבתה זמנית של תוכנת שכבת-על (לכידה, תצוגת מסך של GPU), מנהלי התקנים היקפיים תוכניים אגרסיביים (עכברים/מקלדות עם פקודות מאקרו), וגרסאות בטא של מנהלי התקנים גרפיים, ולצמצם את האפשרויות. שימוש ב-Driver Verifier על מערכות חשודות יכול לעזור לצמצם את הבעיה בעזרת מחסנית ברורה יותר.

דפוס רשת נפוץ מאוד: ndis.sys אינו תמיד האשם

מקרה טיפוסי נוסף: צילום מסך עם ndis.sys (שכבת הרשת של Windows). במחשב אמיתי, המערכת הייתה קורסת מיד עם ההפעלה. הפתרון המעשי היה לאתחל לתוך מצב בטוח ללא פונקציות רשת, פתח את מנהל ההתקנים ולהשבית מתאמים תחת "מתאמי רשת" כדי לבודד את הבעיה.

בצוות הזה היה בקר Realtek PCIe GBE Family ו-Atheros AR5007Gעל ידי ביטול שניהם, התגלה שהסיבה האמיתית הייתה ה- athrx.sys (את'רוס), למרות שהמסך הכחול שהוזכר ndis.sysהמזבלה אישרה זאת: הערימה עברה דרכה ndis!NdisFreeTimerObject אבל המודול האשם היה athrx.sysהתיקון הסופי היה הסר את ההתקנה של המכשיר והתקן מנהלי התקנים רשמיים מעודכנים מאתר האינטרנט של יצרן Atheros. מוסר השכל: המודול המצוטט ב-BSOD עשוי להיות חלק מתת-המערכת המושפעת, לא המקור.

  מדריך שלם לשליטה ב-Winaero Tweaker והתאמה אישית של Windows עד הסוף

תגובת תמיכה אופיינית וצעדים מהירים למשתמשים

בחילופי תמיכה אמיתיים, השיב טכנאי: "אני מצטער על אי הנוחות. ייתכן שמדובר בבעיה במנהל התקן, בזיכרון או באנטי-וירוס. אנא עדכן את מנהלי ההתקן שלך, ואם זה נמשך, הפעל את אבחון הזיכרון."זוהי עצה בסיסית אך תקפה; עם זאת, אם השגיאות נמשכות, מומלץ להמשיך הלאה עם Verifier וניתוח dump.

עבור משתמשים שאינם טכניים, פרוטוקול סביר יהיה: 1) בדיקת אירועי מערכת, 2) עדכון מנהלי התקנים מרכזיים (ערכת שבבים/רשת/כרטיס מסך), 3) בדיקת זיכרון RAM בעזרת הכלי המשולב, 4) בדיקה אתחול ניקוי ללא תוכנה של צד שלישי שמכניסה ווים לגרעין/ממשק משתמש גרפי, ו-5) שימוש ב-Verifier על מנהלי התקנים של צד שלישי אם שום דבר לא ברור.

שיטות עבודה מומלצות למפתחי מנהלי התקנים

אם אתם מתפתחים ונתקלתם ב-D1/A, בדקו ש- שגרת הריצה אינה מסומנת כניתנת לדף אין לקרוא לפונקציות paging בזמן שהן פועלות ב-DISPATCH_LEVEL ומעלה. זה כולל הימנעות מהפניות לנתונים במקטעים paged וכיבוד מגבלות IRQL עבור עוזרי ליבה המתוארים ב-DDK.

כדי לסנכרן נתונים משותפים, יש להחיל את הכלל "גישה תמיד לנתונים משותפים באותה IRQL גבוהה" ולהשתמש בנעילות ספין כאשר מתאים. במעבדים מרובי מעבדים, IRQL לבדו אינו מבטיח אי הכללה בין מעבדים שונים; נעילות ספין מעלות את ה-IRQL (ל-DISPATCH_LEVEL) ומתאמות גישה בין ליבות. אם עליך לפעול על אוגרי חומרה רגישים, KeSynchronizeExecution עוזר לך לבצע מקטעים קריטיים ב-DIRQL הנכון.

כאשר התוכנית דורשת העלאת IRQL, ארה"ב KeRaiseIrqlToDpcLevel עבור DISPATCH_LEVEL או KeRaiseIrql בקפידה, שמירת ה-IRQL הקודם ושחזורו בדיוק עם KeLowerIrqlלרדת מתחת ל-IRQL הקלט, אפילו רק לרגע, זוהי שגיאת סינכרון חמורה.

קשר עם פסיקות וחומרה

IRQL הוא המנגנון שבאמצעותו Windows פקודות משבשות סדרי עדיפויות ומשימות פנימיות מסוימותברמה האדריכלית, זה קשור למושגים כמו "פסיקה", "מטפל פסיקות" או "רמת עדיפות פסיקות" ובפלטפורמות קלאסיות, עם ה- בקר פסיקה מתוכנת (PIC)במערכות אחרות, בקרת עדיפויות מתבטאת באמצעות מנגנונים כגון SPL en יוניקסהרעיון הכללי זהה: מי יכול להפריע למי.

טיפים מתקדמים לניפוי באגים

במחסומי אחסון שבהם המחסנית מצביעה אל win32kfull!xxxProcessNotifyWinEvent עם בדיקת באגים 0xA/0xD1, בדיקת הקשר עם .process y .thread (אם קיים), התבונן בתהליכים כמו explorer.exe en !process 0 1 ולבדוק שכבות ומנהלי התקנים של אינטראקציה עם ממשק משתמש גרפי. פעמים רבות הבעיה זהו זיכרון פגום על ידי צד שלישי שצץ במסלול הזה..

אל תשכחו לבדוק את ה-IRQL עם !irql, וניגודיות: אם אתה ב-DISPATCH_LEVEL (2) ופרמטר 3 מציין קריאה/כתיבה/ביצוע בדף שניתן לדפדף בו, כבר יש לך רמז מדוע הוא נפל. סמן את הרמז הזה עם ln בפרמטר 4 כדי לקבל את הפונקציה הספציפית.

להבין מהו ה-IRQL? והאופן שבו הוא משתלב בביצוע הגרעין עוזר להפריד רעש מאותות. אם אתה משתמש, התמקד ב דרייברים וחומרה (עם Verifier, אירועים ובדיקות כברירת מחדל). אם אתם מפתחים, יש להקפיד על הכללים עבור IRQL, זיכרון שאינו מדפיס וסנכרון עם נעילות ספין. בעזרת הכלים הנכונים (WinDbg, Verifier) ​​וקריאה מדוקדקת של פרמטרים (1, 3 ו-4), בדיקות הבאגים הללו כבר אינן בגדר תעלומה והן הופכות לבעיות שניתן לטפל בהן באופן שיטתי.