KEXEC_LOAD(2) | Руководство программиста Linux | KEXEC_LOAD(2) |
kexec_load, kexec_file_load - загружает новое ядро для выполнения в будущем
#include <linux/kexec.h>
long kexec_load(unsigned long entry, unsigned long nr_segments, struct kexec_segment *segments, unsigned long flags);
long kexec_file_load(int kernel_fd, int initrd_fd, unsigned long cmdline_len, const char *cmdline, unsigned long flags);
Замечание: В glibc нет обёрточных функций для этих системных вызовов; смотрите ЗАМЕЧАНИЯ.
Системный вызов kexec_load() загружает новое ядро, которое можно запустить позже с помощью reboot(2).
Аргумент flags представляет собой битовую маску, которая управляет работой вызова. В flags можно указать следующие значения:
В старших битах (соответствуют маске 0xffff0000) flags задаётся архитектура, на которой будет выполняться ядро. Константой (через OR) KEXEC_ARCH_DEFAULT задаётся использование текущей архитектуры; также есть другие константы, описывающие архитектуры: KEXEC_ARCH_386, KEXEC_ARCH_68K, KEXEC_ARCH_X86_64, KEXEC_ARCH_PPC, KEXEC_ARCH_PPC64, KEXEC_ARCH_IA_64, KEXEC_ARCH_ARM, KEXEC_ARCH_S390, KEXEC_ARCH_SH, KEXEC_ARCH_MIPS и KEXEC_ARCH_MIPS_LE.Архитектура должна быть работоспособна на ЦП системы.
В аргументе entry задаётся физический адрес точки входа в образе ядра. В аргументе nr_segments задаётся количество сегментов, на которые указывает указатель segments; ядро введено (произвольно) ограничение в 16 сегментов. В аргументе segments задаётся массив структур kexec_segment, который определяет разметку ядра:
struct kexec_segment { void *buf; /* буфер в пользовательском пространстве */ size_t bufsz; /* размер буфера в пользовательском пространстве */ void *mem; /* физический адрес ядра */ size_t memsz; /* размер ядра */ };
Образ ядра, определённый segments, копируется из вызывающего процесса в обычную память или в зарезервированную память (если определён KEXEC_ON_CRASH). Сначала ядро выполняет различные проверки информации, переданной в segments. Если всё в порядке, то ядро копирует сегмент данных в память ядра. Каждый сегмент, указанный в segments, копируется следующим образом:
При обычной работе kexec (т. е., флаг не установлен KEXEC_ON_CRASH) сегмент данных загружен в любую доступную память и перемещение выполняется в конечное назначение во время перезагрузки kexec (например, при выполнении команды kexec(8) с параметром -e).
При панике kexec (т. е., флаг KEXEC_ON_CRASH установлен)сегмент данных загружен в зарезервированную память на момент вызова, и, после падения (crash), механизм kexec просто передаёт управление ядру.
Системный вызов kexec_load() доступен только, если ядро было собрано с параметром CONFIG_KEXEC.
Системный вызов kexec_file_load() подобен kexec_load(), но имеет другой набор параметров. Он читает загружаемое ядро из файла, на который указывает файловый дескриптор kernel_fd, а initrd (начальный диск RAM) будет загружен из файла, на который указывает файловый дескриптор initrd_fd. Параметр cmdline является указателем на буфер, содержащий командную строку для нового ядра. В параметре cmdline_len указывает размер буфера. Последний байт буфера должен быть null ('\0').
Аргумент flags представляет собой битовую маску, которая изменяет поведение вызова. В flags можно указать следующие значения:
Системный вызов kexec_file_load() был добавлен для поддержки систем, где загрузка «kexec» должна быть ограничена только подписанными ядрами. Данный системный вызов доступен только, если ядро собрано с параметром CONFIG_KEXEC_FILE.
При успешном выполнении эти системные вызовы возвращают 0. При ошибке возвращается -1, а в errno содержится код ошибки.
Системный вызов kexec_load() впервые появился в Linux 2.6.13. Системный вызов kexec_file_load() впервые появился в Linux 3.17.
Данные системные вызовы есть только в Linux.
В настоящее время в glibc нет поддержки данных системных вызовов. Вызывайте их через syscall(2).
reboot(2), syscall(2), kexec(8)
Файлы исходного кода ядра Documentation/kdump/kdump.txt и Documentation/admin-guide/kernel-parameters.txt
2019-03-06 | Linux |