Початкове завантаження Linux

Заочна школа програмістів

Студія "Unix зсередини"

(С) В'юшков Олександр, 2002

Процес початкового завантаження.

Частина 1. Передача ядра ОС на згадку.

1. Увімкнення комп'ютера.

2. Завантаження операційної системи.

Цей етап початкового завантаження складається з кількох підетапів. Спочатку завантажується найпростіший завантажувач, потім завантажувач складніший і т.п. - Зрештою в пам'ять переноситься і ядро. Як правило, в Unix-подібних ОС зустрічаються 1-2 допоміжні завантажувачі - бут-сектор і lilo; у Windows 9x їх три.(спочатку завантажується DOS у 2 етапи, потім запускається win.com).

Рис 1. Схема завантаження

2.1 Завантаження завантажувача першої стадії.

Як правило, обсяг ПЗУ обмежений; та й неможливо передбачити всі можливі формати та типи носіїв ядра. DOS завантажується в одній послідовності, Windows в іншій; якщо ви напишете свою ОС, у вас буде своя послідовність завантаження та свій формат ядра. Для того, щоб мати можливість завантажувати будь-яку операційну систему, реалізований наступний механізм. З вибраного носія на згадку переноситься завантажувач першої стадії. Заздалегідь відомо, де цей завантажувач повинен знаходитись на жорсткому диску або дискеті. На розмір завантажувача першої стадії зазвичай накладаються жорсткі вимоги (не більше одного сектора на диску).

Після передачі завантажувача в пам'ять керування передається на першу інструкцію.

2.2 Завантажувач другої стадії

Функціональність завантажувача першої стадії дуже обмежена через обмеження довжини. Як правило, діяльність цього завантажувача зводиться до копіювання певних секторів диска (жорстко запрограмованих у його коді) на згадку і передача управління завантажувачу другої стадії.

Завантажувачдругий стадії зазвичай має набагато менш жорсткі обмеження за обсягом, тому мають незрівнянно ширші можливості. Саме він і здійснюють всю роботу із завантаження та підготовки до запуску ядра операційної системи. Іноді буває з графічним інтерфейсом (наприклад, PQ Magic або XOSL).

2.3 Завантажувачі наступних стадій

Якщо на комп'ютері встановлена ​​лише одна операційна система, то потреби у завантажувачі третьої стадії зазвичай немає. Однак, коли на комп'ютері встановлені наприклад Linux і Windows, буває, що завантажувачі "каскадуються" - наприклад, NT loader завантажує lilo, з якого безпосередньо завантажується ядро ​​linux, або навпаки - з lilo запускається NT Loader, який завантажує Windows NT.

Мал. 2 – “Каскадовані” завантажувачі x86, Linux

Win NT (Win 2000)

2.4 Завантаження операційної системи

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

Інтерактивність завантажувачу потрібна як мінімум для того, щоб залишити можливість завантаження у разі краху системи, але до цього ми повернемося, коли обговорюватиме процес встановлення нового ядра.

Як ілюстрацію до сказаного вище розглянемо завантаження ядра Linux c жорсткого диска для платформи x86.

Процес завантаження Linux на платформі x86 складається з 3 стадій (або більше – якщо є проміжні завантажувачі від Windows, див. розділ 2.3). Розглянемо типову схему завантаження за допомогою LILO (Linux boot Loader). Робота інших завантажувачів така ж, хоча може мати більше стадій.

Завантажувач першої стадії міститься в першому секторі жорсткогодиска, який називається головним завантажувальним записом (MBR – master boot record). Стандартна програма, що встановлюється fdisk'ом, завантажує в пам'ять перший сектор активного розділу (одного з тих, які вийшли при розбивці вінчестера на кілька логічних дисків).

Linux при встановленні змінює програму в MBR на свою. Завдання цієї програми – завантажити другу частину LILO, яка виконує основну роботу із завантаження ОС.

Друга частина LILO читає з диска відомості про всі доступні операційні системи та виводить запрошення, що дозволяє користувачеві вибрати одну з наявних ОС. Після того, як те чи інше ядро ​​вибрано, завантажувач копіює в оперативну пам'ять або завантажувальний сектор відповідного розділу і передає йому керування (див. розділ 2.3 "каскадування завантажувачів") або безпосередньо копію образу обраного ядра. Це забезпечує можливість завантаження як Linux, і інших операційних систем – на відміну, скажімо, від стандартного завантажувача Windows 9x.

Як ще одну ілюстрацію до вищесказаного розглянемо завантаження ядра NetBSD для макінтош. Дуже схожий процес відбувається і на платформі x86.

Процес завантаження NetBSD/макінтош з диска може бути розділено логічно на 3 стадії. На кожній стадії завантажується і виконується дедалі більша та складніша програма. Ми будемо ідентифікувати кожну стадію на ім'я завантажуваної програми. Це "bootxx", "ofwboot" та "netbsd" відповідно.

Стадія 1.bootxx, розмір - 1K

bootxx - це найпростіший завантажувач у ланцюжку. Його завантажує BIOS (на макінтошах він називається Open Firmware). Завдання bootxx - просто завантажити програму-завантажувач другої стадії - "ofwboot". Фізичне розташування "ofwboot" жорстко запрограмоване всередині "bootxx", таким чином йому не потрібнонічого знати про файлову систему - він просто переносить зазначені сектори диска на згадку. Тому при перекомпіляції "ofwboot" необхідно переустановити "bootxx" командою "installboot".

"installboot" збирає інформацію про всіх фізичних секторах диска, в яких зберігається "ofwboot" і заносить інформацію про них у статичну частину виконуваного файлу "bootxx", після чого поміщає "bootxx" в сектор диска, в якому йому і належить бути.

Стадія 2.ofwboot,розмір

Отже, ми потрапили в завантажувач другої стадії. Він уже вміє набагато більше за свого попередника - він може працювати в інтерактивному режимі, а значить користувач може вказати кореневий розділ і передати ядру параметри. Крім того, ofwboot вміє завантажувати файли у форматі ELF і розуміє файлову систему FFS (рідна система для операційних систем з ряду BSD) або NFS - якщо завантажуватись по мережі.

Після того, як користувач вибрав носій, з якого завантажуватиме ядро ​​і вказав прапори, ядро ​​переноситься в пам'ять - і настає третя стадія.

Стадія 3.netbsd,розмір

Фактично, з цього моменту вже операційну систему вже запущено. Однак, до запуску першого користувача процесу - init необхідно ще дуже багато зробити. Процесам, що відбуваються в ядрі ОС у цей проміжок часу, і буде присвячений наступний випуск.