TSL

UEFI

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-сервисы.

Смотрите также

  • UEFI — общая картина стадий
  • BDS — предыдущая стадия
  • RT — следующая стадия
  • GRUB 2 — загрузчик, который работает в TSL
  • Ядро — что происходит сразу после передачи управления
Оценка статьи 0

Комментарии

Пока комментариев нет.