Я - виндоузятник. В качестве такового я написал известный, думаю, абсолютному большинству участников этого форума эмулятор 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. Может быть, кто-то один захочет взяться за написание эмулятора целиком. Может быть, вы (линуксоиды) решите разделить работу. (системных функций в Колибри много...) Может быть, никто не захочет ничего делать. Пожалуйста (мне-то что?). Для координации действий предлагаю использовать эту тему.
Эмулятор под Linux
-
Ушёл к умным, знающим и культурным людям.
Видимо, ситуация всё же не изменилась. Приношу извинения за беспокойство.
Я бы взялся но:
1) по твоим словам я понял что мои познания в области запуска приложений (LDT и остальное) не то что малы, я б даже сказал нулевые, т.к. ничего не понял... да, может быть если подрасчехлится, я бы все понял, т.к. схватываю быстро
2) на данный момент мне больше интересна дисковая система. Да может это будет бесполезно для колибри, но душа туда тянется, я думаю меня многие поймут!
Единственное что могу предложить это реализацию некоторых функций. В свое время разбирался с иксами, правда это было давно, но если один раз разобрался, то ничего не стоит вспомнить!
Ну и ктому же не понятно на какой стадии сейчас O01eg
1) по твоим словам я понял что мои познания в области запуска приложений (LDT и остальное) не то что малы, я б даже сказал нулевые, т.к. ничего не понял... да, может быть если подрасчехлится, я бы все понял, т.к. схватываю быстро
2) на данный момент мне больше интересна дисковая система. Да может это будет бесполезно для колибри, но душа туда тянется, я думаю меня многие поймут!
Единственное что могу предложить это реализацию некоторых функций. В свое время разбирался с иксами, правда это было давно, но если один раз разобрался, то ничего не стоит вспомнить!
Ну и ктому же не понятно на какой стадии сейчас O01eg
UP ))
В приложении этот же эмулятор на C + заготовка для X`ов. Есть желание - берите и делайте, у меня пока нет на это времени.
Все нормально компилялось и работало под Fedora 8 и Ubuntu 8.04
В приложении этот же эмулятор на C + заготовка для X`ов. Есть желание - берите и делайте, у меня пока нет на это времени.
Все нормально компилялось и работало под Fedora 8 и Ubuntu 8.04
- Attachments
-
-
kolibrinix.zip (6.22 KiB)Downloaded 719 times
-
Супер, буду ждать с нетерпением!
У меня шота есть на фасме, даже работаед kerpack (ну там три функции используюццо). Плюс есть функции типа получения координат курсора. В последнее время тут работу менял и всё такое, не было времени. Посмотрим, может что и выложу.
in code we trust
К 10-ти летию моей регистрации на форуме ![Smile :)](./images/smilies/icon_smile.gif)
Не прошло и три года (прошло десять лет). Наконец-то решился выложить результаты на GitHub. Разрабатывалось под Убунтой. Пока только для x64, собирать для x32 не пробовал (будут 100% ошибки).
Хотелось бы узнать, кому будет интересен этот проект, сколько человек пользуется линуксом.
![Smile :)](./images/smilies/icon_smile.gif)
Не прошло и три года (прошло десять лет). Наконец-то решился выложить результаты на GitHub. Разрабатывалось под Убунтой. Пока только для x64, собирать для x32 не пробовал (будут 100% ошибки).
Хотелось бы узнать, кому будет интересен этот проект, сколько человек пользуется линуксом.
годно, давайте еще и под Андроид) Arm жальtsdima wrote:К 10-ти летию моей регистрации на форуме
Не прошло и три года (прошло десять лет). Наконец-то решился выложить результаты на GitHub. Разрабатывалось под Убунтой. Пока только для x64, собирать для x32 не пробовал (будут 100% ошибки).
Хотелось бы узнать, кому будет интересен этот проект, сколько человек пользуется линуксом.
![Sad :(](./images/smilies/icon_sad.gif)
Технологии меняют мир, а я - меняю технологии.
Опаньки. Круто.tsdima wrote:К 10-ти летию моей регистрации на форуме
Не прошло и три года (прошло десять лет). Наконец-то решился выложить результаты на GitHub. Разрабатывалось под Убунтой. Пока только для x64, собирать для x32 не пробовал (будут 100% ошибки).
Хотелось бы узнать, кому будет интересен этот проект, сколько человек пользуется линуксом.
![Very Happy :D](./images/smilies/icon_biggrin.gif)
Немного потестировал, и вот, что выяснил:
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! ![Mr. Green :mrgreen:](./images/smilies/icon_mrgreen.gif)
![Mr. Green :mrgreen:](./images/smilies/icon_mrgreen.gif)
> 3. В EOLITE почему-то неправильно отображаются иконки.
Можешь скрин кинуть?
Можешь скрин кинуть?
Из хаоса в космос
По поводу разрешения экрана - у меня несколько дисплеев, соответственно разрешение нереальное, для отладки поставил 1920х1080 и благополучно забыл об этом. Исправлю.
Про EOLITE - действительно, нужен скрин.
CIRCLE - нет функционала прозрачных окон, пока так и должно быть. Если в терминале выскакивают сообщения про mcall, то это вызов нереализованной функции.
По 5-тому пункту - не понял, поясни. У меня работает. Не все окна разрешают растягивание.
Codelite 12 надо будет попробовать, у меня старая 9-тая версия. Скорее всего несовместимый формат. Видимо проект придётся убрать.
Про EOLITE - действительно, нужен скрин.
CIRCLE - нет функционала прозрачных окон, пока так и должно быть. Если в терминале выскакивают сообщения про mcall, то это вызов нереализованной функции.
По 5-тому пункту - не понял, поясни. У меня работает. Не все окна разрешают растягивание.
Codelite 12 надо будет попробовать, у меня старая 9-тая версия. Скорее всего несовместимый формат. Видимо проект придётся убрать.
Leency wrote:Можешь скрин кинуть?
Немножко неточно выразился. Я имел ввиду, что отображаются не те иконки файлов и папок, которые должны быть.tsdima wrote:Про EOLITE - действительно, нужен скрин.
Вот собственно скрин:
![Image](https://image.ibb.co/m3EWS7/Screenshot_2018_03_31_06_07_54.png)
Было бы неплохо.tsdima wrote:По поводу разрешения экрана - у меня несколько дисплеев, соответственно разрешение нереальное, для отладки поставил 1920х1080 и благополучно забыл об этом. Исправлю.
Ясно.tsdima wrote:CIRCLE - нет функционала прозрачных окон, пока так и должно быть.
Если в терминале выскакивают сообщения про mcall, то это вызов нереализованной функции.
Codelite 12 надо будет попробовать, у меня старая 9-тая версия. Скорее всего несовместимый формат. Видимо проект придётся убрать.
Ну например, не максимизируются и не растягиваются окна: tinypad, t_edit, eolite, kfm, kfar, heed и т.д.tsdima wrote:По 5-тому пункту - не понял, поясни. У меня работает. Не все окна разрешают растягивание.
Даже пробовал пример EXAMPLE.ASM, предворительно модифицировав mov edx, 0x14ffffff на mov edx, 0x13ffffff.
FNAV покзывает кракозябры.
![Image](https://preview.ibb.co/i0rvn7/Screenshot_2018_03_31_15_05_05.png)
GAME_CENTER не полностью показывается.
![Image](https://preview.ibb.co/fx9sZn/Screenshot_2018_03_31_15_03_37.png)
FB2READ не запускается. Пишет, что не найден RasterWorks.obj, но он есть, я проверял. Видимо, всё дело в чувствительности к регистру. Потому, что уменя RASTERWORKS.OBJ в вверхнем регистре.
UNZ тоже не запускается.
![Image](https://preview.ibb.co/jT4WS7/Screenshot_2018_03_31_15_02_16.png)
The Glass is Always Half Full! ![Mr. Green :mrgreen:](./images/smilies/icon_mrgreen.gif)
![Mr. Green :mrgreen:](./images/smilies/icon_mrgreen.gif)
Да, забыл сказать, есть такая проблема. Однако если не копировать файлы из образа, а прямо смонтировать его в ~/.kex/root/RD/1, то этой проблемы не заметно (я кстати не знал, что если смонтировать образ c FAT, то обращение к файлам станет регистронезависимым). Я открываю образы "Disk Image Mounter"-ом, они монтируются в /media, а в каталоге ~/.kex/root/RD/ я сделал линк на каталог в /media (1 -> /media/user/KOLIBRI). Образы монтируются только для чтения, но это вроде не проблема, можно создать каталог /RD/2 и там файлы сохранять.JohnXenox wrote:Видимо, всё дело в чувствительности к регистру.
Проблема с иконками и game center скорее всего тоже из-за чувствительности к регистру.
На данный момент короткие имена приводятся к верхнему регистру, а длинные, типа RasterWorks.obj оставляю как есть. Но по-хорошему, надо бы считывать каталог и искать имя без учёта регистра и потом использовать то, что найдено. Только мне кажется, это будет замедлять работу.
С fNav да, какая-то непонятная хрень, вроде бы используются только реализованные функции, и вроде бы я их полностью реализовал. Но не работает. Жаль исходников fNav нет.
Не работают программы, которые используют fs: (в основном Си-шные) и gs: (три игрушки от codemaster-а). Пока не знаю, решаемо ли. Использовать rdfsbase/wrfsbase можно, но что будет на практике - пока не знаю.
По поводу растягивания окон, хотелось бы узнать версию Линукса и тип оконного менеджера.
tsdima, ну вообще fNav запускается из-под KlbrInWin(только мышкой не води по нему
)
Можно сравнить как сделано в KlbrInWin.
![Smile :)](./images/smilies/icon_smile.gif)
Можно сравнить как сделано в KlbrInWin.
Who is online
Users browsing this forum: No registered users and 1 guest