понеділок, 30 травня 2011 р.

Уроки захищеного режиму x86. Урок 3

Третій урок захищеного режиму. 

Попередні : 

Базою для цих матеріалів служать уроки уроки захищеного режиму Алексея Фрунзе
Ліцензія на код -- GPL2+, ліцензія на тексти -- GFDL.
Довідкова інформація взята з відкритих джерел на просторах Інтернету, зокрема з офіційних мануалів Intel.
Традиційне і очевидне -- жодних гарантій. 
Урок номер 3
Та ж GDT що i в другому уроцi. Створюємо IDT (Interrupts Descriptor Table – таблиця дескрипторiв переривань), яка мiстить обробник програмного переривання Int 20h та виключної ситуацiї – дiлення на нуль (Int 0). Перший з них просто виводить повідомлення, другий -- закінчує роботу програми. Продемонстровано їх роботу. Звернiть увагу що обробники є 16-бiтними (типу 286). Зроблено це для простоти.

Описано (болдом виділено те, що безпосередньо відноситься до захищеного режиму):
  • Типи системних дескрипторів.
  • Шлюзи виклику.
  • Шлюзи задач.
  • Шлюзи переривань та IDT.
  • Одним реченням - експорт функції C для використання з асемблерного коду для NASM.

 Є як змішана C-asm так і чисто асемблерна реалізації.
Архів з файлами уроку: pm_03.zip.
Незначні зміни, доповнення та виправлення будуть вноситися прямо в цей файл, про що я старатимуся повідомляти.

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

Якщо є запитання, виправлення, пропозиції - пишіть! Багато часу цьому приділяти, на жаль, не можу, але якщо з того буде комусь користь - спробуємо щось придумати.

неділю, 29 травня 2011 р.

Уроки захищеного режиму x86. Урок 2

Другий урок захищеного режиму. 

Базою для цих матеріалів служать уроки уроки захищеного режиму Алексея Фрунзе
Ліцензія на код -- GPL2+, ліцензія на тексти -- GFDL.
Довідкова інформація взята з відкритих джерел на просторах Інтернету, зокрема з офіційних мануалів Intel.
Традиційне і очевидне -- жодних гарантій.

Урок номер 2

Створюємо GDT. Поміщаємо туди три дескриптори сегментів, які співпадають з відповідними сегментами реального режиму -- сегмент коду, сегмент даних та сегмент стеку. Будуються вони наступним чином: база - CS/DS/SS*10h, ліміт - 0xFFFFh, грануляція - байтова. Крім того, створюємо сегмент що відповідає буферу відеопам'яті -- база 0xB8000h. Всі сегменти - 16-бітні. Створивши таку GDT, переходимо в захищений режим, виводимо на екран повідомлення, "Hello from PMode!", виходимо з нього та завершуємо програму. Так як сервіси BIOS чи DOS нам недоступні, вивід на екран здійснюємо звертаючись безпосередньо до відеопам'яті. 

Описано (болдом виділено те, що безпосередньо відноситься до захищеного режиму):
  1. Формат селектора сегменту. 
  2. Формат дескрипторів, в коді програми - спосіб їх формування.
  3. Типи дескрипторів.
  4. Обчислення лінійної адреси.
  5. Тіньові частини сегментних регістрів.
  6.  Відеопам'ять текстового режиму. Вивід на екран без використання сервісів BIOS чи операційної системи (дуже коротко).
  7. Керування вирівнюванням структур в Open Watcom.
 Є як змішана C-asm так і чисто асемблерна реалізації.
Архів з файлами уроку: pm_02.zip.

Незначні зміни, доповнення та виправлення будуть вноситися прямо в цей файл, про що я старатимуся повідомляти.

На сьогодні все. Наступний урок буде присвячений IDT, введенню в обробку переривань і суміжним питанням.

Дякую за увагу

Якщо є запитання, виправлення, пропозиції - пишіть! Багато часу цьому приділяти, на жаль, не можу, але якщо з того буде комусь користь - спробуємо щось придумати.

суботу, 28 травня 2011 р.

Дози радіації

