1. Если вы только начинаете программировать на ассемблере и не знаете с чего начать, тогда попробуйте среду разработки ASM Visual IDE
    (c) на правах рекламы
    Скрыть объявление

Hardware DOS Machine

Тема в разделе "WASM.OS.DEVEL", создана пользователем Paguo_86PK, 1 ноя 2019.

?

Обсуждаемая тема

  1. Теперь многое стало ясно, что автор имел ввиду

    50,0%
  2. Теперь стало яснее, но всё как-то запутано

    0 голосов
    0,0%
  3. Смысл сказанного ясен, но не понятно, для чего всё это в XXI веке

    25,0%
  4. В те времена это было слишком сложно и никому не нужно

    0 голосов
    0,0%
  5. Я ничего не понял. Причём здесь порты заменяющие API

    25,0%
  6. Какая-то «охота на ведьм»…

    0 голосов
    0,0%
Можно выбрать сразу несколько вариантов.
  1. Paguo_86PK

    Paguo_86PK Руслан

    Публикаций:
    0
    Регистрация:
    8 окт 2007
    Сообщения:
    871
    Адрес:
    Ташкент
    q2e74, Вaм стоит перечитать мои тему здесь и тему там, где я довольно развёрнуто многие моменты рассматривал концептуально. Например, ту же полимерную память.
    В моей концепции одна инструкция in/out может отнять миллиарды тактов и прикладной код будет простаивать. Вас это может, наверное, сильно озадачить.
    Но на эту сторону концепции следует посмотреть под другим углом. В DOS «INT 10h» передаёт управление драйверу терминала и программно в отладчике, в отличии от call, как будто никуда не прыгает. Будто бы «int»-инструкции - это гиперсложные операции, требующие миллиарды тактов…
    Везде в документациях инструкции in/out описываются как «плохие» из-за их медлительности. Я же прикинул, что те же «GetDC» или «SendMessage» WinAPI тоже останавливают исполнение прикладного кода и уходят куда-то в теневую зону DLL. То есть, хоть логически приложение и прыгает в регион DLL для выполнения системного кода, но формально приложение долго стоит, достаточно перед тем же «GetDC» и после него врезать «asm rdtsc» и подсчитать такты, пока наш код, грубо говоря, стоял…

    Потому с самого начала мною концептуально заявлялось, что любая «in/out/ins/outs» инструкция может потребовать миллиарды тактов…
    И многие сразу сказали, что это - не правильно и система, значит, очень плохая!

    P.S.: Надеюсь, теперь-то видны ключевые моменты, где привычное «очень плохо» местами вызывает «вау-эффект»?
     
    q2e74 нравится это.
  2. q2e74

    q2e74 Active Member

    Публикаций:
    0
    Регистрация:
    18 окт 2018
    Сообщения:
    442
    именно так. и не догоняю, допустим вы реализовали операционную среду, у вас всё получилось. Как проц делит время между процессами? кто орбитр?

    какой-то полиморфизм в масштабах ос. как возвращаться в исходное состояние после деинсталляции пакета? тем более, когда эти приложения уже накрутили содержимое памяти в мегафарш?
     
  3. Paguo_86PK

    Paguo_86PK Руслан

    Публикаций:
    0
    Регистрация:
    8 окт 2007
    Сообщения:
    871
    Адрес:
    Ташкент
    Немногo мультфильмов от Диснея:
    OSConcept.gif
     
  4. Paguo_86PK

    Paguo_86PK Руслан

    Публикаций:
    0
    Регистрация:
    8 окт 2007
    Сообщения:
    871
    Адрес:
    Ташкент
    Eсли интерес к моей концепции всё ещё имеется, то рассмотрим ещё одну мою мысль…

    Ещё 30 лет назад у PC была актуальна тема музыкального Adlib-синтеза с FM-эффектами карточками OPL-SA3.
    При помощи программирования регистров можно было добиться различных эффектов.

    Значительно позднее я задумался, а почему, наряду с синтезаторами музыки и голоса, не существуют синтезаторов графических сцен? То есть сцены на экране состоят из конкретных спрайтов и по-существу являются сэмплерными, так как спрайты заранее подготовлены. В то же время синтезом можно было бы в кадре генерировать дождь или снег на аппаратном уровне.

    Как это всё должно выглядить?
    В NES у 6502 нижние 256 байтов нулевой страницы в играх активно используются и легко поддаются хаку, например, когда необходимо пройти сквозь стену: Достаточно отследить ячейку, хранящую горизонтальную позицию персонажа, чтобы вписать туда нужное значение и совершить «телепортацию»…
    Тем самым, если очень сильно утрировать, то вместо того же X-Box можно в консоли иметь всё тот же старый добрый 6502 и его нулевую страницу в режиме реального времени отправлять в Облако. А Облако, по видеоканалу будет возвращать результат рендеринга сцены своим синтезатором.

    Программисты поймут, что каждая из сотен NES-игр имеет собственный отпечаток активности в нулевой странице. Тем самым, сервер может распарсить все 256 байт во времени и автоматически распознать игру, загружая под неё готовый шаблон, но с «плюшками XXI века», где и Марио в 3D и Танки от первого лица…
    Но это получится просто эмулятор. А я говорю про Синтезатор Сцен…

    Допустим, программа «Регистры Погоды» загружает флажками и значениями дождливого вечера…
    Нейросеть должна либо в интернете найти видео с дождём, либо сама нарисовать тематический кадр, типа:
    [​IMG]
    Дальше, программа «Регистры Пейзажа» загружает флажками руин времён античности…
    Нейросеть находит тематические фотографии и накладывает их на фон, примерно вот так:
    [​IMG]
    Теперь уже можно отрисовывать батальную сцену активными персонажами.

    Как же должен выглядить дамп под весь этот синтез?
    Допустим, один из вариантов таков:
    Код (Text):
    1. ADDR .0 .1 .2 .3 .4 .5 .6 .7 .8 .9 .A .B .C .D .E .F
    2. +000 xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx ; Ячейки общего уровня играющего - позиционирование
    3. +010 xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx ; Ячейки 1-го уровня играющего - мастерство
    4. +020 xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx ; Ячейки 2-го уровня играющего - экипировка
    5. +030 xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx ; Ячейки 3-го уровня играющего - достаток
    6. +040 xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx ; Ячейки 4-го уровня играющего - движимое имущество
    7. +050 xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx ; Ячейки 5-го уровня играющего - недвижимое имущество
    8. +060 xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx ; Ячейки 6-го уровня играющего - повелитель
    9. +070 xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx ; Ячейки 7-го уровня играющего - властелин
    10. +080 xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx ; Ячейки 8-го уровня играющего - магистр
    11. +090 xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx ; Ячейки 9-го уровня играющего - маг
    12. +0A0 xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx ; Ячейки «Animals»: Птицы, животные, жучки, рыбки…
    13. +0B0 xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx ; Ячейки «Builds»: Пещеры, хижины, избы, дома, небоскрёбы…
    14. +0C0 xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx ; Ячейки «Clouds»: Облака, осадки, небо, звёзды, солнце…
    15. +0D0 xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx ; Ячейки «Disasters»: Ветра, ураганы, наводнения, землетрясения, звездопад…
    16. +0E0 xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx ; Ячейки «Environment»: Туман, трава, деревья, речки, мосты, шоссе, Ж/Д, люки…
    17. +0F0 xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx ; Ячейки «Figures» - ключевые предметы или фигуры…
    И это всё!
    Этих 256 ячеек вполне достаточно, чтобы синтезировать сцену. Будете 100 раз запускать игру, будете видеть 100 разных вариантов одного и того же уровня, так как нейросеть умеет обучаться и фантазировать. А значит, не нужны никакие спрайты. Всё генерируется на лету.

    Главное
    Если Вы честно следовали за ходом моих мыслей, то уже должны понимать, почему в моей концепции Операционной Системы не предусматривается нативного API: Он там и не нужен…
    В Системе, где есть регистр с флажком «Падал Прошлогодний Снег» не нужны никакие функции с открытием файлов, сокетов и рисования линий… Приложение не нуждается в никаких системных библиотеках явно, так как просто через порты программирует Погоду и т.д.

    Например, такое реализовывается уже в наши дни
    [​IMG]
    А те же OpenGL/WebGL никак не могут шагнуть в новую эру и перейти на абстрактный объектный уровень.
    Нет, я ничего против DirectX и OpenGL не говорю. Но пора уже догонять морально реалии технологий, а не топтаться на уровне API 90-х. То есть, нужен, как минимум, реально новый движок, где не нужны текстуры или модели персонажей, так как всё должна синтезировать нейросеть.
    И тогда, на том же 6502, а лучше - на z80, можно будет снова писать код игр, по графике не уступающие любым современным платформам.

    P.S.: Процессоры видеокарт давно обошли центральные процессоры ПК. А морально те же API Windows и Linux не так далеко ушли из своих 70-х… Всё устарело вдоль и поперёк.
    Хотя та же видеокарта шейдерами может воспроизвести больше, чем сам центральный процессор.
    То есть, рано списали 6502, z80 или 68000. Если им предоставить вменяемое аппаратное оснащение, то программированием портов можно сделать буквально всё.
    Главное, чтобы вместо дурацкого порта HDD был порт, например, погоды! :lol:
     
    q2e74 нравится это.
  5. voffka0

    voffka0 Member

    Публикаций:
    0
    Регистрация:
    22 янв 2019
    Сообщения:
    73
    да, теперь я понял свою ошибку, что windows 10, что linux, имеют серъёзные проблемы с безопасностью...
     
  6. Paguo_86PK

    Paguo_86PK Руслан

    Публикаций:
    0
    Регистрация:
    8 окт 2007
    Сообщения:
    871
    Адрес:
    Ташкент
    q2e74, Вoт здесь «CVE-2013-3198 (write-what-where в nt!VdmCallStringIoHandlerPushException)» пишут, что…
    Тем самым, из-под Windows-консольного приложения получится ли заиметь доступ к несуществующим портам, если запустить их эмулятор?

    Для запуска приложений Linux в Windows необходим libcurl.dll.
    Для запуска некоторых приложений DOS требовался DOS/4GW.

    Тем самым, задача состоит в том, чтобы написать собственный диспетчер портов ввода-вывода.
    Диспетчер должен заблокировать доступ ко всем (абсолютно) портам, даже если в Windows некоторые из них разрешены. Диспетчер должен пропускать обработку любых портовых операций нашего приложения через себя. Таким образом, все 65536 портов можно будет полностью виртуализировать под мою концепцию операционной среды. А если во время обработки исключений читать не просто DX, а весь EDX, то и портов станет 4 млрд.
    (В 64-битной системе с RDX можно, страшно представить, развернуть гектарные поля триллионов портов!)

    Как Вы уже можете понимать, в первую очередь необходимы порты «Погоды» и «Ветра»…
    Тем самым, данные от всех датчиков температуры и куллеров системного блока необходимо сконцентрировать в одну группу портов.

    Тогда, вместо гадкого MSAcpi_ThermalZoneTemperature и кучи кода, типа
    Код (Text):
    1. HRESULT GetCpuTemperature(LPLONG pTemperature)
    2. {
    3.         if (pTemperature == NULL)
    4.                 return E_INVALIDARG;
    5.  
    6.         *pTemperature = -1;
    7.         HRESULT ci = CoInitialize(NULL);
    8.         HRESULT hr = CoInitializeSecurity(NULL, -1, NULL, NULL, RPC_C_AUTHN_LEVEL_DEFAULT, RPC_C_IMP_LEVEL_IMPERSONATE, NULL, EOAC_NONE, NULL);
    9.         if (SUCCEEDED(hr))
    10.         {
    11.                 IWbemLocator *pLocator;
    12.                 hr = CoCreateInstance(CLSID_WbemAdministrativeLocator, NULL, CLSCTX_INPROC_SERVER, IID_IWbemLocator, (LPVOID*)&pLocator);
    13.                 if (SUCCEEDED(hr))
    14.                 {
    15.                         IWbemServices *pServices;
    16.                         BSTR ns = SysAllocString(L"root\\WMI");
    17.                         hr = pLocator->ConnectServer(ns, NULL, NULL, NULL, 0, NULL, NULL, &pServices);
    18.                         pLocator->Release();
    19.                         SysFreeString(ns);
    20.                         if (SUCCEEDED(hr))
    21.                         {
    22.                                 BSTR query = SysAllocString(L"SELECT * FROM MSAcpi_ThermalZoneTemperature");
    23.                                 BSTR wql = SysAllocString(L"WQL");
    24.                                 IEnumWbemClassObject *pEnum;
    25.                                 hr = pServices->ExecQuery(wql, query, WBEM_FLAG_RETURN_IMMEDIATELY | WBEM_FLAG_FORWARD_ONLY, NULL, &pEnum);
    26.                                 SysFreeString(wql);
    27.                                 SysFreeString(query);
    28.                                 pServices->Release();
    29.                                 if (SUCCEEDED(hr))
    30.                                 {
    31.                                         IWbemClassObject *pObject;
    32.                                         ULONG returned;
    33.                                         hr = pEnum->Next(WBEM_INFINITE, 1, &pObject, &returned);
    34.                                         pEnum->Release();
    35.                                         if (SUCCEEDED(hr))
    36.                                         {
    37.                                                 BSTR temp = SysAllocString(L"CurrentTemperature");
    38.                                                 VARIANT v;
    39.                                                 VariantInit(&v);
    40.                                                 hr = pObject->Get(temp, 0, &v, NULL, NULL);
    41.                                                 pObject->Release();
    42.                                                 SysFreeString(temp);
    43.                                                 if (SUCCEEDED(hr))
    44.                                                 {
    45.                                                         *pTemperature = V_I4(&v);
    46.                                                 }
    47.                                                 VariantClear(&v);
    48.                                         }
    49.                                 }
    50.                         }
    51.                         if (ci == S_OK)
    52.                         {
    53.                                 CoUninitialize();
    54.                         }
    55.                 }
    56.         }
    57.         return hr;
    58. }
    достаточно использовать «__asm in al,dx», где в EDX (не просто в DX) индекс нашего виртуального порта из 4 млрд…

    Что бы я хотел сделать…
    То есть, не обязательно мою концепцию операционной системы писать с нуля, начиная с загрузчика ядра.
    Можно просто под Windows и Linux написать оболочки, где код будет работать без эмуляции, но в песочнице с кучей портов.
     
    q2e74 нравится это.
  7. voffka0

    voffka0 Member

    Публикаций:
    0
    Регистрация:
    22 янв 2019
    Сообщения:
    73
    ошибка-то моя, ошибка, но я через openbsd её исправлю, поэтому мой ответ: "зачем это в 21 веке?" в силе...нравится топикстартеру строить песчаные замки, так ni.com в помощь, создаёшь схему, заказываешь плату и/или кристалл, ву-а-ля "ваше оборудование готово к работе"...
     
  8. Paguo_86PK

    Paguo_86PK Руслан

    Публикаций:
    0
    Регистрация:
    8 окт 2007
    Сообщения:
    871
    Адрес:
    Ташкент
    Сейчaс попытаюсь прояснить некоторые ключевые моменты моей аппаратно-портовой парадигмы…
    Раннее я уже где-то писал, что от ширины слова, записываемого в порт или читаемого, очень много зависит. Посмотрим вот сюда:
    • out dx,eax - Передать адрес пакета. Здесь периферийный контроллер получает указатель на адрес в памяти приложения
    • out dx,ax - Выбрать слой данных (reserved)
    • out dx,al - Переключить статус пакета с указанием его направления. Если направление исходящее, по полученному раннее адресу считывается в сетевой буфер весь пакет из памяти приложения с проверкой целостности данных подсчётом CRC и открывается межсетевая передача до целевого пункта. Если направление запрашивающее, из целевого пункта запрашивается пакет, который затем будет записан в память приложения
    • in eax,dx - Прочесть пакетное CRC
    • in ax,dx - Прочесть статус слоя (reserved)
    • in al,dx - Прочесть статус пакета
    Видно, что данные по одному и тому же порту не равнозначны (в зависимости от размера слова, порт принимает/отдаёт совершенно разный класс данных).
    В варианте с i386 всё проще, так как сама Операционная Система берёт на себя функцию периферийного контроллера и обрабатывает любой доступ к портам от приложения. При этом меняется принцип работы некоторых операций.
    • rep outsd - Передать данные по адресу esi сервисному процессу с индексом edx. В ecx указывается объём данных
    • rep outsw - Передача между слоями (reserved)
    • rep outsb - Биндинговая передача (reserved)
    • rep insd - Получить данные в буфер по edi от сервисного процесса с индексом edx в размере не более, чем указано в ecx
    • rep insw - Приём из прослойки (reserved)
    • rep insb - Биндинговый приём (reserved)
    Так, у процессоров x86 имеются инструкции «in al,imm8»…«out imm8,eax», где, аналогично как у i8080/z80, индекс порта задаётся непосредственной константой. В рамках идеологии системы этот регион портов я обозначил мусорными и назначил им свою особенную роль…
    Все эти нижние 256 портов в моей концепции операционной системы выполняют роль коммутаторов. Иными словами, если мы хотим, чтобы печатуемый на клавиатуре текст непосредственно выводился эхом на консоль, то необходимо построить граф и связать в нём клавиатуру с терминалом. Для этого нам нужен примерно такой код:
    Код (Text):
    1.     ;;;;;;;;;;;;;;;;;;;;; Здесь мы поработаем с 32-битными данными как с указателями
    2.     mov eax,Keyboard    ; Задаём имя устройства ввода
    3.     mov edx,12345       ; Выбираем произвольный порт
    4.     out dx,eax          ; Теперь этот порт - клавиатура
    5.     mov eax,Display     ; Задаём имя устройства вывода
    6.     mov edx,54321       ; Выбираем любой понравившийся порт
    7.     out dx,eax          ; Теперь это порт алфавитно-цифрового дисплея
    8.     mov eax,DataType    ; Ссылка на описание типа данных
    9.     out 123,eax         ; Назначаем коммутаторному порту нашу "бирку"
    10.     ;;;;;;;;;;;;;;;;;;;;; Теперь будем работать на "биндинговом уровне" с 16-битными словами
    11.     mov ah,123          ; Указываем индекс коммутаторной ячейки
    12.     mov al,0            ; Обнуляем, так как не используем
    13.     mov edx,12345       ; Выбираем наш порт клавиатуры
    14.     out dx,ax           ; Назначаем выходным данным порт 123
    15.     xchg ah,al          ; Меняем местами вход-выход
    16.     mov edx,54321       ; Выбираем наш порт дисплея
    17.     out dx,ax           ; Назначаем входным данным порт 123
    18.     ;;;;;;;;;;;;;;;;;;;;; Мы построили здесь короткий граф и теперь
    19.                         ; драйвер клавиатуры будет отсылать код нажимаемых клавиш
    20.                         ; драйверу окна консоли, чем мы достигнем "эха" с клавиатуры на экран
    21. L1: in  al,123          ; Читаем порт коммутации и следим за потоком
    22.     cmp al,0x1B         ; Если пользователь нажмёт клавишу Esc
    23.     jne L1              ; Следует прервать цикл и разрушить наш граф связи
    24.     xor eax,eax         ; Обнуляем аккумулятор
    25.     out 123,eax         ; "Срываем бирку" с коммутаторного порта
    26.     mov edx,12345       ; Теперь и наш порт клавиатуры
    27.     out dx,eax          ; Освобождаем
    28.     mov edx,54321       ; И порт дисплея
    29.     out dx,eax          ; Удаляем из диспетчера консоли
    30.     mov eax,1           ; Код завершения программы
    31.     hlt                 ; Останавливаем нашу задачку
    32.  
    33. Keyboard:db '/dev/console',0    ; Имя источника
    34. Display: db '/dev/tty1',0       ; Имя приёмника
    35. DataType:db 'ascii',0           ; Имя члена класса потока
    Таким образом, эти нижние 256 портов работают аналогично привычным нам COM-портам и наше приложение может связать любое одно системное устройство с другим. Так как ключевое слово 'ascii' знает и драйвер клавиатуры, и драйвер консоли, то в их канальной связи 'ascii' - общая шина обмена.
    Как здесь можно видеть, никаких call или int с вызовами системного API нам не потребовалось.
    Более того, и на уровне языка Бейсик, и на уровне языка Паскаль вся эта манипуляция с портами легко воспроизводима встроенными операторами inb/outd/outw. А значит, приложение не потребует загрузки каких-либо библиотек и выдаст одинаковый результат.

    Тем самым, можно свободно перенаправлять потоки и аудио, и видео, и назначать динамические компрессора и эквалайзеры, разделять и объединять каналы. При этом - никаких API. Всё на уровне распределения различных потоков по портам и их каналам.
     
    Последнее редактирование: 8 ноя 2019 в 02:46
  9. Paguo_86PK

    Paguo_86PK Руслан

    Публикаций:
    0
    Регистрация:
    8 окт 2007
    Сообщения:
    871
    Адрес:
    Ташкент
    Помните историю с Microsoft и Intel, где обсуждались основные проблемы системных вызовов?
    Если задуматься, то операции in/out моей концепции можно было бы обрабатывать достаточно быстро с использованием кеширования, если бы они были бы чисто виртуальными и работали аналогично как некие syspush/syspop со своим стеком событий и обращений к Системной Среде, как те же Win-API неблокирующее-отложенное PostMessage…
    Догадываетесь, о чём я говорю?
    Если бы с появлением i386 родилась бы и концепция Операционной Системе как полностью виртуальном компьютере, то с введением специального флажка в управляющем регистре процессора можно было бы выставить бит представления портов ввода-вывода как стека системных сообщений. И эти инструкции бы вообще не занимали бы много времени, а Система была бы полностью виртуализована как некий мощный аппаратный девайс. Большинство программ были бы максимально переносимыми между платформами.

    P.S.: Просто миру давным-давно требуется абсолютна новая концепция технологии архитектуры Операционной Системы…
     
  10. TermoSINteZ

    TermoSINteZ Синоби даоса Команда форума

    Публикаций:
    1
    Регистрация:
    11 июн 2004
    Сообщения:
    3.169
    Адрес:
    Russia
    сейчас это не так. начиная с 7 винды, ось умеет восстанавливаться. Но опять же если баг в драйвере видео, то тут и линукс упадет. Ничего не поможет.
     
  11. UbIvItS

    UbIvItS Well-Known Member

    Публикаций:
    0
    Регистрация:
    5 янв 2007
    Сообщения:
    4.598
    Paguo_86PK, впихнуть апи в железку можно и нужно было сделать давно == сейчас в этом направление ползут, но главная проблема тут токЪ нарастает == тупо спецов не хватает, поэтому выгодней (даже для корпи) пилить унылую опенсорц софтвару. кстати, прикол ещё в том, что для производителей хардварные оси дают практически плюсы сплошняком...

    1. зеро пиратство.
    2. большой манёвр по техническим решениям == даже не самые оптимальные могут легко пахать в 10 раз быстрее софтинных аналогов.
    3. появляются неплохие возможности по борьбе с вирусами == запас производительности позволяет делать более мажорные песочницы + си песочницы мб физически изолированы от доверенных юнитов жестянки (цпу, озу, пзу, гпу...).
    4. можно добиваться также значительной экономии электричества.
    ===========
    Но-но-но..
    --- Сообщение объединено, 12 ноя 2019 в 05:52 ---
    устойчивость линя в народе тоже излишне преувеличивается == он в куче случаев вроде и не падает, но так гнусно пахать начинает :)