Магістр ДонНТУ Барінов Сергій Сергійович

Барінов Сергій Сергійович

Факультет: Комп'ютерні науки і технології
Кафедра: Комп'ютерна інженерія
Спеціальність: Системне програмування
Тема випускної роботи: Розробка та дослідження засобів налагодження режиму ядра операційної системи Microsoft Windows
Керівник: професор, д.т.н. Святний Володимир Андрійович
Консультант: старший викладач Шевченко Ольга Георгіївна

Реферат випускної роботи магістра
«Розробка та дослідження засобів налагодження режиму ядра
операційної системи Microsoft Windows»

Актуальність роботи

Налагодження — це процес визначення й усунення причин помилок у програмному забезпеченні. У деяких проектах налагодження займає до 50 % загального часу розробки. Багато фахівців уважають налагодження найважчим аспектом програмування [1].

Починаючи з впровадження великих електронних обчислювальних машин (зокрема, під час впровадження ЄС ЕОМ)  і по цей час засобам для підготовки й налагодження програм не приділялася достатня увага, більше того, найчастіше не припускалася сама можливість виникнення помилки, що ставило програмістів у жорсткі умови. У результаті це приводило до дуже неефективного використання комп'ютера. На даний момент налагодження є невід'ємною частиною циклу розробки програмного забезпечення.

Налагодження може бути значно спрощене при використанні спеціалізованих інструментів, які постійно удосконалюються. Основним таким інструментом є налогоджувач, що дозволяє контролювати виконання ПО, спостерігати за його ходом і втручатися в нього.

Інструментарій розробки прикладного програмного забезпечення пропонує програмісту широкий спектр можливостей. Будь-яке інтегроване середовище розробки містить у собі й можливість налагодження без необхідності використання сторонніх утиліт. Якщо ж мова йде про системне програмне забезпечення й розробку драйверів зокрема, то в силу його специфіки процес розробки надзвичайно ускладнений і мало автоматизований. Усі фази розробки, у числі яких і налагодження, є роздільними. Для проведення кожної з них потрібні особливі умови: написання програмного коду виконується на повноцінній комп'ютерній системі, налагодження — на налагоджувальній системі, тестування — залежно від обставин і т.д. Сам же налагоджувач режиму ядра більш складний в освоєнні й, відповідно, менш дружній.

У цілому можна говорити про нестачу засобів налагодження ядра. Хоча такі засоби є в наявності, найчастіше говорити про альтернативи не доводиться. Багато програмістів говорять про перший негативний досвід при знайомстві з налагоджувачами режиму ядра.

Аналіз проблеми

Багато сучасних архітектур центральних процесорів, таких як Intel x86 та її розширення, надають захисний механізм, що оперує на рівні сегментів і сторінок пам'яті. Цей механізм надає можливість апаратного обмеження доступу до певних сегментів або сторінок на основі рівня привілеїв. Це дозволяє операційній системі захищати свій критичний код і дані, розміщуючи їх у більш привілейованих порівняно з кодом додатків сегментах. Захисний механізм процесорів сімейства Intel x86 оперує чотирма рівнями привілеїв, називаних також кільцями (рис. 1). Процесор використовує рівні привілеїв для запобігання доступу програмного коду з меншим рівнем привілеїв до сегмента пам'яті з більшим рівнем неконтрольованим способом [2].

Рівні привілеїв процесора сімейства Intel x86

Рисунок 1. Рівні привілеїв процесора сімейства Intel x86

Для запобігання доступу додатків до критично важливих системних даних і даних інших додатків операційна система Microsoft Windows спирається на захисний механізм процесора. Вона використовує тільки два рівні привілеїв, іменуючи нижчий рівень режимом користувача, а вищий — режимом ядра. Виконуваний код додатків працює в режимі користувача, тоді як код операційної системи — у режимі ядра. У режимі ядра надається доступ до всього простору оперативної пам'яті й дозволяється виконання будь-яких машинних команд процесора. Тоді як програмний код режиму користувача змушений звертатися до сервісів операційної системи для виконання всіх критичний операцій.

