Робота з додатками у freebsd, написаними для linux

Робота з додатками у FreeBSD. написаними для Linux

14.5.1. Як все це влаштовано?
FreeBSD підтримує абстракцію, яка називається "завантажувач здійсненних класів", який фактично є першою стадією системного виклику execve (2).

Насправді, FreeBSD має кілька загрузчиков замість одного, який, в разі невдачі, виконує програму як сценарій (скрипт).

Історично склалося, що єдиний завантажувач в UNIX системах перевіряв "магічне число" (найчастіше перші 4 або 8 байт файлу), щоб визначити, чи відомий формат виконуваного файлу системі, і якщо так, то викликав відповідний завантажувач.

Якщо файл не впізнавати системою як виконуваний, execve (2) повертав помилку, і поточний командний інтерпретатор починав виконувати файл як скрипт.

Пізніше, sh (1) був модифікований, так, щоб перевіряти перші два символи в файлі, і якщо вони виявлялися. то файл виконувався як сценарій для csh (1) (стверджується, що SCO були першими, хто зробив цю модифікацію).

FreeBSD поводиться по-іншому: пробігає по списку загрузчиков, включаючи спеціальний #! завантажувач, який викликає потрібний інтерпретатор або / bin / sh, якщо не знайшов підходящого.

Формат файлу FreeBSD визначає по "магічного числа". На цій стадії поки не відрізняється, для якої операційної системи призначений файл (Linux, Solaris, або будь-який інший, що використовує ELF-формат виконуваних файлів).

Відповідно, Linux програми повинні бути "марковані" для Linux (наприклад, за допомогою утиліти brandelf (1)):

# Brandelf -t Linux file

Коли ELF-завантажувач знаходить "марку" Linux, він замінює відповідний покажчик в структурі proc. Всі системні виклики індексуються через цей покажчик (в традиційній UNIX системі, це масив sysent [], який містить системні виклики). Деякі особливі ситуації і системні виклики обробляються спеціальним модулем ядра підтримки Linux.

Плюс до всього, Linux емулятор динамічно "змінює корінь" файлової системи при пошуку файлів (фактично роблячи те ж саме, що і опція union при монтуванні файлових систем (не плутати з unionfs!)). Спершу, файл шукається в директорії / compat / linux / original-path і тільки потім, в разі невдачі, в / original-path. Це дає можливість Linux програмам виконувати FreeBSD команди, якщо не знайдеться відповідних Linux команд. Наприклад, скопіювавши FreeBSD uname (1) в каталог / compat / linux / bin /, можна "змусити" Linux програми повідомляти, що вони запускаються під FreeBSD.

У чому ж різниця між системними викликами Linux і FreeBSD? Фактично ніякої. Єдина відмінність (на даний момент, в майбутньому все може і, ймовірно, зміниться), мабуть, в тому, що функції системних викликів FreeBSD зашиті в ядро, а для Linux вони можуть бути або в ядрі, або в динамічно завантаження модулі.

Чи можна назвати це емуляцією? Ні. Як такий, емулятор (або симулятор) відсутній. В такому випадку, чому ж тоді кажуть "Linux емуляція"? Щоб "насолити" FreeBSD. 8-). Насправді, це питання термінології: не існувало слова, яке б точніше описувало цей процес. Не можна сказати, що FreeBSD запускає додатки Linux (без перекомпіляції або завантаження відповідного модуля ядра). Тоді і придумали термін "Linux емуляція".

Схожі статті