Зарегистрированный пользовательский исполняемый формат также описывается объектом типа `linux_binfmt`?
Понимание ядра Linux говорит
Исполняемый формат описывается объектом типа
linux_binfmt
, который по существу обеспечивает три метода:load_binary
,load_shlib
, а такжеcore_dump
,
а также
Linux позволяет пользователям регистрировать свои собственные исполняемые форматы. Чтобы зарегистрировать новый формат, пользователь записывает в файл реестра специальной файловой системы binfmt_misc (обычно монтируется на
/proc/sys/fs/binfmt_misc
) строка в следующем формате::name:type:offset:string:mask:interpreter:flags
Когда ядро определяет, что исполняемый файл имеет собственный формат, оно запускает соответствующую программу интерпретатора. Программа интерпретатора работает в режиме пользователя, получает в качестве параметра путь к исполняемому файлу и выполняет вычисления. Например, исполняемый файл, содержащий программу Java, обрабатывается виртуальной машиной Java, такой как
/usr/lib/java/bin/java
,
Хотя это не упоминает об этом, это зарегистрированный пользовательский исполняемый формат, также описываемый объектом типа linux_binfmt
?
Если да, регистрация пользовательского исполняемого формата не требует от нас явного предоставления load_binary
, load_shlib
, а также core_dump
методы. Три метода созданы неявно из регистрации?
Без load_binary
метод, какой метод вызывает ядро для выполнения исполняемых файлов зарегистрированного исполняемого формата через соответствующий интерпретатор?
Благодарю.
1 ответ
В binfmt-misc
случай, linux_binfmt
объект соответствует binfmt-misc
сам модуль. Модули не должны обеспечивать реализацию всех функций; binfmt-misc
только объявляет о реализации load_binary
:
static struct linux_binfmt misc_format = {
.module = THIS_MODULE,
.load_binary = load_misc_binary,
};
(binfmt_script
, которая реализует поддержку сценариев на основе shebang, имеет аналогичное объявление.)
load_misc_binary
имеет дело со спецификой всех зарегистрированных исполняемых типов, когда ядро вызывает ее. Ядро вызывает load_misc_binary
и затем эта функция находит соответствующий зарегистрированный исполняемый тип, если таковой имеется, загружает соответствующий интерпретатор и устанавливает среду выполнения соответствующим образом.