Операційна система Microsoft Windows є багатозадачною, і завдяки режиму сегментації процесора кожній задачі (процесу) надається власний лінійний адресний простір віртуальної пам'яті розміром 2 ГБ. Та сама віртуальна адреса проецюється для кожного процесу в різні фізичні адреси, тому процес не в змозі ушкодити простір пам'яті іншого процесу випадково або навмисно. У той же час простір пам'яті, використовуваний операційною системою, розділяється всіма процесами (але доступ до нього має тільки програмний код, що виконується в режимі ядра) (рис. 2).

Структура віртуального адресного простору

Рисунок 2. Структура віртуального адресного простору

Виходячи зі структури віртуального адресного простору, якщо в додатку допущена помилка, внаслідок якої додаток виконає запис даних у довільне місце пам'яті, то додаток ушкодить тільки власну пам'ять і не вплине на роботу інших додатків і операційної системи. Тоді як програмний код режиму ядра в змозі пошкодити важливі структури даних операційної системи, що неминуче приведе до загального збою.

У режимі ядра операційної системи Windows функціонують: рівень апаратних абстракцій, власне ядро, підсистеми ядра, що реалізують керування пам'яттю, живленням, плануванням процесорного часу і т.д., а також драйвери пристроїв. Як правило, усі складові, крім драйверів, входять до складу операційної системи: їх самостійна розробка пов’язана з великими труднощами. В свою чергу драйвери пристроїв реалізують інтерфейс між обладнанням і підсистемами ядра. Внаслідок різноманіття виробленого у світі обладнання практично для кожної моделі того або іншого пристрою, що підключається до портів комп'ютера, потрібен власний драйвер. Тому засоби налагодження ядра переважно використовуються саме розробниками драйверів [3].

Мета та завдання роботи

Кінцевою метою роботи є створення власного налагоджувача режиму ядра, який повинен спростити процес налагодження, знизивши поріг входження. Для цього розроблюваний налагоджувач повинен мати сучасний дружній графічний інтерфейс користувача. На даний момент таким вимогам до побудови інтерфейсу більше за все відповідає графічна підсистема Windows Presentation Foundation (WPF), яка входить до Microsoft .NET Framework починаючи з версії 3.0.

    Таким чином, для створення налагоджувача необхідна реалізація наступних завдань:
  • аналіз складостей налагодження режиму ядра;
  • аналіз існуючих рішень;
  • вивчення апаратних налагоджувальних механізмів архітектури процесорів Intel x86;
  • дослідження налагоджувальних механізмів, надаваних ядром ОС Windows;
  • дослідження функціональних особливостей налагоджувача Windows Debugger;
  • вивчення специфікації модулів розширення Windows Debugger;
  • розробка системного програмного забезпечення налагоджування;
  • розробка прикладного програмного забезпечення налагоджування.

Огляд досліджень і розробок

Основні засоби налагодження режиму ядра надаються самим виробником операційної системи Windows у рамках вільно розповсюджуваного пакета «Debugging Tools for Windows». Засоби включають графічний і консольний налагоджувачі Windbg і KD відповідно (далі Windows Debugger). Робота цих налагоджувачів спирається на механізми, передбачені розробниками операційної системи й закладені в її ядрі [4].

Основним режимом для Windows Debugger є режим інтерпретатора команд. Завдяки модульній структурі, поряд з командами, що поставляються розробниками, Windows Debugger підтримує сторонні модулі, які називаються розширеннями. У дійсності більшість вбудованих команд також оформлена у вигляді розширень.

Windows Debugger орієнтований на віддалене інтерактивне й аварійне налагодження, при використанні яких розкриваються всі його можливості. У цей же час повноцінне локальне інтерактивне налагодження не підтримується: налагоджувач дозволяє тільки переглядати деякі структури ядра.

Існує модуль розширення для Windows Debugger за назвою LiveKD, створений Марком Руссіновичем, який у деякому розумінні реалізує локальне інтерактивне налагодження. LiveKD на ходу створює дамп пам'яті робочої системи й використовує його для налагодження [5].

