Ответ
После подачи питания выполняется последовательность инициализации (boot process), которая зависит от архитектуры, но общие этапы включают:
- Сброс процессора (Reset Vector): Процессор начинает выполнение кода с фиксированного адреса (например, 0x00000000 для ARM Cortex-M), где находится начальный обработчик прерывания.
- Аппаратная инициализация (Startup Code): Написанный на ассемблере или C код выполняет:
- Настройку указателя стека (SP).
- Копирование секции
.data(инициализированных статических/глобальных переменных) из флэш-памяти в RAM. - Обнуление секции
.bss(неинициализированных статических/глобальных переменных). - Вызов глобальных конструкторов (для C++).
- Переход к ядру ОС (или
main): Управление передаётся функцииmain()в standalone-приложении или загрузчику ядра (bootloader).
Пример минимального startup-кода для ARM Cortex-M (C):
// Объявления линкера для адресов секций
extern uint32_t _sidata, _sdata, _edata, _sbss, _ebss;
void Reset_Handler(void) {
// Копирование .data из FLASH в RAM
uint32_t *src = &_sidata;
uint32_t *dst = &_sdata;
while (dst < &_edata) {
*dst++ = *src++;
}
// Обнуление .bss секции
uint32_t *bss = &_sbss;
while (bss < &_ebss) {
*bss++ = 0;
}
// Вызов системной инициализации (такты, память)
SystemInit();
// Переход в main приложение
main();
}
После этого, если загружается Linux, bootloader (например, U-Boot) загружает ядро и передаёт ему управление.
Ответ 18+ 🔞
А, ну это же классика, ёпта! Сейчас расскажу, как железка просыпается, чтобы ты не думал, что там магия какая-то. Представь, ты врубаешь питание — и процессор такой: «Опа, свет есть! Начинаем шоу».
Первым делом он, как конь испуганный, несётся по абсолютно фиксированному адресу. Это типа его домашний адрес после сброса, с него всё начинается. Для многих ARM'ов это, допустим, 0x00000000. Там его уже ждёт первая инструкция — стартовый обработчик. Это как будто ты просыпаешься и первым делом тян