TSL
TSL (Transient System Load) — пятая стадия работы прошивки UEFI: загрузчик и ядро уже запущены, но работают на сервисах прошивки. «Transient» — временная: стадия живёт ровно до того момента, как ядро откажется от этих сервисов.
Начинается TSL там, где BDS запустил образ загрузчика, и заканчивается вызовом ExitBootServices().
Кто здесь работает
- GRUB 2 — обычное UEFI-приложение: читает
grub.cfg, грузит ядро и initramfs в память, передаёт параметры; - systemd-boot, rEFInd, Windows Boot Manager — любой загрузчик; в этой стадии они не отличаются;
- само ядро Linux — у него есть встроенный EFI stub: ядро умеет запускаться напрямую как UEFI-приложение, без загрузчика. Тогда TSL — это уже работа ядра.
Чем TSL отличается от «загрузчик получил управление»
Тем, что прошивка никуда не ушла. В BIOS загрузчику отдавали управление «насовсем»: прошивка своё дело сделала и больше не участвовала. В UEFI всё иначе — загрузчик работает как приложение в среде прошивки и пользуется её сервисами:
| Что нужно загрузчику | Чем он пользуется |
|---|---|
| Прочитать файл с диска | Simple File System, Block I/O |
| Вывести меню на экран | Graphics Output |
| Принять нажатие клавиши | Simple Text Input, Simple Pointer |
| Прочитать или записать переменные | Runtime Services: GetVariable / SetVariable |
| Загрузить и запустить образ | LoadImage / StartImage |
Поэтому GRUB видит файлы на ESP и на любом другом разделе, который умеет читать прошивка, — без собственных драйверов.
Как TSL заканчивается
Ядро Linux, получив управление, поднимает собственные драйверы (в том числе свой драйвер диска и файловой системы) и в какой-то момент вызывает ExitBootServices():
- Boot Services перестают существовать — память, протоколы и
LoadImageбольше недоступны; - остаются только Runtime Services — начинается стадия RT;
- прошивка теряет возможность влиять на ход загрузки — это и есть настоящая граница между прошивкой и операционной системой.
Вызов может не пройти: ядру нужно передать «ключ» карты памяти, полученный через GetMemoryMap(). Если между получением карты и вызовом кто-то выделил память, ключ устаревает, и ExitBootServices() возвращает ошибку. Это классическая причина сообщения «ExitBootServices failed» — обычно виноват драйвер или загрузчик.
Что видно в системе
# сообщения EFI-стаба и момент передачи управления
journalctl -k -b | grep -i -E "efi|efistub" | head
# что прошивка успела оставить после себя
ls /sys/firmware/efi/
# параметры, с которыми запустили ядро
cat /proc/cmdline
Если что-то пошло не так
- меню загрузчика не появилось — это ещё BDS: он не нашёл рабочую запись;
- GRUB есть, а ядро не грузится — это TSL: неверный путь в
grub.cfg, повреждённый initramfs, не найден корень; - ядро паникует сразу — чаще всего дело в initramfs или в параметрах
root=; - «ExitBootServices failed» — см. выше: конфликт карты памяти.
Всё, что происходит до этого вызова, видно только в журнале ядра (journalctl -k -b) — это ранние сообщения, которые система пишет ещё до старта systemd.
Итог стадии
К концу TSL: ядро загружено и работает, ExitBootServices() вызван, Boot Services отключены. Дальше — RT, где операционная система работает уже самостоятельно, а от прошивки остаются только runtime-сервисы.
Комментарии
Пока комментариев нет.