синџирот на подигнување кај embedded Linux

July 30, 2026 · посетители

Минатиот пат пишував за DFU како начин за флешување firmware преку USB. Тој напис прескокна едно прашање што заслужува свој одговор: што всушност се случува помеѓу притискањето на копчето за вклучување и појавата на shell prompt? DFU е само едно одвојување од овој пат, па вреди еднаш да се помине целиот.

Фазите

Нацртан како Mermaid дијаграм, синџирот (со местото на DFU во него) изгледа вака:

flowchart TD
    A[Вклучување / Ресетирање] --> B[Boot ROM<br/>непроменлив, на чипот]
    B --> C{Валидна слика на<br/>boot медиум?}
    C -->|Не / присилно| D[ROM режим за опоравување<br/>UART / USB]
    C -->|Да| E[SPL<br/>прв стадиум bootloader]
    E --> F[U-Boot<br/>втор стадиум bootloader]
    F --> G{Влез во DFU?}
    G -->|Да| H[DFU режим<br/>се чека firmware преку USB]
    G -->|Не| I[Вчитување kernel + device tree]
    I --> J[Linux kernel]
    J --> K[Монтирање root датотечен систем]
    K --> L[init / systemd]

И рендирано:

Дијаграм на синџирот на подигнување кај embedded Linux: вклучувањето ресетира до boot ROM-от, кој проверува дали на boot медиумот има валидна слика. Ако не се најде ништо (или е присилно опоравување), паѓа во UART/USB режим за опоравување. Инаку го вчитува SPL, кој го вчитува вистинскиот U-Boot. U-Boot може или да влезе во DFU режим за да чека firmware преку USB, или да ги вчита kernel-от и device tree-то, да го подигне Linux, да го монтира root датотечниот систем, и да предаде на init/systemd.

Boot ROM

Вграден во силициумот при производството — ништо во него не може да се промени подоцна. Единствената задача му е да најде нешто што може да се подигне на еден од мал број boot медиуми (eMMC, SD, QSPI flash, понекогаш USB) според boot-mode пиновите или eFuse-ите, и да скокне до него. Ако не најде ништо валидно, повеќето SoC-ови паѓаат во минимален UART или USB режим за опоравување на овој стадиум — самото прво место каде воопшто можеш да комуницираш со чипот.

SPL

Кратенка за Secondary Program Loader (терминот на U-Boot; други производители го нарекуваат FSBL или слично). Работи од мала количина SRAM на чипот, пред DRAM воопшто да е иницијализиран, па мора да биде мал. Главната задача му е токму тоа: да го активира DRAM-от, па во него да го вчита следниот стадиум — целосниот U-Boot.

Вистинскиот U-Boot

Ова е bootloader-от на кој повеќето луѓе мислат кога велат „bootloader“. Има драјвери, shell, environment променливи, поддршка за мрежа, и интерпретер на команди. Тука всушност живее и DFU — извршувањето на dfu 0 mmc 0 (или слично) го пренесува U-Boot во DFU режим наместо да продолжи со нормалното подигнување, а тоа е режимот со кој dfu-util комуницира од страна на хостот. Инаку, ја вчитува kernel сликата и device tree blob-от во меморија и скока во kernel-от.

Kernel и кориснички простор

Kernel-от сам себеси се декомпресира, го активира конзолата, го испитува хардверот користејќи го device tree-то што му е дадено, и монтира root датотечен систем — честo истата eMMC или SD картичка од која bootloader-от подигнал, понекогаш NFS во текот на развојот. Откако root датотечниот систем ќе биде монтиран, kernel-от предава на PID 1 — обично systemd кај слика изградена со Yocto — и токму таму всушност започнува „корисничкиот простор“.

Зошто е ова важно за DFU

DFU има смисла дури кога ќе видиш каде се вклопува: тоа е заобиколен пат што U-Boot може да го земе наместо да го вчита kernel-от, не одделна работа прикачена одозгора. Тоа е и причината зошто DFU не може да спаси секој начин на неуспех — ако самиот boot ROM не може да најде валиден SPL, никогаш не стигнуваш до U-Boot, и тогаш се потпираш на кој и да е режим за опоравување што boot ROM-от го поддржува (кој многу варира од производител до производител и е добра тема за друг напис).

Понатамошно читање

Поврзани текстови

Коментари