Page 1 of 4

Эмулятор ядра OS Windows

Posted: Tue Dec 06, 2022 1:21 pm
by Jurgen
Привет всем.
Перед новогодним праздником 2023 года, представляю вашему вниманию новый проект: Эмулятор ядра ОС Windows.

Ниже немного лирики, а потом по делу.
По моему личному мнению, сочетание ОС Колибри и эмулятора, написанных на языке ассемблере, обеспечат безусловное конкурентное преимущество над другими проектами типа Wine и прочие.
Если я не ошибаюсь, все участники сообщества Колибри ОС желают, чтобы наша операционная система стала популярным среди пользователей настольных ПК и ноутбуков.
Первая проблема заключается в том, что почти все пользователи поголовно сидят под ОС Windows. И я в том числе :wink:
Вторая проблема. Обычный пользователь неохотно меняет свои привычки. Я сам такой. :roll: Однако можно постепенно изменить свои привычки, если это дает преимущество перед другими пользователями в чем либо или улучшает функциональность чего либо.

Эмулятор позволит решить эти проблемы. К финальной доработке эмулятора мы сможем предложить пользователю такой вариант: «Хочешь, чтобы твоя стрелялка, перделка, свистелка работала быстрее — переключись!!» :D
Если пользователь переключается на ОС Колибри и запускает этот эмулятор ему будут предлагаться два варианта — Запуск его приложения или запуск рабочего стола Винды.
Пользователь запускает то, что ему надо и как бы ничего не изменится для него, только его Винда и его приложение стали работать явно быстрее.
В итоге, в перспективе, весь мир IT , основанный на платформе ОС Windows, окажется в лапке (под лапкой) нашей птички! :shock:

А теперь перейдем к реалиям. :) Процесс разработки эмулятора я разбил на несколько основных этапов:
1. Обеспечить запуск системных модулей Винды (ntdll, kernel32, gdi32, user32) в среде ОС Колибри. Эти системные модули сами автоматически сформируют среду окружения обеспечивающий запуск приложения.
2. Все вызовы системных функций API, которые обращаются в ядро Винды, замкнуть на свой эмулятор и написать обработчики этих функций.
3. Запустить стандартное приложение из дистрибутива Винды
4. Окончательно отладить межмодульное взаимодействие по стандартам Винды
5. Полностью отладить функциональность приложения Винды
6. Сделать адаптацию эмулятора с этим приложением под все версии Винды, начиная от Window XP и выше.
7. Запустить Explorer (Рабочий стол) Винды и отладить его.
8. Разработать и отладить механизм работы с драйверами, входящих в состав приложений.
9. Сделать адаптацию под 64 бит версию (Предполагается работа эмулятора в совместимом режиме х86 32-64.

В качестве исходного ОС был выбран Windows XP SP-2 (Меньше мегатонн кода для изучения).
В качестве стандартного приложения Винды был выбран Notepad,так как он имеется во всех дистрибутивах Винды и есть его аналог в Колибри — Tinypad, что позволяет мне быстрее адаптировать Notepad к особенностям Колибри.

Проект я начал в сентябре 2021 года. Решил специально ничего не сообщать здесь, пока не достигну результата, на которое можно посмотреть. На данный момент идет работа по п 4-5 и частично п.2. Уже запускается Notepad (см. ниже скрин).

У кого есть установленный Windows XP SP-2 на жестком диске и если Колибри читает этот диск, то вы можете проверить запуск эмулятора. Должно появиться окно Notepad с мигающим кареткой (то есть типа приложение готово к работе).
Примечание по Notepad :
1. Курсор в Notepad временно установлен в виде изображении ручки из ресурсов Винды, так как стандартный курсор Винды, в виде двутавровой балки, Функция 37,5 от Колибри не хочет отображать.
2. Шрифт временно выбран из стандарта Колибри, так как векторный шрифт от Винды пока не поддался мне: Прямые линии шрифта норм отображает, но кривые неправильно — возможно неправильно применил формулу Безье для кривых..

«»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»
Внимание:
1.Так как конфигфайлы у Windows XP могут достигать размера более 50МБт, то эмулятор НЕ загрузится из-за ограничения размера загрузки файла в 16МБт, в системном файле ОС Колибри - dll.inc. (строка 472)
Предлагаю модератору изменить ограничение максимального размера загрузки файла в dll.inc до 1ГБт на перспективу.
Например прописать в файле dll.inc так: cmp eax,1024*1024*1024 (строка 472)

2. В целях безопасности, эмулятор пока ничего не сохраняет на диск с Виндой и не меняет данные в конфигфайлах Винды, даже если это требуют системные модули Винды.
«»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»

Примечание:
Если выполнены выше условия и после запуска вами эмулятора в течение 3-5 сек. не появилось окно Notepad, то сообщите мне ниже в теме форума с приложением скрина сообщения Board
(Запустите Board. Нажмите кнопку – User. )


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

Re: Эмулятор ядра OS Windows

Posted: Wed Dec 07, 2022 11:52 pm
by rgimad
Круто! Респект!!

Re: Эмулятор ядра OS Windows

Posted: Thu Dec 08, 2022 11:26 am
by tsdima
Полмегабайта на асме - это круто!

Re: Эмулятор ядра OS Windows

Posted: Thu Dec 08, 2022 1:33 pm
by GerdtR
Крутой проект. И очень масштабный. Ковырял подобное. Потом изучал сырцы Wine ради описаний ядерных функций, ну и с целью что-то портировать. Терпения не хватило)

