ИМЯ
kexec_load, kexec_file_load - загружает новое ядро для выполнения в будущемLIBRARY
Standard C library ( libc, -lc)СИНТАКСИС
#include <linux/kexec.h> /* определения констант KEXEC_* */ #include <sys/syscall.h> /* определения констант SYS_* */ #include <unistd.h>
long syscall(SYS_kexec_load, unsigned long entry, unsigned long nr_segments, struct kexec_segment *segments, unsigned long flags); long syscall(SYS_kexec_file_load, int kernel_fd, int initrd_fd, unsigned long cmdline_len, const char *cmdline, unsigned long flags);Note: glibc provides no wrappers for these system calls, necessitating the use of syscall(2).
ОПИСАНИЕ
Системный вызов kexec_load() загружает новое ядро, которое можно запустить позже с помощью reboot(2). Аргумент flags представляет собой битовую маску, которая управляет работой вызова. В flags можно указать следующие значения:- KEXEC_ON_CRASH (начиная с Linux 2.6.13)
- Запускать новое ядро автоматически после аварии системы. Данное «аварийное ядро» загружено в область зарезервированной памяти, которая определена во время загрузки с помощью параметра командной строки ядра crashkernel. Область данной зарезервированной памяти экспортируется в пространство пользователя через файл /proc/iomem, в элемент с меткой «Crash kernel». Приложение в пользовательском пространстве может проанализировать этот файл и подготовить список сегментов (смотрите далее), которые определяют эту зарезервированную память в качестве приёмника. Если данный флаг установлен, то ядро проверяет входят ли сегменты назначения, указанные в segments, в зарезервированную область.
- KEXEC_PRESERVE_CONTEXT (начиная с Linux 2.6.27)
- Сохранять аппаратное и программное состояния перед выполнением нового ядра. Может использоваться для перевода системы в состояние ожидания (suspend). Этот флаг доступен только, если ядро было собрано с параметром CONFIG_KEXEC_JUMP, и работает только, если значение nr_segments больше 0.
struct kexec_segment { void *buf; /* буфер в пользовательском пространстве */ size_t bufsz; /* размер буфера в пользовательском пространстве */ void *mem; /* физический адрес ядра */ size_t memsz; /* размер ядра */ };
Образ ядра, определённый segments, копируется из вызывающего процесса в обычную память или в зарезервированную память (если определён KEXEC_ON_CRASH). Сначала ядро выполняет различные проверки информации, переданной в segments. Если всё в порядке, то ядро копирует сегмент данных в память ядра. Каждый сегмент, указанный в segments, копируется следующим образом:
- •
- Значения buf и bufsz определяют область памяти в виртуальном адресном пространстве вызывающего, который является источником копирования. Значение bufsz может не превышать значение в поле memsz.
- •
- Значения mem и memsz определяют физическое адресное пространство — приёмник копии. Значения, задаваемые в обоих полях, должны быть кратны размеру системной страницы.
- •
- bufsz байт копируется из буфера источника в буфер назначения ядра. Если bufsz меньше чем memsz, то оставшиеся байты в буфере ядра заполняются нулями.
kexec_file_load()
The kexec_file_load() system call is similar to kexec_load(), but it takes a different set of arguments. It reads the kernel to be loaded from the file referred to by the file descriptor kernel_fd, and the initrd (initial RAM disk) to be loaded from file referred to by the file descriptor initrd_fd. The cmdline argument is a pointer to a buffer containing the command line for the new kernel. The cmdline_len argument specifies size of the buffer. The last byte in the buffer must be a null byte ('\0'). Аргумент flags представляет собой битовую маску, которая изменяет поведение вызова. В flags можно указать следующие значения:- KEXEC_FILE_UNLOAD
- Выгрузить загруженное в данный момент ядро.
- KEXEC_FILE_ON_CRASH
- Загрузить новое ядро в область памяти зарезервированную под аварийное ядро (как для KEXEC_ON_CRASH). Ядро запускается, если отказывает работающее в данный момент ядро.
- KEXEC_FILE_NO_INITRAMFS
- Загрузка initrd/initramfs не обязательна. Установите данный флаг, если не нужно загружать initramfs. Если флаг установлен, то значение, передаваемое в initrd_fd игнорируется.
ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ
При успешном выполнении эти системные вызовы возвращают 0. При ошибке возвращается -1, а в errno содержится код ошибки.ОШИБКИ
- EADDRNOTAVAIL
- Указаны флаги KEXEC_ON_CRASH, но область, заданная полями mem и memsz одного из элементов segments, находится за пределами диапазона памяти, зарезервированного для аварийного ядра.
- EADDRNOTAVAIL
- Значение в поле mem или memsz в одном из элементов segments не кратно размеру системной страницы.
- EBADF
- Значение kernel_fd или initrd_fd не является правильным файловым дескриптором.
- EBUSY
- Уже загружено другое аварийное ядро или аварийное ядро уже используется.
- EINVAL
- Значение flags неверно.
- EINVAL
- Значение поля bufsz одного из элементов segments превышает значение в соответствующем поле memsz.
- EINVAL
- Значение nr_segments превышает KEXEC_SEGMENT_MAX (16).
- EINVAL
- Два или более буфера назначения ядра перекрываются.
- EINVAL
- The value in cmdline[cmdline_len-1] is not '\0'.
- EINVAL
- Файл, на который ссылается kernel_fd или initrd_fd, пуст (нулевой длины).
- ENOEXEC
- Значение kernel_fd не указывает на открытый файл, или ядро не может загрузить этот файл. В настоящее время, файл должен быть в формате и содержать ядро x86, которое можно загрузить в память выше 4 ГиБ (смотрите файл исходного кода ядра Documentation/x86/boot.txt).
- ENOMEM
- Невозможно выделить память.
- EPERM
- Вызывающий не имеет мандата CAP_SYS_BOOT.
ВЕРСИИ
Системный вызов kexec_load() впервые появился в Linux 2.6.13. Системный вызов kexec_file_load() впервые появился в Linux 3.17.СТАНДАРТЫ
Данные системные вызовы есть только в Linux.СМ. ТАКЖЕ
reboot(2), syscall(2), kexec(8) Файлы исходного кода ядра Documentation/kdump/kdump.txt и Documentation/admin-guide/kernel-parameters.txtПЕРЕВОД
Русский перевод этой страницы руководства был сделан Alex Nik <[email protected]>, Azamat Hackimov <[email protected]>, Yuri Kozlov <[email protected]> и Иван Павлов <[email protected]> Этот перевод является бесплатной документацией; прочитайте Стандартную общественную лицензию GNU версии 3 или более позднюю, чтобы узнать об условиях авторского права. Мы не несем НИКАКОЙ ОТВЕТСТВЕННОСТИ. Если вы обнаружите ошибки в переводе этой страницы руководства, пожалуйста, отправьте электронное письмо на [email protected]5 февраля 2023 г. | Linux man-pages 6.03 |