Rus-lg deeper
. Пишемо іграшкову ОС. Копнем глибше.
Автор: (C) Олександр Купрін
Причина перша: якщо подивитися на переклади, що публікуються в Russian Linux Gazette, то ви не зустрінете там матеріалів, присвячених програмуванню на асемблері.[1]Причина очевидна: основний коник Linux і вільного софту - переносимість. А ви де-небудь бачили програму на асемблері у стандарті POSIX? Ні? Я теж. Я не закликаю вас переписувати "сишний" код на асемблері для підвищення швидкодії. Навіщо? Час "героїв-одинаків", що сиділи і "вилизували" по кілька годин десяток рядків коду на "асмі", давно минув. Тепер час глобалізації та інтеграції. До того ж, буває дешевше модернізувати "залізо" (закон Мура поки що ніхто не скасовував), ніж витратитись на переписування програм.
Причина третя (основна): ця тема менітрохизнайома.
Те, що пропонує у своїй статті R. Krishnakumar дуже цікаво, і я з нетерпінням чекаю на продовження (і як читач, і як перекладач). Ми скористаємося його ідеєю, але підемо в інший бік - ми не будемо створювати самодостатній (подібний до ОС) код, ми напишемо код, який видасть на екран повідомлення "Linux Gazette. Зробимо роботу з Linux трохи веселіше!"[2]і буде чекати, поки ви не натиснете клавішу пробіл і виконає в кінці те, що повинен був зробити BIOS[3]-- завантажить MBR[ 4]в ОЗП і передасть йому управління. Приклад простий і невигадливий, але в ньому використовуються основні можливості комп'ютера, які вже доступні перед завантаженням ОС (або після роботи POST[5], кому як більше подобається).
Трохи теорії.
Роби як я.
Отже, ось цей код:
Сподіваюся, не надто заплутано? Добре підемодалі. Ми можемо змінити зображення будь-якого символу або послідовності символів за один раз. У разі замінимо всю таблицю знакогенератора для символів 8x16 (всі 256 символів). Для цього нам потрібний файл шрифтів для консолі з роздільною здатністю 8 на 16 у кодуванні koi8-r. Такий ми можемо знайти у каталозі /usr/lib/kbd/consolefonts. Файл, який нас цікавить -- koi8-8x16.psf.gz. Він має трохи інший формат, але дістати звідти бітову карту символів нескладно: потрібно скопіювати з нього 4096 байт (256*16), відкинувши перші чотири, які є сигнатурою PSF-файлу. Для цього можна скористатися програмою dd (не забудьте розпакувати його - gzip -d koi8-8x16.psf.gz):
Наприкінці нашого прикладу, описаного вище, потрібно додати таку підпрограму:
Крім цього, перед викликом підпрограми show_str потрібно додати виклик підпрограми setup_font:
Тепер, крім запису в перший (boot) сектор дискети, ми повинні записати в 8-му секторів, що за ним слідують, файл зі шрифтом (koi8-8x16.fnt), який буде використовувати підпрограма setup_font. Тут ви знайдете тарбол із остаточним варіантом нашої програми. Там знаходяться файл зі шрифтом і скрипт, який все це збирає і записує на дискету. А завантажившись із неї, ви зможете побачити на екрані фразу:
Сподіваюся, мені це трохи вдалося.