Rus-lg по-дълбоко
. Пишем ОС играчка. Нека да копаем по-дълбоко.
Автор: (C) Александър Куприн
Първата причина: ако погледнете преводите, публикувани в Russian Linux Gazette, там няма да намерите никакви материали за програмиране на асемблер.[1]Причината е очевидна: основната сила на Linux и безплатния софтуер е преносимостта. Виждали ли сте някога POSIX програма за асемблер? Не? Аз също. Не ви насърчавам да пренапишете вашия "sish" код в асемблер, за да подобрите производителността. За какво? Времето на „самотните герои“, които седяха и „облизаха“ в продължение на няколко часа дузина редове код на „асма“ отдавна отмина. Сега е времето за глобализация и интеграция. Освен това може да бъде по-евтино да надстроите хардуера (законът на Мур все още не е отменен), отколкото да харчите пари за пренаписване на програми.
Трета причина (основна): Тази тема ми емалкопозната.
Това, което Р. Кришнакумар предлага в статията си, е много интересно и очаквам с нетърпение да продължа (както като читател, така и като преводач). Ще използваме идеята му, но ще тръгнем по друг начин -- няма да пишем самостоятелен (подобен на ОС) код, а ще пишем код, който ще показва съобщението "Linux Gazette. Нека направим Linux малко по-забавен!"[2]и ще изчака, докато натиснете интервала и най-накрая направи това, което BIOS[3]трябваше да направи -- заредете MBR[4]в RAM и му дайте контрол. Примерът е прост и непретенциозен, но използва основните функции на компютъра, които вече са налични преди зареждането на ОС (или след POST[5], което предпочитате).
Малко теория.
Направи като мен.
Ето кода:
Надяваме се, че не е твърде объркващо? ОК нека да отидемпо-нататък. Можем да променим лицето на всеки герой или последователност от герои с едно движение. В нашия случай ще заменим цялата таблица за генериране на знаци за 8x16 знака (всичките 256 знака). За да направим това, имаме нужда от файл с конзолен шрифт с резолюция 8x16, кодиран в 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:
Сега, в допълнение към записа в първия (зареждащ) сектор на дискетата, трябва да напишем в 8-ия сектор след него файл с шрифт (koi8-8x16.fnt), който ще се използва от подпрограмата setup_font. Тук ще намерите tarball с окончателната версия на нашата програма. Има и файл с шрифт и скрипт, който събира всичко това и го записва на дискета. И стартирайки от него, можете да видите фразата на екрана:
Надявам се поне малко да съм успял.