Эмулятор под Linux

Running Kolibri and its programs in other OSes
Post Reply
User avatar
diamond
Kernel Developer
Posts: 1600
Joined: Mon Nov 28, 2005 8:00 pm

Эмулятор под Linux

Post by diamond »

Я - виндоузятник. В качестве такового я написал известный, думаю, абсолютному большинству участников этого форума эмулятор KlbrInWin (который, кстати, считаю своей лучшей программой). С Linux'ом я связываюсь только если я вынужден это сделать либо мне за это платят. Так что чего-нибудь похожего под Linux я писать не собираюсь.
Тем не менее я признаю право на существование линуксоидов. На этом форуме таковые, насколько я знаю, есть. Кроме того, я считаю себя крутым системным программистом (не без оснований). Какое-то время назад я придумал (основываясь на знаниях, полученных в общем-то случайно) метод эмуляции Колибри-бинарников под Linux (в смысле, решение двух основных проблем: загрузки бинарника по нулевому адресу и перехвата int 0x40, причём без полной эмуляции процессора, требующей дополнительно кучи усилий по кодированию и тормозящей). Поскольку сам я этим пользоваться не собираюсь, то потратил некоторое количество времени на написание работающего примера (писал, естественно, под виндой) и комментариев к коду (предупреждение: комментарии у меня по жизни получаются плохо, но я старался) и теперь предлагаю любому, кто захочет, изучить этот пример и заняться на его базе разработкой.

1. Запуск с нулевого адреса. Идея в том, что "настоящий" адрес программы ненулевой, но можно исполнять программу с не-плоскими cs,ds,es,ss: создать дескриптор в LDT с базой, равной "настоящему" адресу, по которому загружена Колибри-программа, и лимитом, равным размеру памяти, требуемой Колибри-программе. LDT можно модифицировать системным вызовом sys_modify_ldt, для которого в libc есть обёртка modify_ldt. Фактически требуются два дескриптора: для кода и для данных. Передача управления делается ассемблерной вставкой.
2. Перехват int 0x40. В Linux int 0x40 означает исключение #GP, которое Linux обрабатывает как сигнал SIGSEGV. Можно установить свой обработчик сигнала через sys_sigaction - аналог в libc называется sigaction. Только при этом нужно во флагах структуры sigaction установить флаг SS_ONSTACK и определить через sys_sigaltstack - обёртка в libc именуется sigaltstack, можно также sigstack - стек, на который будет переключение при вызове обработчика, конкретно область памяти размера минимум 2 Кб (рекомендуется, скажем, 32 Кб), которая станет стеком обработчика.

http://diamondz.land.ru/linuxemuldemo.7z
Примечания:
1. Поскольку на моём компе Linux существует только в виде мини-образа под Bochs и исходников ядра, то Си-компилятора, способного генерировать ELF, у меня нет, равно как и заголовочных файлов. Так что пример написан на FASM'е и системных вызовах. Надеюсь, впрочем, что основные идеи оттуда всё же можно понять.
2. Пример для простоты не мучается с загрузкой Колибри-бинарника и файлов вообще, а эмулируемый код включается как файл. Он начинается с сигнатуры "MENUET01", а точкой входа считается смещение 8 (сразу после сигнатуры).
3. Я тестировал этот код в вышеупомянутом мини-образе, а также на двух различных реальных Linux-системах (причём ни в одной их этих систем прав root'а у меня не было совсем), одной древней и одной относительно новой. Работало.

Организационные замечания:
1. В теме про KlbrInWin довольно давно O01eg заявил, что написал бы эмулятор при условии решения двух вышеупомянутых проблем. Когда я придумал вышеупомянутый способ, я сообщил об этом O01eg'у (было это пару месяцев назад). В ответном сообщении было сказано, что он от своих слов не отказывается, но Linux временно не работает из-за проблем с железом. Так что, возможно, эмулятор уже пишется, а я тут своим постом весь сюрприз сбиваю. В таком случае прошу прощения и обращаю внимание форума на приоритет O01eg'а.
2. Когда меня на этом форуме ещё не было, а MeOSEmul (Windows-эмулятор, решающий вышеупомянутые проблемы эмуляцией процессора) был ещё жив, в соответствующей теме был вопрос о портировании под Linux, тем более что эмуляция процессора системно-независима. Тогда за это никто не взялся. С того времени прошло несколько лет, на форуме появилось много народу (в том числе добавилось несколько активных людей), а некоторые, возможно, изменили своё отношение к этой оси и уж точно изменили приоритеты задач. Возможно, в этот раз ситуация всё-таки изменится к лучшему?
3. Может быть, кто-то один захочет взяться за написание эмулятора целиком. Может быть, вы (линуксоиды) решите разделить работу. (системных функций в Колибри много...) Может быть, никто не захочет ничего делать. Пожалуйста (мне-то что?). Для координации действий предлагаю использовать эту тему.
Ушёл к умным, знающим и культурным людям.
User avatar
diamond
Kernel Developer
Posts: 1600
Joined: Mon Nov 28, 2005 8:00 pm

Re: Эмулятор под Linux

Post by diamond »

Видимо, ситуация всё же не изменилась. Приношу извинения за беспокойство.
k@sTIg@r
Posts: 188
Joined: Wed Feb 21, 2007 3:03 pm

Re: Эмулятор под Linux

Post by k@sTIg@r »

Я бы взялся но:
1) по твоим словам я понял что мои познания в области запуска приложений (LDT и остальное) не то что малы, я б даже сказал нулевые, т.к. ничего не понял... да, может быть если подрасчехлится, я бы все понял, т.к. схватываю быстро
2) на данный момент мне больше интересна дисковая система. Да может это будет бесполезно для колибри, но душа туда тянется, я думаю меня многие поймут!

