← Назад к вопросам

Что происходит после подачи питания на устройство?

2.0 Middle🔥 191 комментариев
#Linux и операционные системы

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI29 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Что происходит после подачи питания на устройство?

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

1. Аппаратная инициализация (Hardware Power-On)

Phase 1: Power Supply Stabilization

Питание -> Конденсаторы стабилизируют напряжение
  |
  v
Сигнал RESET# генерируется (активный LOW)
  |
  v
Все компоненты получают сигнал RESET
  |
  v
CPU выходит из режима RESET

Phase 2: CPU Power-on Reset

// Аппаратно, CPU начинает со специального состояния:
// - EIP/IP регистр = 0xFFFFF0 (Intel x86)
// - Память не инициализирована
// - Прерывания отключены
// - MMU отключена

// ARM Cortex (встраиваемые системы):
// - SP (stack pointer) загружается из адреса 0x00000000
// - PC (program counter) загружается из адреса 0x00000004
// - Выполнение начинается с этого адреса

#define RESET_VECTOR_ADDR 0x00000000
#define STACK_PTR_OFFSET  0x00000000
#define ENTRY_POINT_OFFSET 0x00000004

2. Power-On Self Test (POST) и BIOS

На x86 системах:

CPU начинает выполнять код из ROM
  |
  v
BIOS инициализирует ключевые компоненты:
  - Проверка памяти (memory test)
  - Инициализация контроллеров (chipset, PCIe, SATA)
  - Проверка видеокарты
  - Инициализация дисковода
  |
  v
Экран черный/серый (BIOS splash screen)
  |
  v
POST завершён успешно (или ошибка с beep кодами)

На встраиваемых системах (ARM):

Bootloader в ROM (U-Boot, TianoCore или custom):
  - Инициализирует DDR память
  - Настраивает clock распределение
  - Инициализирует консоль (UART для debug)
  - Проверяет целостность kernel

3. Загрузка Bootloader

// Bootloader — первый код, запущенный с диска/flash
// Задача: загрузить kernel в память

// GRUB процесс:
// 1. Stage 1 (512 bytes в MBR):
//    - Инициализирует дисковой контроллер
//    - Загружает Stage 1.5
// 2. Stage 1.5:
//    - Драйверы файловой системы
// 3. Stage 2 (основной bootloader):
//    - Парсит конфигурацию /boot/grub/grub.cfg
//    - Загружает kernel и initramfs
//    - Передаёт управление kernel'у

#define KERNEL_LOAD_ADDRESS 0x1000000  // 16MB
#define INITRAMFS_LOAD_ADDRESS 0x2000000

4. Kernel Boot Phase

// После передачи управления от bootloader'а
// kernel начинает инициализацию

asmlinkage __visible void __init start_kernel(void) {
    // C код начинается здесь
    
    // 1. Инициализация памяти
    mm_init();
    
    // 2. Инициализация процессов/планировщика
    sched_init();
    
    // 3. Инициализация прерываний
    trap_init();
    irq_init();
    
    // 4. Инициализация таймеров
    tick_init();
    
    // 5. Инициализация I/O подсистем
    init_IRQ();
    
    // 6. Инициализация файловых систем
    vfs_init();
    
    // 7. Монтирование rootfs
    prepare_namespace();
    
    // 8. Запуск init процесса (PID=1)
    rest_init();
}

5. Инициализация Drivers (Device Initialization)

// Порядок инициализации (по приоритету):
// 1. pure_initcall     — самые критичные
// 2. core_initcall     — core kernel
// 3. subsys_initcall   — подсистемы
// 4. fs_initcall       — файловые системы
// 5. device_initcall   — драйверы устройств
// 6. late_initcall     — поздняя инициализация

static int __init my_driver_init(void) {
    pr_info("Initializing driver\n");
    return 0;
}

module_init(my_driver_init);

6. Монтирование Root Filesystem

# initramfs содержит временную файловую систему

# kernel загружает initramfs из памяти
# Процесс:
# 1. Найти реальный rootfs (на диске, сети, USB)
# 2. Смонтировать реальный rootfs на /
# 3. Удалить initramfs из памяти
# 4. Перейти на реальный rootfs

# Команда для просмотра initramfs:
# lsinitramfs /boot/initrd.img-5.10

7. Запуск Init Process

# PID=1 — первый пользовательский процесс (init/systemd)
# Может быть:
# - systemd (современные системы)
# - sysvinit (старые системы)
# - custom init (embedded, контейнеры)

# systemd инициализирует:
# 1. Парсит /etc/systemd/system/*.target файлы
# 2. Запускает необходимые сервисы
# 3. Инициализирует getty (login prompt)

# Проверить текущий init:
# ps -p 1 -o comm=

8. Полная последовательность

Питание -> BIOS -> Bootloader -> Kernel -> Drivers -> Filesystems -> Init -> Services -> Login
   1ms     1s       0.1s         0.5s      0.5s        0.2s        0.1s    1s       Ready

9. Диагностика процесса загрузки

# Просмотр timing'ов загрузки
systemd-analyze

# Просмотр по сервисам
systemd-analyze blame

# Просмотр дневника загрузки
journalctl -b 0 | head -50

# Параметры kernel
cat /proc/cmdline

# Kernel messages
dmesg | head -30

10. Практические примеры настройки

Ускорение загрузки:

# Отключить неиспользуемые modules
CONFIG_DEBUG_INFO=n

# Параллельная загрузка драйверов
echo 4 > /proc/sys/kernel/threads-max

Диагностика проблем:

# Если система не загружается:
# linux ... rw init=/bin/bash

# Kernel panic debugging:
dmesg | tail -30

Выводы

После подачи питания на устройство происходит:

  1. Аппаратная фаза (milliseconds): CPU инициализируется, BIOS запускается
  2. BIOS/UEFI фаза (1-2 seconds): Инициализация оборудования, POST
  3. Bootloader фаза (0.5 seconds): Загрузка kernel в память
  4. Kernel инициализация (1-2 seconds): Memory, interrupts, drivers, filesystems
  5. Init процесс (1-5 seconds): Запуск сервисов
  6. Ready для пользователя (5-30 seconds): Зависит от конфигурации

Понимание этого процесса критично для отладки проблем при загрузке, оптимизации времени boot, разработки драйверов и создания custom embedded систем.

Что происходит после подачи питания на устройство? | PrepBro