Трапилася дуже мила (а по сумісництву -- ще й інформативна) картинка про дози опромінення, "радіації", які можна отримати в різних обставинах (картинка велика, тому під катом):

пʼятницю, 27 травня 2011 р.

Приклади використання асемблера разом з OpenWatcom

Що таке Open Watcom

Open Watcom -- "Open source" версія славного компілятора Watcom. В 90-х йому фактично не було рівний, особливо під платформи DOS та Windows. Багато програм, зокрема канонічних ігор тих (і всіх взагалі) часів, таких як Doom, Hexen, Descent чи Duke Nukem 3D компілювалися саме ним, а заставка DOS/4GW пам'ятна багатьом дотепер. Історія його розпочалася в 80-х роках минулого століття на ниві FORTRAN, компілятор C вийшов у 1984. При тому, ходять чутки що історія цього сімейства компіляторів розпочалася ще в 1965, хоча яка саме природа приємственності між розробками 60-х та 80-х, мені невідомо. В кінці минулого тисячоліття компанія-розробник, SyBase, прийшла до висновку що ринок компіляторів під DOS фактично вимирає, а тягатися з Microsoft під Windows нереально. Тому на початку 2000-х, в кілька етапів, код компілятора було відкрито. (Лише той, що належав SyBase, тому Windows SDK, MFC, тести компілятора, підтримка QNX і т.д. не були відкриті.) Тепер він підтримується та розробляється спів-товариством добровільних розробників. 

