Створюємо прошивку для Android своїми руками Завантаження операційної системи


Як завантажується система на ARM на прикладі android.


Почнемо з простого згадування, про те, що чіп виконаний з архітектури ARM - це система на чіпі (SoC). Тобто це повний комп'ютер, реалізований-ний на одній мікросхемі. На процесорах даної архітектури ізготавлі ється безліч пристроїв (рутер, свічі, вбудовані комп'ютери в телевізорах, ігрові портативні консолі і т.д. і т.п.).


Так само ця архітектура має низькими характеристиками енергоспоживання-лення і тепловиділення, тому досить ефективно використовується в таких пристроях, як смартфони і планшетні комп'ютери.

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

{LikeAndRead}

Отже, перейдемо безпосередньо до опису завантаження даного типу пристроїв. Практично кожен ARM процесор має вбудовану на чіп flash-пам'ять, в яку поміщається т.зв. завантажувач. У разі відсутності на чіпі такої пам'яті, або невикористання її в якості простору для розміщення завантажника, чіп зазвичай звертається для запуску цього завантажувача до NOR-flash по строго певною адресою.

Самих завантажувачів існує декілька. Ряд із них - комерційні. Але є й завантажувач з відкритим вихідним кодом - u-boot. На жаль, при відкритості коду він містить процесоро-залежний код, тому без специфікацій процесора не може бути просто портірован (адаптований) на процесор, який не має відкритої документації.

{LikeAndRead}

Тепер опишемо, що ж зазвичай робить завантажувач після його запуску. Досить пряма аналогія може бути проведена з BIOS комп'ютерів на базі процесорів х86 (ті з основною масою персоналок). Завантажувач ARM при запуску точно так само виконує радий низькорівневих ініціалізацій апаратної частини пристрою (оперативна пам'ять, сховища даних, мережевий адаптер і т.д. і т.п.). Після ініціалізації послідовного порту (зазвичай у форматі RS232, але з рівнями 3.2 вольт) з'являється можливість роботи з ним через консоль ініціалізованої на цьому порту.

Виглядає це так

Створюємо прошивку для Android своїми руками Завантаження операційної системи

За допомогою цієї консолі можна виконати практично повну настройку або перенастроювання нашої залізяки. Наприклад, щоб завантажити чітий Linux, нам як мінімум необхідно буде переналаштувати рядок параметрів переданих ядру при завантаженні (при умолчальне налаштуванні на завантаження android). Так само там можна повністю працювати і з розділами Нанда - прати, розбивати, змінювати, захищати від запису і навпаки і т.д. і т.п. (Щоб уникнути додаткових питань про зміну розділів Нанда). Ще в консолі можна завантажувати і виконувати деяке софт. Всі налаштування, виконані в цій консолі, можуть бути збережені і використовуватися як налаштування за замовчуванням при завантаженні пристрою.

{LikeAndRead}

Зробимо невеликий відступ. Крім NOR-flash для розміщення завантажувача, в ряді випадків, може бути використаний NAND-flash або навіть SD-card. Крім того, можливе використання комбінацій цих типів флеш пам'яті в пристрої. Наприклад завантажувач може бути розміщений в NOR, а в якості внутрішнього накопичувача (для розміщення OS) NAND або SD і т.п.

Отже, ми включили залізяку. Вона завантажила завантажувач. Завантажувач проініціалізувати обладнання. По закінченню цієї ініціалізації завантажувач виконує наступну процедуру:

1 - зчитування і розміщення в оперативній пам'яті образу ядра і рамдіска - обидва по строго визначеними адресами (може бути налаштоване в командному рядку u-boot).

{LikeAndRead}

2 - запуск ядра з правильної точки входу, із зазначенням йому, де брати зовнішній рамдіск (initrd) з кореневою файловою системою і що використовувати як init.

Ще частина оперативної пам'яті відводиться для пристроїв, що вимагають своєї пам'яті, наприклад для відеоядра. Тепер ви розумієте, куди дівається деяка частина заявленої виробником оперативної пам'яті пристрою.

Подальша завантаження мало відрізняється від завантаження Linux на звичайному комп'ютері. Завантажившись, ядро виконує вказаний йому init (це просто ще одна програма). Налаштування init здійснюється у файлі init.rc, який розташований в рамдіске. У ньому проводиться налаштування змінних середовища, монтування дискових пристроїв, запуск необхідних служб і т.д і т.п. По закінченню виконання інструкцій предзапуска з init.rc запускається власне сам андроїд. Вид запуску андроїда зумовило параметром запуску ядра androidboot. Стандартний запуск андроїд виконується в цілому за допомогою передачі параметрів використання потрібного рамдіска (у ramdisk.img) і параметра androidboot.normal. Для запуску режиму відновлення, як правило, використовується інший рамдіск, що містить програму recovery (у recovery.img) і параметр ядра androidboot.recovery.

{LikeAndRead}

Як варіація ядра Linux для андроїда можуть бути зібрані не з підтримкою initrd (коренева система на рамдіске), а з т.зв. initramfs. У цьому випадку вся коренева файлова система буде розташована просто всередині ядра. У цьому випадку для режиму відновлення потрібно, як правило, друге ядро з кореневою файловою системою містить програму recovery. І настройка завантажувача просто на завантаження і виконання recovery ядра.

І як підсумок, проста схема:

Запуск процесора -> запуск завантажувача -> ініціалізація заліза -> зчитування з Нанда ядра і рамдіска -> запуск ядра з використанням цього рамдіска -> виконання програми init -> запуск власне android.

{LikeAndRead}

Детально про u-boot і його командах можна прочитати наприклад на цьому вікі _http :/ / www.denx.de / wiki / view / DULG / Manual.

Якщо вам мало цієї інформації, то детальніше про параметри запуску ядра Linux можна прочитати в Documentation / kernel-parameters.txt з архіву його вихідних кодів. Або знайти цей файл в інтернеті для потрібної вам версії ядра. Але не забувайте враховувати згадану вище специфіку Android.

Автор: _Barsuk_

{/LikeAndRead}