Scroll to navigation

KEXEC_LOAD(2) Руководство программиста Linux 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 можно указать следующие значения:

Запускать новое ядро автоматически после «падения» системы.
Сохранять аппаратное и программное состояния перед выполнением нового ядра. Может использоваться для перевода системы в состояние ожидания (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 содержится код ошибки.

ОШИБКИ

Уже загружено другое crash-ядро или crash-ядро уже используется.
Неправильное значение flags; или количество nr_segments слишком большое
Вызывающий не имеет мандата CAP_SYS_BOOT.

ВЕРСИИ

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

СООТВЕТСТВИЕ СТАНДАРТАМ

Данный вызов есть только в Linux.

ЗАМЕЧАНИЯ

В настоящее время в glibc нет поддержки вызова kexec_load(). Вызывайте его через syscall(2).

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

Данный системный вызов доступен только, если ядро было собрано с параметром CONFIG_KEXEC.

СМОТРИТЕ ТАКЖЕ

reboot(2), syscall(2)

2010-11-04 Linux