Налагоджувач Windows Debugger використовує налагоджувальне ядро Microsoft Debugger Engine, яке надає можливість маніпулювати налагоджуваною системою [6]. У спілці Microsoft CodePlex розміщений проект керованої бібліотеки для взаємодії з Microsoft Debugger Engine API [7]. Його автором є Nicolae Mogoreanu. У межах проекту надається два набори класів: першим буде легко користуватися людям, знайомим з Debugger Engine API, другий більше відповідає стилю .NET. Бібліотека дає можливість витягувати інформацію з дампів пам'яті та з пам'яті виконуваного додатка. Проте цей проект не дозволяє виконувати налагодження режима ядра, оскільки орієнтований на налагодження додатків режиму користувача.

Пакет інструментів «Debugging Tools for Windows» регулярно оновлюється й підтримує всі сучасні операційний системи Windows.

Налагоджувач ядра SoftICE, що випускався компанією Compuware у пакеті програм DriverStudio, традиційно виступав альтернативою пакету «Debugging Tools for Windows». Характерною рисою SoftICE була реалізація локального інтерактивного налагодження на підтримуваному апаратному забезпеченні. Налагоджувач практично повністю міг контролювати роботу операційної системи.

З 3 квітня 2006 року продаж продуктів сімейства «DriverStudio» було припинена через «безліч технічних і ділових проблем, а також загального стану ринку». Останньою версією операційної системи, підтримка якої була реалізована, є Windows XP Service Pack 2. Як правило, пакети сервісних оновлень не змінюють прикладний інтерфейс операційної системи, але номера системних викликів і інша недокументована інформація може зазнавати змін. Налагоджувач SoftICE спирався на жорстко прописані адреси внутрішніх структур даних. Як наслідок — з виходом Service Pack 3 сумісність була порушена. Очевидно, що більш пізні версії операційної системи Windows також не підтримуються.

Syser Kernel Debugger створений невеликою китайською компанією Sysersoft як заміна налагоджувача SoftICE. Перша фінальна версія була випущена в 2007 році. Як і SoftICE, Syser Kernel Debugger здатний виконувати інтерактивне налагодження на працюючій системі. Підтримуваними є тільки 32-розрядні редакції сучасних версій Windows [8].

Компанія Breakpoints Live спеціалізується на рішеннях в області налагодження додатків, як режиму користувача, так і режиму ядра. Інтерактивний налагоджувач DebugLive Debugger, який компанія пропонує, має веб-орієнтований дружній інтерфейс, який повинен знизити поріг входження та полегшити процес налагодження [9]. Налагоджувач не реалізує власний налагоджувальний стек, а використовує налагоджувальне ядро Microsoft Debugger Engine.

Дмитро Востоков, сертифікований технічний спеціаліст Microsoft, з 2003 року працюючий у компанії Citrix, давно займається дослідженнями особливостей налагодження режиму ядра та є автором декількох книг за цією тематикою [10].

На даний момент Windows Debugger є основним інструментом серед розроблювачів модулів ядра. Його також використовує команда розроблювачів ядра операційної системи Windows.

Як показав пошук, в Україні практично немає дослідників, які займаються питаннями налагодження ядра операційної системи Windows. Що до Донецького національного технічного університету, ряд авторів у своїх статтях торкались тем, пов'язаних з режимом ядра.

Отримані результати

Робота налагоджувача Windows Debugger спирається на бібліотеки динамічного компонування DbgEng.dll, яка являє собою налагоджувальне ядро (debugging engine) операційної системи та надає можливість маніпулювати налагоджувальною системою (рис. 3). У свою чергу, налагоджувальне ядро використовує допоміжну налагоджувальну бібліотеку DbgHelp.dll. Обидві бібліотеки включені у склад сучасних версій операційної системи Windows.

Призупинення роботи налагоджувальної системи

Рисунок 3. Призупинення роботи налагоджувальної системи
(анімація, 8 кадрів, 6 повторень, 18 кБ)

