Зареждане на операционната система Здравей свят, dev64
Програмиране
Съдържание
Какво е "зареждане на операционната система"? Както бе споменато по-горе, производителите на компютри доставят компютъра с предварително инсталирана програма, наречена BIOS. Процесорът на компютъра, когато включите захранването или натиснете бутона Reset, започва автоматично да изпълнява програмата от BIOS. Сам по себе си BIOS е малко полезен за потребителя, той ви позволява само да видите списъка с устройства, свързани към компютъра, и да направите някои настройки. Освен това. Обикновен потребител на компютър, като правило, не трябва да се „изкачва“ в тези настройки и да променя нищо в тях. За да стане компютърът нещо полезно, процесорът трябва да започне да изпълнява някаква по-полезна програма от BIOS. Тази програма е операционната система. BIOS може да стартира само една програма от себе си - операционната система. Операционната система от своя страна предоставя на потребителя възможността да изпълнява различни потребителски програми. Процесът на прехвърляне на контрол от BIOS към операционната система е зареждането на операционната система. Основната трудност при това прехвърляне на контрол е, че от гледна точка на процесора не се случва нищо особено, когато операционната система се стартира. Процесорът просто продължава да изпълнява набора от инструкции, докато не бъде изключен или се срещне специална HLT инструкция.
Компютрите и BIOS-ите се произвеждат от една компания, а операционните системи се произвеждат от други компании. Следователно, за да може процесорът да премине от изпълнение на инструкции на BIOS към операционната система, не е предвидено просто прехвърляне на управление, а цяла процедура (програма). Тази процедура е написана от разработчиците на операционната система, а не от производителите на компютри. Тази процедура се нарича Boot Loader(Loader), съхранен на носителя, от който се зарежда операционната система. Най-известните от все още поддържаните носители, от които може да се зарежда операционната система, са флопи дисковете (дискети). Днес обаче флопи дисковете са заменени от по-нови устройства като CD/DVD устройства или USB устройства. Когато експериментирате, е удобно да използвате не истински компютър, а виртуална машина. Виртуалната машина използва обикновени файлове вместо истински флопи дискове, които съхраняват съдържанието на дискетата за зареждане, така че въпреки факта, че флопи дисковете са остарели, все още е удобно да експериментирате с тях (виртуални). Картината показва настройките на моята виртуална машина. Вижда се, че файлът “D:\VM\hw.flp” е свързан като дискета.

Първи експеримент
Добър първоначален експеримент е описан в статията: http://habrahabr.ru/tag/ Ние пишем собствена операционна система. Експериментът се състои в замяна на Boot Loader с проста програма, която ще покаже реда „Hello World!“ на екрана.
Програма директно от статията:
За да извършите експеримента, ви е необходим асемблер: nasm или yasm. И двете са достъпни за безплатно изтегляне в интернет. Освен това е по-лесно да експериментирате с виртуална машина. VMWare или Bochs са подходящи за това. Bochs - Open Source - проект. Предимството на Bochs е неговият малък размер и възможността за отстраняване на грешки във вашата операционна система от момента, в който я стартирате. Само няколко мегабайта. VMWare е търговски продукт, но за различни експерименти предоставя безплатно използване на VMWare Player. (Може би някои други продукти, политиката е променяна няколко пъти). Предимството на VMWare е скоростта. Работи много бързо.
Поставих този изходен код във файла hw.asm (hello world) и компилирах:
Полученият файл „hw“ беше копиранкъм пътя D:\VM\hw.flp, конфигуриран като виртуална дискета във VMWare. Стартира виртуалната машина и всъщност получи желаното съобщение „Здравей свят!“:
Използването на процесора на моя компютър с VMWare се оказа 50%:
Заслужава да се отбележи, че лаптопът, на който тествам, е с двуядрен процесор Intel. 50% натоварване означава 100% натоварване на едно от ядрата. Случайно ли е?
Примерният код завършва с безкраен цикъл jmp $ ; вечен цикъл
Този цикъл натоварва едно от процесорните ядра на 100%. Как да го избегнем? Спомнете си изявлението „Процесорът просто изпълнява поредица от инструкции, докато не бъде изключен или не бъде открита специална HLT инструкция.“
Ще проверя това твърдение. Ще заменя вечния цикъл с 2 инструкции:
cli; забранете хардуерните прекъсвания hlt ; Спирам процесора преди да възникне хардуерно прекъсване
hlt кара процесора да спре да изпълнява инструкции до следващото хардуерно прекъсване. Но тъй като хардуерните прекъсвания са деактивирани от предишната инструкция, процесорът просто спира изпълнението на програмата. Спира. Тестът показва, че картината, получена на екрана, е все същата: “Hello World!”. Но натоварването на процесора е 0%.

В 512-байтовото пространство на Boot Loader все още има достатъчно място за поставяне на истинския Boot Loader, който ще зареди „истинската“ операционна система.
Някои експериментални стъпки (например контрол на натоварването на процесора) са лесни за изпълнение само във виртуална машина. На реална машина, ако буутлоудърът е променен на програмата "Hello World!", описана по-горе, натоварването на процесора може да бъде оценено само чрез обема на вентилатора на процесора. (Така че е трудно да се провери дали процесорът е спрялcli инструкции; hlt).
Какво следва?
Например в горния пример изходът към екрана се извършва с помощта на прекъсването int 0x10. Последователността от команди ще изведе символа 'H' в текущата позиция на курсора.
В допълнение към горните твърдения, мисля (в момента), че функциите на BIOS са достъпни само от реалния режим на процесора. Съответно, буутлоудърът трябва първо да зареди ядрото с помощта на функциите на BIOS, след което да прехвърли управлението на зареденото ядро. Все още не виждам ограничения за входната точка. И още един интересен момент - къде сочи стека в момента на зареждане? Какъв е размерът му.
Впоследствие проведох експеримент, за да определя състоянието на регистрите на процесора в момента на стартиране на Boot Loader. Вижте статията на този линк.. Оказа се, че във VMWare например при зареждане от дискета стекът показва 0:3EC, което отговаря на върха на таблицата за прекъсвания. ax=0x7C03 ds=0x40 sp=0:3EC, останалите регистри са 0. В dl регистъра BIOS предава идентификатора на диска, от който е зареден boot сектора. За устройство A: (флопи) тази стойност е 0.