Материалы сайта
Это интересно
Керiвництво программиста
5 МЕТОДИЧНІ ВКАЗІВКИ ДО ЛАБОРАТОРНИХ РОБІТ 1 Загальні положення Регістри процесора. Процесор має регістри, що поділяються на наступні категорії: - Регістри загального призначення; - Покажчик інструкцій і регістр прапорів; - Сегментні регістри; - Системні регістри; - Регістри отладки; - Регістри тестування. Останні дві категорії регістрів в емуляторі не реалізовані і не мають відношення до даної лабораторної роботи. Набір регістрів загального призначення включає відповідні регістри попередніх процесорів (8086 і 80286). Всі регістри мають розрядність 32 біти, і до колишньої позначки їхніх імен додашлася приставка Е. Відсутність приставки в імені означає заслання на молодші 16 біт розширених регістрів. Як і в 8086, можливо незалежне звертання до молодшого і старшого байтів регістрів. Покажчик інструкцій EIP містить зміщення наступної виконуваної інструкції відносно бази сегменту кодів. Регістр прапорів EFLAGS також поширений до 32 біт. Біти, певні для 8086 і 80286, мають колишнє призначення, але у порівнянні з 80286 з'явилися нові біти. Призначення нових прапорів регістру EFLAGS: * AC (Alignment Check, біт 18) - прапор контролю вирівнювання. При виконанні програм на рівні привілей 3 в випадку звертання до операнду, не вирівненому по відповідній межі, і при встановленому прапорі AC відбудеться виключення-відмова 17 з нульовим кодом помилки. * VM (Virtual Mashine, біт 17) - в захищеному режимі включає режим віртуального 8086. Спроба використання привілейованих інструкцій в цьому режимі викличе виключення 13. Біт може встановлюватися тільки в захищеному режимі: інструкцією IRET на нульовому рівні привілей або переключенням задач на будь-якому рівні привілей. На біт не діють інструкції POPF, а PUSHF в образ цього регістру завжди заносить 0. Його одиничне значення може зберегтися тільки в образі, що зберігається при перериванні або переключенні задач. * RF (Resume Flag, біт 16) - прапор поновлення, використовується спільно з регістрами крапок останова. Сегментні регістри містять 16-разрядные селекторы і 64-розрядні дескрипторні частини. В реальному режимі вміст селекторної частини співпадає адресою сегменту, а розмір сегменту завжди рівний 64 Кб. В захищеному режимі адреса сегменту і його розмір можуть бути довільними і завантажуються з дескриптора сегменту, що розміщений в спеціальній таблиці. В відзнаку від процесора 80286 адреса сегменту має 32 розряду, а розмір 20 розрядів, крім того в залежності від біта дрібності в поле атрибутів сегменту розмір може бути уявлений в байтах або сторінках по 4 Кб. В поле атрибутів дескриптора додані два нових прапора: біт дрібності G і біт розрядність D. Останній має сенс тільки для сегментів кодів і стека. Формат селектора і дескриптора уявлений на рисунку 5.1. Поле TI (біт 2) служить індикатором таблиці. Його значення вказує таблицю, що вибирається: GDT при TI=0, LDT при TI=1. Поле ІНДЕКС (біти 15-3) служить індексом для вибору одного з 8192 дескрипторів. Поле типу системного дескриптора визначає його тип. Типи системних дескрипторов наведені в таблиці 5.1. Таблиця 5.1 Типи системних дескрипторів |Тип |Визначення |Тип |Визначення | |0 |Не використовується |8 |Не використовується | |1 |Доступний TSS 286 |9 |Доступний TSS 386+ | |2 |Таблиця LDT |A |Зарезервирован | |3 |Зайнятий TSS 286 |B |Зайнятий TSS 386+ | |4 |Шлюз виклика 286 |C |Шлюз виклика 386+ | |5 |Шлюз задачі |D |Зарезервирован | |6 |Шлюз перериваннь 286 |E |Шлюз перериваннь 386+ | |7 |Шлюз ловушки 286 |F |Шлюз ловушки 386+ | Регістри локальної таблиці дескрипторів і сегменту стану задачі мають таку же структуру як і сегментні регістри. Регістри глобальної дескрипторної таблиці і таблиці переривань мають тільки 32-розрядне поле бази і 16-розрядне поле розміру. Системні регістри CR0, CR2, CR3 мають 32-розрядну структуру і використовуються для настанови режимів і контролю. Регістр CR0 в якості молодшої частини включає в себе біти регістру MSW процесора 80286. Призначення бітів регістру CR0 наступне: * PE (Protection Enable, біт 0) - дозвіл захисту, настанова біта переводить процесор в захищений режим; * MP (Monitor Processor Extention, біт 1) - моніторінг сопроцесора, дозволяє викликати виключення 7 по команді WAIT при TS=1; * EM (Processor Extention Emulated, біт 2) - емуляція сопроцесора, дозволяє викликати виключення 7 по кожній команді сопроцесора; * TS (Task Switch, біт 3) - задача переключена. Встановлюється після кожного переключення задачі; * ET (Extention Type, біт 4) - індикатор підтримки інструкцій математичного сопроцесора; * NE (Numeric Error, біт 5) - дозвіл стандартного механізму повідомлення про помилку сопроцесора; * WP (Write Protect, біт 16) - дозвіл захисту від запису на рівні привілей супервизора в сторінки тільки для читання; * AM (Alignment Mask, біт 18) - дозвіл контролю вирівнювання; * NW (Not Writethrough, біт 29) - заборона наскрізна запису кеша і циклів анулювання; * CD (Cashe Disable, біт 30) - заборона заповнення кеша; * PG (Paging Enable, біт 31) - включення механізму трансляції сторінок. Регістр CR2 зберігає 32-розрядну лінійну адресу, по якій була отримана остання відмова сторінки пам'яті. Регістр CR3 в старших 20 розрядах зберігає фізичну базову адресу каталогу сторінок. Формування лінійної адреси. Механізм формування лінійної адреси однаков в будь-якому режимі роботи процесора. Від режиму залежить тільки засіб завантаження сегментного регістру. В реальному і віртуальному режимах значення сегментної адреси завантажується в селекторну частину і в поле бази дескрипторної частини попередно зсунуте на 4 розряду ліворуч. Розмір встановлюється рівним 64 Кб. До сегменту дозволяється доступ як по запису, так і по читанню. В захищеному режимі дескрипторна частина завантажується з глобальної або локальної таблиці, а в селекторну частину завантажується селектор, з допомогою якого був вибраний дескриптор. Кодовий сегмент служить тільки для вибірки інструкцій і може бути доступний тільки для читання. Сегменти даних завжди доступні для читання і можуть бути доступні для запису. Права доступу до сегменту визначає слово атрибутів дескриптора. Лінійна адреса формується шляхом підсумовування вмісту поля бази в дескрипторної частині сегментного регістру і ефективного зміщення, що сформувалось з допомогою одного з засобів адресації. В 16-розрядном режимі адресації формування ефективного зміщення повністю співпадає з процесорами 8086 і 80286. В 32-разрядном режимі без sib-байта адреса формується з вмісту будь-якого регістру загального призначення і зміщення (зміщення або регістр можуть бути відстуній). Для формування адреси з декількох компонент в 32-розрядном режимі після mod- байта в інструкції ставиться sib-байт (Scale-Index-Base, масштаб-індекс- база). В цьому байті міститься інформація про те, що регістр є базовим, що індексним і що фактор зрушення застосовується до індексу. Вміст індексного регістру перед формуванням адреси може бути зсунутий на 1, 2 або 4 розряду ліворуч. В якості базового і індексного регістру може виступати будь-який регістр загального призначення. Механізм трансляції сторінок. Трансляція сторінок здійснюється тільки в захищеному і віртуальному режимах. При цьому лінійна виконавча адреса транслюється в фізичний з допомогою дворівневого сторінкового механізму. 2 Лабораторна робота N 1 Метою лабораторної роботи є вивчення основ програмування в захищеному режимі для мікропроцесору 80486, а також одержання необхідних навиків роботи з емулятором цього процесора. 5.2.1 Завдання до лабораторної роботи В даній роботі студент повинен скласти програму, що формує в пам'яті необхідні таблиці, переводить процесор в захищений режим, виводить на екран ФІБ студента і вертається в реальний режим. При цьому розрядність сегментів коду і стека, направлення розширення сегменту стека і засіб адресації при пересилці рядки на екран задані з допомогою таблиці варіантів. Програма повинна бути відлагоджена і продемонстрована на емуляторі. Перед виконанням лабораторної роботи рекомендується ознайомитися з конспектом лекцій і літературою по програмуванню процесора в захищеному режимі. 2 Приклад виконання Складемо програму для пересилки текстового рядка з використанням індексної адресації з масштабуванням. Кодовий сегмент і сегмент стека є 32- розрядными, стек поширюється вниз. Для роботи програми в захищеному режимі достатньо мати тільки таблицю глобальних дескрипторів, що містить наступні елементи: n Нульовий дескриптор; n Дескриптор сегменту коду (32-розрядний); n Дескриптор сегменту даних; n Дескриптор сегменту стека (32-розрядний, поширюється вниз); n Дескриптор даних відеобуфера. Для трансляції вихідного тексту програми в виконавчий файл проведемо з використанням транслятора Tasm і линкера Tlink. ; файл “lab1. asm” IDEAL ; режим Ideal P486 ; 80486 з інструкціями Protect mode model large ; модель пам'яті stack 256 ; стек реального режиму 256 байт segment stak use32 ; сегмент стека захищеного режиму dd 256 dup (0) stk_len=$ ; довжина сегменту стека ends struc descr ; структура дескриптора limit1 dw 0 ; розмір, біти 15-0 base1 dw 0 ; база, біти 15-0 base2 db 0 ; база, біти 23-16 acs dw 0 ; слово атрибутів і розмір (біти 19-16) base3 db 0 ; база, біти 31-24 ends SEGMENT DATA USE32 ; сегмент даних label gdt dword ; таблиця GDT d1 descr <> ; нульовий дескриптор sel_code= $-gdt ; селектор сегменту коду cod descr <> ; дескриптор сегменту коду sel_data= $-gdt ; селектор сегменту даних dat descr <> ; дескриптор сегменту даних sel_stk= $-gdt ; селектор сегменту стека stk descr <> ; дескриптор сегменту стека sel_video= $-gdt ; селектор сегменту відеопам'яті video descr <80*25*2, 8000h, 0bh, 4092h, 0> ;дескриптор сегменту відеопамяті label dat_gdt pword ; покажчик на GDT gdt_len dw $-gdt ; довжина gdt_base dd 0 ; лінійна адреса dlen dd data_len ; довжина сегменту даних clen dd pcode_len ; довжина сегменту коду slen dd stk_len ; довжина сегменту стека message db 'Рабинович Абрам Исаакович', 0 ; текстовий рядок data_len=$ ENDS ; 16-розрядний сегмент коду реального режиму SEGMENT CODE USE16 assume cs: code, ds: data ; головна процедура proc main mov ax, data ; настройка DS на сегмент даних mov ds, ax ; настройка дескриптора сегменту коду mov eax, pcode shl eax, 4 ; обчислення лінійної адреси push sel_code ; селектор сегменту push 409ah ; 32-розрядний сегмент коду, ; доступний по читанню push [clen] ; довжина сегменту push eax ; лінійна адреса сегменту call make_desc ; заповнення дескриптора add sp, 14 ; анулювання параметрів в стеке ; настройка дескриптора сегменту даних mov eax, ds shl eax, 4 ; обчислення лінійної адреси push sel_data ; селектор сегменту push 4092h ; 32-разрядный сегмент даних, ; доступний по запису, поширюється вверх push [dlen] ; довжина сегменту push eax ; лінійна адреса сегменту call make_desc ; заповнення дескриптора add sp, 14 ; анулювання параметрів в стеке ; настройка дескриптора сегменту стека mov eax, stak shl eax, 4 ; обчислення лінійної адреси add eax, [slen] ; вершини стека push sel_stk ; селектор сегменту push 4096h ; 32-розрядний сегмент даних ; доступний по запису, поширюється вниз push [slen] ; розмір сегменту push eax ; лінійна адреса сегменту call make_desc ; заповнення дескриптора add sp, 14 ; анулювання параметрів в стеке ; настройка покажчика на GDT mov eax, ds shl eax, 4 add eax, offset gdt ; лінійна адреса таблиці mov [gdt_base], eax lgdt [dat_gdt] ; завантаження регістру GDTR cli ; заборона апаратних переривань mov eax, cr0 ; настанова біта режиму в регістрі CR0 inc al mov cr0, eax ; jmp far sel_code: offset pmode ; перехід на сегмент ; захищеного режиму dw 0ea66h dd offset pmode dw sel_code endp ; процедура заповнення дескриптора proc make_desc near ; список параметрів ARG base: dword, ; базова адреса сегменту len: dword, ; розмір сегмента acs: word, ; атрибути сегменту sel: word ; селектор сегменту (на рівні ; привілей 0 селектор дескриптора ; в таблиці GDT, є також ; зміщенням в цій таблиці) enter 0.0 ; створення кадру стека mov si, [sel] add si, offset gdt ; обчислення адреси дескриптора mov eax, [base] mov [dword si+descr. base2], eax ; завантаження бази сегменту (біти 31- 24) mov [dword si+descr. base1], eax ; завантаження бази сегменту (біти 23-0) mov eax, [len] mov [si], ax ; завантаження розміру сегменту (біти 15-0) shr eax, 8 xor al, al or ax, [acs] mov [si+descr. acs], ax ; завантаження атрибутів і ; розміру (біти 19-16) leave ; анулювання кадру стека ret ; повернення endp ; завершення роботи програми proc rmode sti mov ax, 4c00h ; функція завершення з кодом 0 int 21h ; виклик ДОС endp ENDS ; 32-розрядний сегмент коду захищеного режиму SEGMENT PCODE USE32 assume cs: pcode, ds: data, ss: stak ; головна процедура proc pmode mov eax, sel_stk ; настройка стека mov ss, ax xor esp, esp ; покажчик на вершину mov eax, sel_data ; настройка на сегмент даних mov ds, ax mov fs, ax mov gs, ax mov eax, sel_video ; настройка на відеопам'ять mov es, ax call print ; виклик процедури печатки mov eax, cr0 xor eax, 1 mov cr0, eax ; скид біта режиму в регістрі CR0 jmp far code: rmode ; повернення в сегмент реального режиму endp ; процедура печатки proc print near xor edi, edi ; зміщення 0 в відеопам'яті lea esi, [message] ; адреса рядка mov ah, 17h ; атрибути символів ; цикл виводу @@1: mov al, [esi] ; завантаження в al чергового символу or al, al ; перевірка на 0 jz @@2 ; якщо 0, те вихід з циклу mov [es: edi*2], ax ; символ з атрибутом в відеопам'ять inc esi ; наступний символ inc edi ; наступне знакомісце jmp @@1 ; повторення циклу @@2: ret ; повернення endp pcode_len=$ ENDS end main ; крапка входу в програму Створення виконавчого файлу здійснювалося слідуючим чином: tasm. exe lab2. asm/m2 tlink. exe lab2. obj/ 3 3міст звіту з лабораторної роботи 4. Повна схема формування адреси при записі в відеопам'ять в відповідності з заданим варіантом. 5. Формат що використаються селекторів і дескрипторів з реальними значеннями. 6. Текст програми. 7. Вміст регістрів ,що використаються і кадру стека під час пересилки рядка. 4 Контрольні питання 5. Який мінімальний і максимальний розмір сегменту при встановленому і скинутому біті дрібності в дескрипторі? 6. Як зміниться покажчик 32-розрядного стека при вталківанії в нього операнда розміром: А) слово; Б) подвійне слово? 3. Можна чи не використати перехід після переключення режиму і чому? 3 Лабораторна робота N 2 Метою даної лабораторної роботи є закріплення знань про роботу механізму трансляції сторінок, а також одержання навиків в укладанні таблиць сторінок. Лабораторна робота розрахована на 2 академічних години. 1 Завдання до лабораторної роботи В даній роботі студент повинен скласти програму що формує в пам'яті необхідні системні таблиці, переводить процесор в захищений режим з включеним механізмом трансляції сторінок, виводить в відеопам'ять рядок з ФІБ студента і переводить процесор в реальний режим. При цьому відеопам'ять повинна знаходитися по логічній адресі 100000h, що досягається застосуванням сторінкового механізму. Розмір сторінки пам'яті береться з таблиці варіантів. Таблиці сторінок слідує складати тільки для першого мегабайта плюс область відеопам'яті. Якщо розмір сторінки менш стандартного, поля лінійної адреси вирівнюються по правому краю, а в елементах каталогу або таблиці - фізична адреса завжди починається з 12-го розряду. При укладанні програми можна скористуватися вихідним текстом з попередньої роботи. Приклад виконання Складемо програму що використає сторінковий механізм з розміром сторінки 4Кб. Якщо використати вихідний текст з попередньої роботи, достатньо проголосити в сегменті даних область для каталогу і таблиць сторінок, додати в головну процедуру код для формування цих таблиць і змінити базову адресу відеобуфера. Бо немає надоби складати таблиці для усього адресного простору, необхідно обчислити мінімальну кількість таблиць сторінок для покритті необхідного адресного простору. <розмір сторінки>/4 < розмір сторінки >=<мінімальне покриття> 4 [Kb]/4*4 [Kb] =4096 [Kb] =4 [Mb] Одна сторінка покриває 4 Мб адресного простору, а нам необхідно 1024Кб+4Кб=1028 Кб, що значно менш означеного обсягу. Значить достатньо заповнити тільки одну таблицю сторінок. Каталог і таблиця повинні бути вирівнені по межі 4 Кб, а сегмент ехе-файлу може бути вирівнен тільки по межі параграфу, тому усього необхідно 3 сторінки по 4 Кб. ; файл “lab2. asm” ... SEGMENT DATA USE32 pages dd 3*1024 dup (0) ; буфер для таблиць сторінок ... ; таблиця GDT video descr <80*25*2, 0.10 h, 4092h, 0> ; адреса сегменту 100000h ... ENDS SEGMENT CODE USE16 assume cs: code, ds: data proc main ; заповнення дескрипторов сегментів mov ebx, data ; обчислення фізичного shl ebx, 4 ; адреси каталогу сторінок add ebx, 1000h and bx, 0f000h mov cr3, ebx ; завантаження адреси каталогу в CR3 mov eax, ebx ; обчислення зміщення shr ebx, 4 ; каталогу сторінок в sub bx, data ; сегменті даних shl bx, 4 add eax, 1007h ; обчислення адреси 1-й таблиці mov [bx], eax ; завантаження в каталог add ebx, 1000h ; зміщення таблиці mov eax, 7 ; 1-я сторінка, адреса 0 mov cx, 256 ; 256 сторінок= 1Мб @@1: mov [bx], eax ; заповнення таблиці add eax, 1000h ; наступні 4 Кб add bx, 4 ; адреса наступного елемента loop @@1 ; повторення циклу ; в bx адресу елемента таблиці для відеобуфера mov [dword bx], 0b8007h ; фізична адреса відеобуфера ; завантаження GDTR mov eax, cr0 or eax, 80000001h mov cr0, eax ; настанова бітів PE і PG в CR0 ; jmp far sel_code: offset pmode dw 0ea66h dd offset pmode dw sel_code endp proc make_desc near ; процедура заповнення дескриптора ... endp proc rmode ; процедура завершення програми ... endp ENDS SEGMENT PCODE USE32 proc pmode ... ; головна процедура endp proc print near ... ; процедура печатки endp pcode_len=$ ENDS end main ; крапка входу Створення виконавчого файлу здійснювалося слідуючим чином: tasm. exe lab2. asm/m2 tlink. exe lab2. obj/3 Перед отладкою програми необхідно встановити заданий розмір сторінки в емуляторі. Для цього треба викликати головне меню, вибрати пункт “Настанови”, клавішами “вверх” або “вниз” встановити розмір і натиснути клавішу введення. 3 Зміст звіту з лабораторної роботи 1. Повна схема формування адреси згідно варіанту. 2. Текст програми. 3. Дільниці таблиць сторінок, що використовувались програмою (в тому числі і під самою програмою). 4 Контрольні питання 5. Який обсяг адресного простору покриває сторінковий механізм при розмірі сторінки: А) 2 Кб; Б) 1 Кб; С) 0.5 Кб? 2. Як організувати лінійний буфер пам'яті влаштування, якщо доступ до цієї пам'яті здійснюється поблочно через вікно в фізичному адресному просторі, а переміщення вікна здійснюється шляхом запису його номеру в порт влаштування. 5.4 Таблиця варіантів В таблиці використані наступні позначки засобів адресації: “бісм” - базово-індексна зі зміщенням і масштабурованням; “бім” - базово-індексна з масштабурованням; “ім” - індексна з масштабурованням; “і” - індексна; “біс” - базово-індексна зі зміщенням; “бі” - базово-індексна; “б” - базова. Література Гук М. “Процессоры Intel от 8086 до Pentium II”. - СПб: “ПИТЕР”,1997 - 224 с. Бродин В.Б. Шагурин И.И. “Микропроцессор i486. Архитектура, программирование, интерфейс”. - М.: “ДИАЛОГ-МИФИ”, 1993. - 240 с. Голенкова Ж.К. Заболоцкий А.В. Мархасин М.Л. “Руководство по архитектуре IBM PC AT”. - Мн.: ООО “Консул”, 1992. - 949 с. Таблиця 5.1 Таблиця варіантів. |Варіан|Засіб |Розрядність |Розширення |Розмір | |т |адресації |коду |стека |сторінки, Кб | |1 |Бісм |16 |Вверх |4 | |2 |Бім |32 |Вниз |2 | |3 |Ім |16 |Вверх |1 | |4 |І |32 |Вниз |0.5 | |5 |Біс |16 |Вверх |4 | |6 |Бі |32 |Вниз |2 | |7 |Б |16 |Вверх |1 | |8 |Бісм |32 |Вниз |0.5 | |9 |Бім |16 |Вверх |4 | |10 |Ім |32 |Вниз |2 | |11 |І |16 |Вверх |1 | |12 |Біс |32 |Вниз |0.5 | |13 |Бі |16 |Вверх |4 | |14 |Б |32 |Вниз |2 | |15 |Бісм |16 |Вверх |1 | |16 |Бім |32 |Вниз |0.5 | |17 |Ім |16 |Вверх |4 | |18 |І |32 |Вниз |2 | |19 |Біс |16 |Вверх |1 | |20 |Бі |32 |Вниз |0.5 | |21 |Б |16 |Вверх |4 | |22 |Бісм |32 |Вниз |2 | |23 |Бім |16 |Вверх |1 | |24 |Ім |32 |Вниз |0.5 | |25 |І |16 |Вверх |4 | |26 |Біс |32 |Вниз |2 | |27 |Бі |16 |Вверх |1 | |28 |Б |32 |Вниз |0.5 | ----------------------- ІНДЕКС TI RPL 15 3 2 1 0 Розмір (15-0) База (23-0) Атр.(7-0) Розмір(19-16) Атр.(11-8) База(31-24) 63 56 55 52 51 48 47 40 39 16 15 0 Рисунок 5.1 Формат селектора і дескриптора сегмента. Р DPL S=0 type 7 6 5 4 3 0 E=1 C R A Р DPL S=1 7 6 5 4 3 2 1 0 Р DPL S=1 E=0 ED W A 7 6 5 4 3 2 1 0 Рисунок 5.2 Формат байта доступа. Directory Table Offset Phisical addres Page Table Entry Directory Entry CR3 Page Directory Page Table 31 22 21 12 11 0 Рисунок 5.3 Преобразовання лінійної адреси для 4 Кб сторінок 10 10 12