Здравствуйте!
Долгое скитание по многим форумам меня здорово утомило.
Надеюсь найти здесь понимание и любую помощь.
Собственную ОСь задумал написать ещё в "дремучий" 1997 год.
Сейчас серъёзных наработок в этой области практически не имею, но желание - осталось.
Чтобы максимально упростить себе задачу, решил начинать писать ОСь не с начала, а с конца.
Т.е. написать некий менеджер - симулятор среды моей операционки. Менеджер задумал писать под Windows как виртуальный Floppy B: для начала. Так-как в Windows полнейщий пакет средств для графики, звука и прочей чепухи. Т.е. не надо будет писать с нуля драйверы под все устройства. Поэтому очень легко сосредоточиться на поставленной цели.
Итак, что должна из себя представлять plutOS вообще?
Когда-то у меня была мечта построить свой компьютер с нуля. Т.е. всю архитектуру разработать с самого нуля.
Поэтому, ОСь - некое подобие воображаемого компьютера. Я пытался как-то написать эмулятор этого компьютера. Т.е. программный эмулятор i8086 посадить в виртуальное аппаратное окружение. Но скорость работы меня сильно утомляла.
Но, зачем же программно переваривать код, если он аппаратно переваривается самим процессором? Поэтому я решил попытаться написать подобие VDM.
Тем самым, все реальные аппаратные порты эмулировать вообще не надо: у меня же задуман
утопийный компьютер.
А теперь к делу!
АрхитектураВместо 65536 портов ввода-вывода доступно все 4294967296, так-как при обработке исключения, вызванного командами in/out/ins/outs, очень легко вместо регистра dx учитывать весь edx.
Вместо 65536 значений сегментных регистров es/cs/ss/ds/fs/gs можно также обеспечить все 4294967296. Так, при исключении от команды mov es,ax обработать все биты eax! Получим 4294967296 сегментов по 4294967296 байт каждый! Гигантская виртуальная память.
Вместо стандартных динамических библиотек или хотя бы int-векторов на набор системных функций - ничего! Ведь задумывался именно виртуальный компьютер, а не ещё одна OS. Поэтому всё адресное пространство - девственно чисто. Все запускаемые приложения чувствуют себя как стандартный BIOS.
Железо такого компьютера тоже совершенно иное. Оно не просто какое-то специфическое, а реально - футуристически-интеллектуальное.
Общее представлениеИтак, PlutOS - просто эмулятор нереального компьютера. Это уже выяснили. Поэтому, говорить о работе и особенностях этой ОСи просто бессмысленно. Так-как всё внимание нужно сосредоточить на описании самого этого нереального компьютера.
Первый принцип в том, что любое устройство в этом компьютере снабжено собственным мощнейщим процессором. От клавиатуры и мыши, до сетевой карты.
Значит, вместо того, чтобы предполагать наличие 4294967296 портов от различных загадочных устройств, мы будем иметь нечто иное. А именно...
Код:
mov eax,0x76543210 ; Цифры с потолка - индекс сегмента памяти
mov es, ax ; Фактически, виртуальное mov ees,eax
jo error ; Если ошибка - флаг OF
lock ; Захват шины - аппаратный сигнал всем устройствам
mov es,[deviceId] ; Теперь загружаем имя устройства. Из-за lock его значение не изменится
jo error ; Устройство нашлось и откликнулось? Нет? Получим OF
.repeat:mov al,es:[0] ; Читаем код первой клавиши в очереди буфера клавиатуры
cmp al,0x1B ; Пока не нажата Esc
jne .repeat ; Будем дожидаться
hlt ; Завершаем задачу :-))
deviceId db '/dev/keyboard',0 ; Идентификатор устройства "клавиатура"
Ну и что здесь особенного? Можно подумать. Сейчас поясню.
Некоторые инструкции, как например, mov ees,eax и mov ees,[deviceId] на реальном железе никак не заставишь адекватно работать. Зачем же я замутил такое?
С другой стороны, допустим в моём этом нереальном компьютере всё же имеется своя BIOS, но в качестве псевдо-ОСи, лишь для перехвата подобных случаев с адекватной передачей параметров железу.
С этим, кажется, разобрались. Теперь про железо.
Здесь '/dev/keyboard' - клавиатура. По сегменту es появляется 4Гб ячеек нажимаемых клавиш!
С ума сойти? Разве может кто-нибудь за пару тактов процессора напечатать 4Гб и заполнить буфер? Конечно нет.
Клавиатура - виртуальная! Это аппаратно в IBM-PC клавиатура - один байт порта #96. У меня же клавиатура - что угодно. Хоть скачиваемая из интернета HTML-страница, хоть весь DVD-диск. Разницы, принципиально, никакой.
Как Вы теперь поняли, всё железо этого воображаемого компьютера - высокоуровневый ресурс. Поэтому надобность в стандартных библиотеках системных функций, со всякими sscanf/sprintf и т.д. просто отпадает.
Графический интерфейс тоже не набор массива пикселей, а HTML-документ или SVG-сцена.
Вот с OpenGL сложнее из-за отсутствия абстрактной формы описаний сцен. Поэтому можно использовать VRML.
НаброскиКак я уже сказал, эмулятор plutOS я решил выполнить как виртуальный Floppy B:. А не как Bochs скажем. Поэтому надо описать, как я это представляю.
После запуска эмулятора plutOS заходим в диск B: и видим там папку x32. Я не буду называть другие папки корневой директории, так-как смутно представляю ещё всю организацию. Там могут быть и папки x64, и даже z80! Для эмуляции ZX-Spectrum
Итак, зашли в B:\x32\ и видим там папку 00000001. Так plutOS нам предлагает индекс первого возможного процесса. Когда мы туда кинем файл процесса, появится папка 00000002 для второго. И т.д. Чтобы закрыть/убить процесс - просто удаляем любую из этих папок.
Теперь заходим в B:\x32\00000001 папку. Она пуста. Но мы можем её начать заполнять. Но строго нужно следить за именами создаваемых файлов. Причём, создавать в папке файлы просто так нельзя, так-как она подобна CD-приводу в XP, когда переносишь туда файлы перед прожигом. Копируются не файлы, а виртуальные линки на них.
Каждый файл в папке будет означать реально сегмент в процессе с тем же индексом. Если файл 12345678.bin, то в процессе это сегмент 0x12345678 и т.п.
Кроме того, необходим описательный файл к каждому сегментному. Так, в приведённом выше примере с клавиатурой это будет 76543210.bin и к нему 76543210.inf. В этом inf-файле, как в обыкновенном inf Windows в текстовом редактируемом формате мы найдём строчку '/dev/keyboard' и другу служебную информацию. Например, ссылку на реальный источник. Ага! Тут какрас и можем прописать 'con' или 'http://osdev.ru/'
Удаляем файл - грохается и сам сегмент в процессе.
СтандартыЯ не решился разрабатывать новые собственные форматы исполняемых файлов и их заголовки. Я поступил проще.
Берём де-факто tar или tgz и пакуем туда все bin'ы inf'ы нашего процесса. И получаем реальный экзешник plutOS!
Причём, если мы перенесли в папку B:\x32\00000001 наш HelloWorld.tgz, симулятор plutOS его распакует и мы увидим кучу bin'ов и inf'ов. После закрытия процесса все файлы будут удалены и папка отчистится, готовая к новому процессу.
Если же мы перенесём HelloWorld.tar, симулятор его распакует, как в случае с tgz. Но по завершению процесса все новые данные будут сохранены в оригинальный tar! Тем самым, tar-экзешники, в отличии от tgz, могут "развиваться"
МультимедияКонечно, симулятор plutOS должен поддерживать и mp3, и avi, и могое другое.
Если мы тупо перенесём в папку процесса avi-файл, plutOS сам сгенерирует bin и inf сегмента. А процессу будет отправлено событие о внедрении нового устройства.
Самое интересное то, что все 4Гб исходного сегмента под avi будет занято автоматически декодированным готовым первым кадром! Никакой декомпрессией процесс заниматься не должен.
Кадры всегда будут начинаться с es:[0]. А вот чтобы переключиться на n-ый кадр, нужно уже с помощью lock-префикса изменить служебные ячейки с индексатором кадра (напомню, служебные - значит в inf-файле).
Таким образом, без каких-либо библиотек с хитрым набором функций, процесс всего из пары десятков команд может воспроизвести даже видео напрямую с youtube!
СценарииОднако, не стоит думать, что я задумал plutOS так легкомысленно, что процесс воспроизведёт любой файл просто так. Я, всё-таки, программист, и понимаю, что здесь скрыт целый курган подводных камней.
Если говорить более детально, то для воспроизведения avi-потока нужно сначала настроить кучу сегментов на разные устройства. А именно.
Сначала настраиваем сегмент сепарации avi на два потока - видео и аудио. Чтобы система автоматически передавала поток из сегмента с avi в сегмента сепарации, нужно выполнить нечто похожее на lock movsb [edi],fs:[esi], когда es и fs указывают на сепаратор и на avi соответствнно.
Затем извлечённый поток аудио (mp3) нужно таким же образом направить из сегмента сепаратора в сегмент Huffman-декодера. Затем от него - в Фурье-синтезатор. И т.д. до получения распакованного wav, который уже перенаправится в проигрыватель потока, после чего реально появится звук!
То же самое нужно проделать и с видео данными, перенаправляя их от сепаратора к декодерам и фильтрам.
В результате, сам файл процесса вырастит ещё на сотню операций сборки этого конвеера! Чего можно избежать, если вручную набить все ступени самому прямо блокнотом в inf'ы.
P.S.: Если я всё достаточно хорошо изложил, суть plutOS уже более-менее ясна.
Знакомые мне сказали, что весь этот
цирк с сегментами можно организовать в собственной сборке Linux. Подключив весь набор драйверов, кодеков и т.д.
А вот в Windows подобное организовать гораздо тяжелее на порядок!
К тому же, plutOS всё же задумывается и как самостоятельная ОСь где-то в далёкой перспективе. Пусть даже как ещё один дистрибьютив Linux.
Главнейщий минус ОСи - огромные тормоза из-за свистопляски с сегментами и кучей исключений.
Однако, этот минус я максимально стараюсь свести к минимуму с помощью сегментных lock-сценариев. Как Вы уже поняли.
Поэтому при чтении конечного сегмента, plutOS сама произведёт все трансформации от исходного файла до распаковки в отображаемый кадр.
Если у Вас есть какие-то документации на эту тему или Вы можете хотя бы час в неделю уделять времени на этот проект, очень буду рад любой помощи!
В моём профайле есть ссылка на мою страничку проекта.
Спасибо за внимание!