Re: rgimad

Posted: Thu Dec 08, 2022 2:29 pm
by Jurgen
Спасибо. И ваша цитата очень в тему:The best way to predict the future is to create it. :wink:

Re: tsdima

Posted: Thu Dec 08, 2022 2:33 pm
by Jurgen
"Полмегабайта на асме - это круто!"
Это еще код причесанный без кмментариев и пояснений. Мой рабочий файл содержит 1,7 Мбт :D

Re: GerdtR

Posted: Thu Dec 08, 2022 2:43 pm
by Jurgen
" Ковырял подобное. Потом изучал сырцы Wine ради описаний ядерных функций, ну и с целью что-то портировать. Терпения не хватило)"

Я также с этого начал и убил зря три месяца... Это тупиковый путь!!!
Нужно просто поставить самую первую практическую цель -запустить в Колибри первый файл от Винды -ntdll. Как только начал по этой цели работать, тут же у меня поперло!!! :D Даже азарт появился -добить этот ntdll, заставить инициализироваться. А дальше уже пошло по накатанной....

Re: Эмулятор ядра OS Windows

Posted: Thu Dec 08, 2022 5:39 pm
by vitalkrilov
Отличный проект. Хорошо, что занялись этим.

Я попытался запустить, но:
WCore вылетает, если запускать с диском, на котором Windows XP Professional 2002 Service Pack 3.
Ядро я перекомпилировал, поставив 1ГиБ в core/dll.inc (408 и 514 строки в последней ревизии: 9885). Таким образом, менял kernel.mnt и kolibri.krn в raw-диске KolibriOS r9885.
В процессе также происходит перезапись в 0-ой ячейке памяти (заголовок приложения стирается).

Да, было написано, что запускать с SP-2, но у меня такой пока нет, а это, может, пригодится (вдруг дело не в Service Pack).

Re: vitalkrilov

Posted: Thu Dec 08, 2022 8:32 pm
by Jurgen
Спасибо за инфу.
Там сообщает, что какой-то объект не найден. Чтобы узнать какой объект не найден, надо будет трассировать.

Ваша цитата:
"В процессе также происходит перезапись в 0-ой ячейке памяти (заголовок приложения стирается)."
Это нормально. Системные модули Винды постоянно обращаются к памяти по селектору fs:[0]. Поэтому мне пришлось выделить пустое место в 40h, чтобы они не затирали названия функций.

Re: vitalkrilov

Posted: Fri Dec 09, 2022 12:12 pm
by tsdima
Jurgen wrote: Thu Dec 08, 2022 8:32 pm Это нормально. Системные модули Винды постоянно обращаются к памяти по селектору fs:[0]. Поэтому мне пришлось выделить пустое место в 40h, чтобы они не затирали названия функций.
Это не нормально. fs:[0] не должен указывать туда-же, что и ds:[0]. fs:[0] это TLS данные, для каждой thread свои.

Re: Эмулятор ядра OS Windows

Posted: Fri Dec 09, 2022 12:15 pm
by tsdima
Было бы интересно получать список файлов, к которым обращается эмулятор. Может быть сделать лог для этого где-нибудь на /tmp0/1 ?

Re: tsdima

Posted: Fri Dec 09, 2022 8:39 pm
by Jurgen
"Это не нормально. fs:[0] не должен указывать туда-же, что и ds:[0]. fs:[0] это TLS данные, для каждой thread свои."

Может быть для Винды это ненормально... :wink: Но для эмулятора такая реализация селектора является "нормальным", потому-что так задумано.
Я "разрешил" системным модулям Винды использовать адреса от 0 до 40h для своих нужд.
В итоге, такое "ненормальное" применение селектора не мешает эмулятору запустить Notepad :)

Re: tsdima

Posted: Fri Dec 09, 2022 8:46 pm
by Jurgen
"Было бы интересно получать список файлов, к которым обращается эмулятор. Может быть сделать лог для этого где-нибудь на /tmp0/1 ?"

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

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

Posted: Sun Dec 11, 2022 7:33 pm
by Jurgen
Есть такая проблема с фукцией номер 0 - создание окна. (См. скрин)
При создании окна отсутствует такая опция - не показывать его в трее.

Так как дополнительное окно приходится создавать для субменю и контекстного меню, то в трее появляется новый объект. Это ведет к ненужным расходам процессорного времени на отрисовку лишних элементов.
Эта проблема есть и у Tinypad.

Может, кто-то возьмется доработать эту функцию?

Re: Эмулятор ядра OS Windows

Posted: Tue Dec 13, 2022 7:35 pm
by KPG
А, не думали/рассматривали ли возможность разработки представленногo решения для запуска программ из Win98/95 (может и Win 3.11)?

P.S. В рамках запуска слвременного софта в WinXP показывает неплохие результаы проект Core One API
Думают и возможности запуска Хромиум 100 под Win98.
Windows 98 Second Edition в обсужении на ru-board.com