Page 1 of 9

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

Posted: Tue Oct 09, 2007 11:43 am
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. Может быть, кто-то один захочет взяться за написание эмулятора целиком. Может быть, вы (линуксоиды) решите разделить работу. (системных функций в Колибри много...) Может быть, никто не захочет ничего делать. Пожалуйста (мне-то что?). Для координации действий предлагаю использовать эту тему.

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

Posted: Wed Oct 24, 2007 12:32 pm
by diamond
Видимо, ситуация всё же не изменилась. Приношу извинения за беспокойство.

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

Posted: Wed Oct 24, 2007 2:14 pm
by k@sTIg@r
Я бы взялся но:
1) по твоим словам я понял что мои познания в области запуска приложений (LDT и остальное) не то что малы, я б даже сказал нулевые, т.к. ничего не понял... да, может быть если подрасчехлится, я бы все понял, т.к. схватываю быстро
2) на данный момент мне больше интересна дисковая система. Да может это будет бесполезно для колибри, но душа туда тянется, я думаю меня многие поймут!

Единственное что могу предложить это реализацию некоторых функций. В свое время разбирался с иксами, правда это было давно, но если один раз разобрался, то ничего не стоит вспомнить!
Ну и ктому же не понятно на какой стадии сейчас O01eg

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

Posted: Sat May 02, 2009 5:32 pm
by Ghost
UP ))
В приложении этот же эмулятор на C + заготовка для X`ов. Есть желание - берите и делайте, у меня пока нет на это времени.
Все нормально компилялось и работало под Fedora 8 и Ubuntu 8.04

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

Posted: Sun May 03, 2009 9:41 pm
by winnt
Супер, буду ждать с нетерпением!

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

Posted: Mon May 04, 2009 12:41 am
by mike.dld
У меня шота есть на фасме, даже работаед kerpack (ну там три функции используюццо). Плюс есть функции типа получения координат курсора. В последнее время тут работу менял и всё такое, не было времени. Посмотрим, может что и выложу.

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

Posted: Tue Mar 27, 2018 11:28 pm
by tsdima
К 10-ти летию моей регистрации на форуме :)

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

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

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

Posted: Tue Mar 27, 2018 11:34 pm
by paulcodeman
tsdima wrote:К 10-ти летию моей регистрации на форуме :)

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

Хотелось бы узнать, кому будет интересен этот проект, сколько человек пользуется линуксом.
годно, давайте еще и под Андроид) Arm жаль :(

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

Posted: Fri Mar 30, 2018 4:01 am
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 не открывает файл проекта.
Пришлось в терминале компилировать.

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

Posted: Fri Mar 30, 2018 12:21 pm
by Leency
> 3. В EOLITE почему-то неправильно отображаются иконки.
Можешь скрин кинуть?

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

Posted: Fri Mar 30, 2018 12:36 pm
by tsdima
По поводу разрешения экрана - у меня несколько дисплеев, соответственно разрешение нереальное, для отладки поставил 1920х1080 и благополучно забыл об этом. Исправлю.
Про EOLITE - действительно, нужен скрин.
CIRCLE - нет функционала прозрачных окон, пока так и должно быть. Если в терминале выскакивают сообщения про mcall, то это вызов нереализованной функции.
По 5-тому пункту - не понял, поясни. У меня работает. Не все окна разрешают растягивание.
Codelite 12 надо будет попробовать, у меня старая 9-тая версия. Скорее всего несовместимый формат. Видимо проект придётся убрать.

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

Posted: Sat Mar 31, 2018 4:27 pm
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

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

Posted: Sat Mar 31, 2018 5:59 pm
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 можно, но что будет на практике - пока не знаю.

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

Posted: Sat Mar 31, 2018 6:00 pm
by tsdima
По поводу растягивания окон, хотелось бы узнать версию Линукса и тип оконного менеджера.

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

Posted: Sun Apr 01, 2018 11:10 am
by 0CodErr
tsdima, ну вообще fNav запускается из-под KlbrInWin(только мышкой не води по нему :) )
Можно сравнить как сделано в KlbrInWin.