Що я про нього думаю
Про сучасний стан фахово говорити мені складно, тому далі виключно моє IMHO. 
Оптимізатор коду С, най-най в 90х, зараз помітно поступається сучасним компіляторам. Підтримка C++ доволі слабенька, хоча певна тенденція прямувати до повної підтримки стандарту C++98 є. Перші версії OpenWatcom використовували STLport, однак потім від неї відмовилися на користь власної Open Watcom STL (OWSTL). Вона все ще неповна і працювати з нею людині, яка звикла до повноцінної (не обов'язково най-най-сучаснішої з найідеальнішою відповідністю стандарту) важко, пробував. Щоправда, спроби використати STLport все ще мають шанс на успіх. З іншого боку, багато важливих платформ, які підтримує OpenWatcom -- 16-бітні, і навряд чи є реальний шанс подружити з ними STLport. Тому потреба у власній реалізації STL велика. (Буду вдячний за вказівку на більш точну інформацію про розвиток STL для OpenWatcom, бажано з посиланнями, тому що не маю впевненості чи я не перебрехав усе).

Ходять крім того по Інтернету чутки що розробники не особливо чуйні, навіть якщо приходити до них із своїми "патчами". Особливо бояться чіпати кодогенератор. Наскільки вони обґрунтовані не знаю.

Вище говориться про недоліки. Але, при тому, це один з найкращих доступних інструментів для розробки під 16-бітні операційні системи, зокрема 16-бітного коду (djgpp, порт мого улюбленого gcc під DOS генерує 32-бітний код та покладається на сервіс DPMI, якщо немає системного -- власний CWSDPMI). При цьому OpenWatcom -- не тільки компілятор/лінкер/асемблер/дизасемблер, що і так було б немало, але й IDE, засоби збірки програм, зневадження, та інші інструменти. 

Взагалі, в ролі host-платформи він може використовувати (тобто -- працює на):  DOS, OS/2, Linux, Windows 16/32-бітний (на 64-бітному він працюватиме як 32-бітна аплікація), RDOS; target-платформи (для яких може генерувати код): всі перераховані + Nowell NetWare (інформація взята з інсталятора OW-1.9). Мови програмування -- FORTRAN, C/C++.

Використання асемблера разом з OpenWatcom

В уроках захищеного режиму Open Watcom використовується якраз завдяки тому, що підтримує генерацю 16-бітного коду. Главу про його взаємодію із зовнішніми функціями, зокрема написаними на асемблері, я вирішив винести в окремий пост. Інформація, подана тут/там -- лише ввідна. (Вона далеко не вичерпна - компілятор має надзвичайно розвинуті засоби для такої взаємодії. І це абсолютно природно, враховуючи зоопарк угод про виклики в тих OS, які він підтримує.)

Ці засоби менш гнучкі  та більш прямолінійні ніж аналогічні в gcc, але зате простіші у вивченні та використанні. (Ех, треба буде колись і про Inline Assembler в gcc написати...)

середу, 25 травня 2011 р.

Засоби зневадження в bochs

Вирішив окремо винести частину нульового уроку захищеного режиму, присвячену засобам зневадження (відлагодження) bochs - так-званому internal debugger.

Нагадаю, bochs -- емулятор x86-сумісних процесорів та деякої типової апаратури "IBM-PC-сумісних" машин. Підтримує процесори від 386 і далі. Реалізовано підтримку x86-64, MMX, SSE аж до SSE4.2, AES, тощо. Детальніше див. документацію та приклад конфігурування bochsrc-sample.txt. З апаратури підтримуються доволі просунутий BIOS, VGA адаптер та VESA режими аж до 2560x1600x32bpp, гнучкі та жорсткі диски, CD-ROM, клавіатуру-мишку-звукову-мережеву-карти, паралельні та послідовні порти, частково USB, тощо. Частина пристроїв виключно віртуальна, в ролі інших можна використовувати фізичні пристрої host-машини.

Не всі пристрої присутні на кожній з host-архітектур, на яких bochs працює.

Скачати цю всю радість можна тут: http://sourceforge.net/projects/bochs/files/bochs/2.4.6/. Представлено Win32, Win64, Linux 32/64 бінарні дистрибутиви та джерельні тексти.

Особисто я був вражений внутрішнім "дебагером", тому вирішив главу про нього винести в окремий пост.

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

вівторок, 24 травня 2011 р.

Уроки захищеного режиму x86. Урок 0 та 1

Історія

Колись давно-давно, ще в 1995, був у мене крутий комп Пошук-1. Разом із всіма розширеннями - CGA-монітор, 640Кб пам'яті, 5" дискові, процесором типу i8088 та підтримкою команди POP CS. І було навколо мене багато брутальних програмерів, які переконали мене що Асемблер це круто. А також продали книгу Пітера Абеля "Ассемблер и программирование для IBM PC" видання кінця 80-х -- початку 90-х (*). І за одне і за друге я їм вдячний, але це окрема тема. Вже тоді ми знали що є 286-ті, і це круто, знали що є 486 і це неміряно круто. Сам факт "сидіння" за 486-м був приводом для заздрощів. Минув рік, з'явився комп'ютерний клас з десятка 486-х а мені на добу дали переклад офіційного мануала Intel до чи то 386-го чи то 486-го процесора. Розібратися в на порядки складнішій, в порівнянні з реальним, системі захищеного режиму за цей час звичайно не вдалося. Але бажання розібратися залишилося, прямо за Фрейдом з його витісненими бажанням, на все життя. :-)

Через багато років, у 2006-му, коли документація та спеціалізовані книги вже були легкодоступні і значення прапорців дескрипторів не треба було більше шукати по безграмотних методичках, написаних викладачами для галочки, довелося мені трішки вчити асемблеру. В процесі я писав свою "методичку", яка так і залишилася незавершеною. Нещодавно натрапив на ті тексти. Сумбурно, безтолково, місцями безграмотно, однак достатньо незле щоб шкода було просто так викинути. Вирішив поділитися :-) Перед тим трішки почистив, виправив знайдені помилки та URL що змінилися. Для початку --- додаток, присвячений захищеному режиму 386+.

Базою для цього додаткового розділу послужили уроки захищеного режиму Алексея Фрунзе. Офіційна сторінка тих уроків, http://welcome.to/pmode, на жаль більше не доступна, але див. також сюди: http://members.tripod.com/protected_mode/alexfru/pmtuts.html.

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

Можуть бути помилки :-) (Впевнений що вони є)

Крім того це все ж уроки (максимум - лабораторні роботи), тому систематичного викладу роботи захищеного режиму немає. Правда, є багато довідкової інформації.

Отож, поїхали.