KEXEC_LOAD(2)

ИМЯ
kexec_load - загружает новое ядро для выполнения в будущем

ОБЗОР
#include <linux/kexec.h>
long kexec_load(unsigned long entry, unsigned long nr_segments,
struct kexec_segment *segments, unsigned long flags);

ОПИСАНИЕ
Системный вызов kexec_load() загружает новое ядро, которое можно запустить позже с помощью reboot(2).

Аргумент flags представляет собой маску, чьи старшие биты управляют работой вызова. В flags можно указать следующие значения:

KEXEC_ON_CRASH (начиная с Linux 2.6.13)
    Запускать новое ядро автоматически после «падения» системы.

KEXEC_PRESERVE_CONTEXT (начиная с Linux 2.7.27)
    Сохранять аппаратное и программное состояния перед выполнением нового ядра. Может использоваться для перевода системы в состояние ожидания (suspend). Этот флаг доступен только, если ядро было собрано с параметром CONFIG_KEXEC_JUMP, и работает только, если значение nr_segments больше 0.

В младших битах flags задаётся архитектура, для которой будет выполняться ядро. Константой (через OR) KEXEC_ARCH_DEFAULT задаётся использование текущей архитектуры; также есть другие константы, описывающие архитектуры: KEXEC_ARCH_386, 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. В аргументе segments задаётся массив структур kexec_segment, который определяет разбивку ядра:
struct kexec_segment {
    void   *buf;        /* буфер в пользовательском пространстве */
    size_t  bufsz;      /* размер буфера в пользовательском пространстве */
    void   *mem;        /* физический адрес ядра */
    size_t  memsz;      /* размер ядра */
};

Образ ядра, определённый segments, копируется из вызывающего процесса в ранее зарезервированную память.

ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ
При успешном выполнении kexec_load() возвращается 0. При ошибке возвращается -1, а в errno содержится код ошибки.

ОШИБКИ

EBUSY
    Уже загружено другое crash-ядро или crash-ядро уже используется.

EINVAL
    Неправильное значение flags; или количество nr_segments слишком большое

EPERM
    Вызывающий не имеет мандата CAP_SYS_BOOT.

ВЕРСИИ
Системный вызов kexec_load() впервые появился в 2.6.13.

СООТВЕТСТВИЕ СТАНДАРТАМ
Данный вызов есть только в Linux.

ЗАМЕЧАНИЯ
В настоящее время в glibc нет поддержки вызова kexec_load(). Вызывайте его через syscall(2).

Необходимые для работы константы находятся в файле исходного кода ядра linux/kexec.h, который не экспортируется в glibc. Поэтому данные константы должны определяться вручную. Данный системный вызов доступен только, если ядро было собрано с параметром CONFIG_KEXEC.

СМОТРИТЕ ТАКЖЕ
reboot(2), syscall(2)