Лекція №15. Регістри системи налагодження програм. Виключення налагодження. Фіксація останнього переходу, переривання та виключення. Апаратура системи спостереження за продуктивністю.
Intel Architecture забезпечує розвинуті можливості для дебагування коду і моніторингу виконання коду та продуктивності процесора.
Дебагування підтримується через дебагові регістри (DB0 – DB7) і 2 модельно-залежних регістри(Model-Specific Registers). Дебагові регістри запам’ятовують адреси в пам”яті та розташування вводу/виводу, так звані точки переривань(breakpoints). Точки переривань вибираються користувачем в програмі, ділянці для запам’ятовування даних в пам’яті або певних портів вводу/виводу, в яких програміст бажає зупинити виконання програми і визначити стан процесора за допомогою спеціального програмного забезпечення дебагера. Виключення дебагування (#DB) генерується в тому випадку, коли пам’ять або доступ до вводу/виводу робиться по одній з адрес точок переривання. Точки переривання визначаються для специфічних типів доступу до пам’яті або до пристроїв вводу/виводу, таких як читання, запис.
Перелічу деякі можливості процесора, що підтримують дебагування і моніторинг продуктивності.
Debug exception (#DB) – передає керування процедурі дебагера.
Breakpoint exception (#BP) – передає керування процедурі дебагера, якщо виконується інструкція INT 3.
Breakpoint-address registers (DB0 through DB3) – вказує адреси більш ніж 4-х точок переривання.
Debug status register (DB6) – доповідає умову, при якій виникає виключення дебагування або точки переривання.
Debug control register (DB7) – вказує тип доступу до пам’яті або пристроїв вводу/виводу, що зв’язані з точками переривання.
DebugCtlMSR register – дозволяє запис останнього переходу, переривання або виключення.
LastBranchToIP and LastBranchFromIP MSRs – вказують адреси джерела та приймача останнього переходу, переривання або виключення.
LastExceptionToIP and LastExceptionFromIP MSRs – вказує адреси джерела і приймача останнього переходу, що був зроблений перед виникненням переривання або виключення.
T (trap) flag, TSS – генерує debug exception (#DB) при намаганні зробити переключення до задачі, в якої прапорець T в TSS встановлений.
RF (resume) flag, EFLAGS register – призначає декілька виключень одній і тій самій інструкції.
TF (trap) flag, EFLAGS register – генерує виключення дебагування після виконання кожної інструкції.
Breakpoint instruction (INT 3) – генерує виключення точку переривання, яке передає керування програмі дебагера.
Існує 8 регістрів дебагера:
EMBED PBrush
Регістри адрес дебагування(DR0-DR3). Кожен з 4-х цих регістрів запам’ятовує лінійну адресу точки переривання. Порівняння точок переривання здійснюється перед троансляцією фізичних адрес
Регістри дебагування(DR4, DR5). Зарезервовані, якщо дозволені дебагові розширення(при встановленому прапорці DE регістру CR4).
Регістр стану дебагування(DR6)
Регістр керування дебагуванням(DR6) Цей регістр встановлює або знищує точки переривань.
Передбачаються два вектори переривань для обробки виключень:
1 і 3.
Вектор переривання 1 звичайно – програма дебагера або частина більшої програмної системи.
Вектор переривання 3 використовується при виконанні інструкції INT 3. Дебагери використовують виключення переривання подібно до того, як використовуються регістри точок переривання. Це є механізм для призупинення виконання програми для перевірки вмісту регістрів точок переривання.
Регістр Debug CtlMSR дозволяє зберегти останній перехід, переривання і виключення. Цей регістр може бути завантажений з використанням інструкції WRMSR при рівні привілеїв 0.
Регістри LastBranchToIP і LastBranchFromIP – 32-бітні регістри для збереження покажчиків інструкцій останніх переходів, переривань або виключень, що процесор виконав перед виключенням дебагування. При виникненні переривання або виключення абреса інструкції, що була перервана, завантажується в регістр LastBranchFromIP і адреса обробника переривання або виключення – в LastBranchToIP.
Якщо прапорець LBR дебагового регістру DebugCtlMSR встановлений, процусор автоматично починає запис переходів, що відбуваються, виключень, що генеруються(за виключенням виключень дебагування) і переривань, що обслуговуються. Кожного разу при переході, перериванні або виключенні процесор записує відповідні дані в регістри LastBranchToIP і LastBranchFromIP.
При генерації виключень дебагування автоматично обнулюється прапорець LBR перед виконанням обробника виключення.