вівторок, 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.

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

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

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

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


Необхідні інструменти
  • Комп'ютер з 386 або новішим Intel-сумісним процесором. Достатньо лише емулятора, але пробувати час від часу на реальному залізі приємніше.
  • MS-DOS сумісна операційна система для запуску програм уроків. Наприклад FreeDOS.
  • Будь-який текстовий редактор. Під Windows та Linux можна порекомендувати Scite
  • Компілятор OpenWatcom.
  • FlatAssembler
  • The Netwide Assembler (NASM), через те, що хоча FASM  вміє генерувати 16-бітний код, однак він не вміє створювати 16-бітні об'єктні модулі.
  • Додатково користувачам OS Windows можна порекомендувати різноманітні утиліти, що походять з Unix/Linux, з пакету MinGW/MSYS. Поміж них - gcc, GNU make, bash, grep і т.д. Безпосередньо вони не є необхідними, але можуть покращити "якість роботи" (по аналогії з якістю життя)
  • Емулятори, щоб мінімізувати кількість перезавантажень: bochs та qemu. Bochs має зручні засоби відлагодження, але так як емулює процесор і всю апаратуру повністю, дуже повільний. Обидва -- Open Souce. Крім того, можна скористатися і комерційними, типу VirtualBox, VMware, тощо.
  • Під OS Windows -- засоби для роботи з віртуальними дисками. (Під Linux є "вбудований" засіб -- loopback-пристрої). vfd/vdk (Virtual Floppy Drive/ Virtual Disk Driver) чи ImDisk Virtual Disk Driver.
  • Все, що може вам полегшити роботу - файлові менеджери, документація, winamp, пиво, кола і т.д.
Ліцензія
 Ліцензія на код -- GPL2+. 
Ліцензія на тексти -- поки-що GFDL. Можливо, в майбутньому її буде змінено, наприклад на Creative Commons BY-SA.
Довідкова інформація взята з відкритих джерел на просторах Інтернету, зокрема з офіційних мануалів Intel.
Традиційне і очевидне -- жодних гарантій.

Урок номер 0
Ввідний. Опис про що ці уроки, загальні зауваження. 

Описано інструменти, які використовуватимуться, типові приклади їх використання, важливі для цих уроків опції (місцями роздуто). Включено qemu, bochs (зокрема детальний опис вбудованих засобів відлагодження), fasm, nasm, Watcom компілятора, лінкера та дизасемблера, VDK/VFK/ImDisk VDD, loopback-пристроїв.
Описано підготовку до роботи та типовий "робочий цикл".

Скачати можна тут: pm_intro.zip. (Updated - 4)
Архів містить pdf-файли з текстами та tex-файли з яких ці тексти було згенеровано.

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

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

При запуску поточний режим процесора перевіряється за допомогою команди SMSW (Store Machine Status Word). Зроблено це для уникнення конфліктів з EMM386 та інших аналогічних менеджерів пам'яті та Windows.

Описано (болдом виділено те, що безпосередньо відноситься до захищеного режиму):
  1. Нюанси компіляції.
  2. Формат регістра CR0.
  3. Особливості таймера BIOS.
  4. Робота з CMOS-пам'яттю.
  5. Заборона чи дозвіл NMI.
  6. Явне вказання регістрів для extern-функцій OpenWatcom (***), асемблерні вставки.
  7. Заплутування (mangling) імен OpenWatcom.
 Є як змішана C-asm так і чисто асемблерна реалізації.
  
Архів з файлами уроку: pm_01.zip (Updated - 1).

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

На сьогодні все. Наступний урок буде присвячений створенню GDT та доступу до пам'яті в захищеному режимі.

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

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


Зноски:

(*) До речі, її все ще перевидають! Не зважаючи на повну втрату актуальності. Я навіть при нагоді завів собі екземпляр, з сентиментальних мотивів, особливо враховуючи що "оригінал" хтось позичив не повернувши....

(**) Хоча, з цим не все так просто. Для деяких з них я знаю "офіційний" (див. http://e2u.org.ua/) переклад, але його звучання мені відверто не подобається... Для інших до нього ще не звик: називати sources "джерельний код", як рекомендує http://linux.org.ua мені подобається, але багаторічна звичка казати "вихідний код" поки переважає.
 Я розумію що в цьому виходжу за межі своєї компетентності і здебільшого неправий, але є те що є.

(***) Дуже зручна річ для схрещування коду на С та на асемблері. Менш гнучка ніж аналогічні засоби gcc, про які я теж може колись напишу, але зате багато простіша у використанні.

Немає коментарів:

Дописати коментар