Однако, не составляет труда обучить ядро Linux запускать любые другие исполняемые файлы (.exe файлы для Windows, скрипты на shell, python, байткод java и т.д.) без явного указание эмулятора Т.е. в командной строке можно просто написать ./notepad.exe или ./my_script.py.
Для этого нужно обеспечить ядро необходимой информацией о формате исполняемого файла, и о том, каким образом и с помощью чего его можно интерпретировать.
Что для этого нужно?
1. Для этого нужно включить в ядре поддержку остальных исполняемых форматов:
В секции Executable file formats / Emulation-->
Опция
Можно или встроить эту возможность в ядро, или оформить ее в качестве отдельного модуля. Модуль будет называться binfmt_misc.
2. Подмонтировать файловую систему binfmt_misc в каталог /proc:
mount binfmt_misc -t binfmt_misc /proc/sys/fs/binfmt_misc
3. Перейти в каталог /proc/sys/fs/binfmt_misc. У вас тут должно лежать два файла: register и status
4. Описать формат и интерпретатор для этого формата:
Для того что зарегистрировать новый формат исполняемого файла и интерпретатор для него нужно добавить в файл register строку в формате:
:name:type:offset:magic:mask:interpreter:flags
Вот что значат приведенные поля:
- 'name' - строковый идентификатор. В каталоге /proc/sys/fs/binfmt_misc будет создан новый файл с именем name
- 'type' - способ распознавания. Может быть 'M' для волшебства и 'E' для расширения.
- 'offset' - смещение маски в файле,считается в байтах. Этот параметр по умолчанию равен 0, если вы его не указываете (например: ':name:type::magic...')
- 'magic' - последовательность байт для соответствия которой и определяется binfmt_misc. Строка поля magic может содержать шестнадцатириные символы, такие как \x0a или \xA4.
- 'mask' маска (опциональна, по умолчанию имеет значение 0xff) . Добавляя строку как в поле magic и такой же длины, вы можете маскировать соответствие некоторых битов файла.
- 'interpreter' - программа, которая должна быть выполнена вместе с исполняемым фалйлом, как первый аргумент (Необходимо указывать полный путь)
- 'flags' - опциональное поле, которое контролирует нектороые аспекты вызова интерпретатора
':DOSWin:M::MZ::/usr/bin/wine:
Вот так:
echo ':DOSWin:M::MZ::/usr/bin/wine:' > register
Теперь в каталоге /proc/sys/fs/binfmt_misc у нас появился файл DOSWin следующего содержания:
$bash: cat DOSWin
enabled
interpreter /usr/bin/wine
flags:
offset 0
magic 4d5a
После всего этого в командной строке можно написать ./notepad.exe и у вас запустится notepad с помощью wine'a.
5. Для того, чтобы binfmt_misc не пришлось монтировать каждый раз вручную, в /etc/fstab можно добавить вот такую строчку:
none /proc/sys/fs/binfmt_misc binfmt_misc defaults 0 0
6. Для того, чтобы отключить интерпретацию формата, нужно записать 0 в появившийся файл:
7. Для того чтобы удалить формат, нужно записать -1 в имя файла этого формата:
echo -1 > DOSWin
а wine не проще ли установить
ОтветитьУдалитьнет
УдалитьА вы внимательней прочитайте ;-)
ОтветитьУдалитьКак раз установленный wine и используется.
Вообще wine используется в качастве примера.
По сути wine ставится не как программа, а как модуль...или я не правильно понял?
ОтветитьУдалитьwine ставится как программа и она работает в пространстве пользователя.
УдалитьУ каждого исполняемого файла есть заголовок.
По этому заголовку ядро определяет какой "интерпретатор" для исполняемого файла вызвать.
По умолчанию для ELF файлов вызывается ld-linux.so.
А здесь мы ядру сказали, что если оно встрети PE executable коим является виндовый exe-шник, то ему следует вызвать wine чтобы запустить такой исполняемый файл.
а как войти в секцию Executable file formats?
ОтветитьУдалить