Единственное что могу предложить это реализацию некоторых функций. В свое время разбирался с иксами, правда это было давно, но если один раз разобрался, то ничего не стоит вспомнить!
Ну и ктому же не понятно на какой стадии сейчас O01eg
User avatar
Ghost
Kernel Developer
Posts: 558
Joined: Mon Mar 20, 2006 10:44 am

Re: Эмулятор под Linux

Post by Ghost »

UP ))
В приложении этот же эмулятор на C + заготовка для X`ов. Есть желание - берите и делайте, у меня пока нет на это времени.
Все нормально компилялось и работало под Fedora 8 и Ubuntu 8.04
Attachments
kolibrinix.zip
(6.22 KiB) Downloaded 554 times
winnt
Posts: 59
Joined: Wed Jan 04, 2006 12:25 pm

Re: Эмулятор под Linux

Post by winnt »

Супер, буду ждать с нетерпением!
User avatar
mike.dld
Site Founder
Posts: 693
Joined: Sun Aug 08, 2004 8:55 am

Re: Эмулятор под Linux

Post by mike.dld »

У меня шота есть на фасме, даже работаед kerpack (ну там три функции используюццо). Плюс есть функции типа получения координат курсора. В последнее время тут работу менял и всё такое, не было времени. Посмотрим, может что и выложу.
in code we trust
tsdima
Posts: 262
Joined: Wed Mar 26, 2008 12:44 pm

Re: Эмулятор под Linux

Post by tsdima »

К 10-ти летию моей регистрации на форуме :)

Не прошло и три года (прошло десять лет). Наконец-то решился выложить результаты на GitHub. Разрабатывалось под Убунтой. Пока только для x64, собирать для x32 не пробовал (будут 100% ошибки).

Хотелось бы узнать, кому будет интересен этот проект, сколько человек пользуется линуксом.
User avatar
paulcodeman
Posts: 266
Joined: Wed Apr 15, 2015 11:13 pm

Re: Эмулятор под Linux

Post by paulcodeman »

tsdima wrote:К 10-ти летию моей регистрации на форуме :)

Не прошло и три года (прошло десять лет). Наконец-то решился выложить результаты на GitHub. Разрабатывалось под Убунтой. Пока только для x64, собирать для x32 не пробовал (будут 100% ошибки).

Хотелось бы узнать, кому будет интересен этот проект, сколько человек пользуется линуксом.
годно, давайте еще и под Андроид) Arm жаль :(
JohnXenox
Posts: 200
Joined: Thu May 18, 2017 2:29 am

Re: Эмулятор под Linux

Post by JohnXenox »

tsdima wrote:К 10-ти летию моей регистрации на форуме :)

Не прошло и три года (прошло десять лет). Наконец-то решился выложить результаты на GitHub. Разрабатывалось под Убунтой. Пока только для x64, собирать для x32 не пробовал (будут 100% ошибки).

Хотелось бы узнать, кому будет интересен этот проект, сколько человек пользуется линуксом.
Опаньки. Круто. :D

Немного потестировал, и вот, что выяснил:
1. CROWNSCR и WEB отображаются не в том разрешении, которое должно быть. Видимо неправильно работает определение разрешения экрана.
2. ACLOCK при запуске улетает за пределы экрана, но не полностью (правый угол). Скорее всего по той же причине, что и пункт 1.
3. В EOLITE почему-то неправильно отображаются иконки.
4. CIRCLE почему-то квадратный.
5. Не работает растягивание и максимизация окон.

Возможно что-то упустил, но, в освном, программы работают замечательно.

P.S. На гитхабе написано "If you have installed CodeLite simply open project file and build it."
Хотел так сделать. Поставил Codelite 12.0, но не вышло. У меня Codelite не открывает файл проекта.
Пришлось в терминале компилировать.
The Glass is Always Half Full! :mrgreen:
User avatar
Leency
Designer
Posts: 5731
Joined: Thu Jan 25, 2007 3:33 pm
Has thanked: 2 times

Re: Эмулятор под Linux

Post by Leency »

> 3. В EOLITE почему-то неправильно отображаются иконки.
Можешь скрин кинуть?
Sapiens dominabitur astris
tsdima
Posts: 262
Joined: Wed Mar 26, 2008 12:44 pm

Re: Эмулятор под Linux

Post by tsdima »

По поводу разрешения экрана - у меня несколько дисплеев, соответственно разрешение нереальное, для отладки поставил 1920х1080 и благополучно забыл об этом. Исправлю.
Про EOLITE - действительно, нужен скрин.
CIRCLE - нет функционала прозрачных окон, пока так и должно быть. Если в терминале выскакивают сообщения про mcall, то это вызов нереализованной функции.
По 5-тому пункту - не понял, поясни. У меня работает. Не все окна разрешают растягивание.
Codelite 12 надо будет попробовать, у меня старая 9-тая версия. Скорее всего несовместимый формат. Видимо проект придётся убрать.
JohnXenox
Posts: 200
Joined: Thu May 18, 2017 2:29 am

Re: Эмулятор под Linux

Post by JohnXenox »

Leency wrote:Можешь скрин кинуть?
tsdima wrote:Про EOLITE - действительно, нужен скрин.
Немножко неточно выразился. Я имел ввиду, что отображаются не те иконки файлов и папок, которые должны быть.
Вот собственно скрин:

Image
tsdima wrote:По поводу разрешения экрана - у меня несколько дисплеев, соответственно разрешение нереальное, для отладки поставил 1920х1080 и благополучно забыл об этом. Исправлю.
Было бы неплохо.
tsdima wrote:CIRCLE - нет функционала прозрачных окон, пока так и должно быть.
Если в терминале выскакивают сообщения про mcall, то это вызов нереализованной функции.
Codelite 12 надо будет попробовать, у меня старая 9-тая версия. Скорее всего несовместимый формат. Видимо проект придётся убрать.
Ясно.
tsdima wrote:По 5-тому пункту - не понял, поясни. У меня работает. Не все окна разрешают растягивание.
Ну например, не максимизируются и не растягиваются окна: tinypad, t_edit, eolite, kfm, kfar, heed и т.д.
Даже пробовал пример EXAMPLE.ASM, предворительно модифицировав mov edx, 0x14ffffff на mov edx, 0x13ffffff.

FNAV покзывает кракозябры.

Image

GAME_CENTER не полностью показывается.

Image

FB2READ не запускается. Пишет, что не найден RasterWorks.obj, но он есть, я проверял. Видимо, всё дело в чувствительности к регистру. Потому, что уменя RASTERWORKS.OBJ в вверхнем регистре.

UNZ тоже не запускается.

Image
The Glass is Always Half Full! :mrgreen:
tsdima
Posts: 262
Joined: Wed Mar 26, 2008 12:44 pm

Re: Эмулятор под Linux

Post by tsdima »

JohnXenox wrote:Видимо, всё дело в чувствительности к регистру.
Да, забыл сказать, есть такая проблема. Однако если не копировать файлы из образа, а прямо смонтировать его в ~/.kex/root/RD/1, то этой проблемы не заметно (я кстати не знал, что если смонтировать образ c FAT, то обращение к файлам станет регистронезависимым). Я открываю образы "Disk Image Mounter"-ом, они монтируются в /media, а в каталоге ~/.kex/root/RD/ я сделал линк на каталог в /media (1 -> /media/user/KOLIBRI). Образы монтируются только для чтения, но это вроде не проблема, можно создать каталог /RD/2 и там файлы сохранять.

Проблема с иконками и game center скорее всего тоже из-за чувствительности к регистру.

На данный момент короткие имена приводятся к верхнему регистру, а длинные, типа RasterWorks.obj оставляю как есть. Но по-хорошему, надо бы считывать каталог и искать имя без учёта регистра и потом использовать то, что найдено. Только мне кажется, это будет замедлять работу.

С fNav да, какая-то непонятная хрень, вроде бы используются только реализованные функции, и вроде бы я их полностью реализовал. Но не работает. Жаль исходников fNav нет.

Не работают программы, которые используют fs: (в основном Си-шные) и gs: (три игрушки от codemaster-а). Пока не знаю, решаемо ли. Использовать rdfsbase/wrfsbase можно, но что будет на практике - пока не знаю.
tsdima
Posts: 262
Joined: Wed Mar 26, 2008 12:44 pm

Re: Эмулятор под Linux

Post by tsdima »

По поводу растягивания окон, хотелось бы узнать версию Линукса и тип оконного менеджера.
0CodErr
Posts: 1498
Joined: Sun Oct 30, 2011 6:43 pm

Re: Эмулятор под Linux

Post by 0CodErr »

tsdima, ну вообще fNav запускается из-под KlbrInWin(только мышкой не води по нему :) )
Можно сравнить как сделано в KlbrInWin.
Post Reply

Who is online

Users browsing this forum: No registered users and 0 guests