Взаємодія з налагоджувальним ядром здійснюється завдяки COM-технології (Component Object Model). Для роботи з налагоджувальним середовищем з керованого коду необхідна відповідна збірка, яка інкапсулює роботи з COM-об’єктами у відповідності з описаним шаблоном і має назву збірка взаємодії. Компанія Microsoft не поставляє збірку взаємодії з налагоджувальним ядром Windows. Тому інтерфейси були описані вручну, хоча цей шлях є трудомістким та сприяє помилкам.

    Усі описані інтерфейси є внутрішніми для збірки та невидимі за її межами. Замість цього екземпляри COM-об’єктів, які реалізують ці інтерфейси, є закритими членами високорівневих класів та створюються усередині них. Це абстрагує програміста від питань COM-взаємодії та дозволяє зосередитися на використанні функціональних можливостей збірки. У загальному випадку, при описі високорівневих класів використовувалась наступна методика:
  • методи GetX і SetX замінювались на одну властивість, яка доступна для читання та запису;
  • методи, які мали різні імена по причині неможливості перевантаження, приводились до одного імені;
  • структури, які містили службову інформацію, наприклад, розмір рядка або кількість елементів масиву, замінювались спрощеними версіями, оскільки для керованого коду ця інформація є надлишковою;
  • при необхідності багаторазового виклику метода з індексом у ролі параметра для запиту списку елементів застосовувались колекції;
  • цілі числа без знаку по можливості замінювались числами зі знаком відповідно до стандартної системи типів (Common Type System), яка дає змогу використовувати збірку у керованих мовах, які не підтримують числа без знаків, таких як VB.NET;
  • інтерфейси зворотного виклику, призначені для повідомлення програми про зміни у налагоджувальному ядрі, реалізовувались закритими підкласами, котрі викликали відповідні обробники мовних подій;
  • імена методів узгоджувались з правилами йменування.

Висновок

    На даний момент у збірці взаємодії реалізовані наступні можливості:
  • підключення до віддаленої системи;
  • призупинення та відновлення роботи віддаленої системи за вимогою;
  • отримання повідомлень про події (зміна стану регістрів, пам’яті, виникнення виключень та переривань та інше);
  • перегляд та зміна усіх регістрів процесора (у тому числі і системних).

Створена збірка спрощує взаємодію з налагоджувальним ядром та виступає основою для побудови налагоджувача ядра з багатим графічним інтерфейсом. Окрім головного свого призначення, збірка може бути використана у скриптах оболонки Windows PowerShell, що дозволяє автоматизувати деякі операції налагодження.

Література

  1. Макконнелл С. Совершенный код. Мастер-класс / Пер. с англ. — М.: Издательский дом «Русская редакция»; СПб.: Питер, 2005. — 896 стр.: ил.
  2. Intel Corporation. Intel 64 and IA-32 Architectures Software Developer's Manual. Volume 3A: System Programming Guide, Part 1 [Електронний ресурс] — Електрон. дан. — 2007. — Режим доступу: http://developer.intel.com/design/processor/manuals/253668.pdf
  3. Руссинович М. и Соломон Д. Внутреннее устройство Microsoft Windows: Windows Server 2003, Windows XP и Windows 2000. Мастер класс. / Пер. с англ. — 4-е изд. — М.: Издательско-торговый дом «Русская редакция»; СПб.: Питер; 2005. — 992 стр.: ил.
  4. Microsoft Corporation. MSDN Library. Debugging Tools for Windows [Електронний ресурс] — Електрон. дан. — 2010. — Режим доступу: http://msdn.microsoft.com/en-us/library/ff551063(v=vs.85).aspx
  5. Mark Russinovich. Windows Sysinternals. LiveKd [Електронний ресурс] — Електрон. дан. — 2010. — Режим доступу: http://technet.microsoft.com/en-us/sysinternals/bb897415
  6. Microsoft Corporation. MSDN Library. Debugger Engine and Extension APIs [Електронний ресурс] — Електрон. дан. — 2010. — Режим доступу: http://msdn.microsoft.com/en-us/library/ff540525(v=vs.85).aspx
  7. Nicolae Mogoreanu. Managed Library for interacting with Debugger Tools for Windows Engine API [Електронний ресурс] — Електрон. дан. — 2010. — Режим доступу: http://mdbglib.codeplex.com
  8. SyserSoft. Syser Kernel Debugger [Електронний ресурс] — Електрон. дан. — 2011. — Режим доступу: http://www.sysersoft.com
  9. Breakpoints Live. Web based Debugging Software [Електронний ресурс] — Електрон. дан. — 2011. — Режим доступу: http://www.breakpoints.com
  10. Dmitry Vostokov. About [Електронний ресурс] — Електрон. дан. — 2011. — Режим доступу: http://www.dumpanalysis.org/blog/index.php/about