YS писал(а):А зачем делать его равным 64 кБ? Почему не больше?
Вопрос, конечно, интересный. Но, есть некоторая концепция.
Например, процедура вывода символа на экран - PutChar(accumulator). Как её вызвать?
Ясное дело, классическим CALL PutChar. Но это на уровне системы. А т.к. проекции памяти BIOS (ROM/RAM) в пространство приложения не предусмотрено, выполняется это таким образом: *(char *)PutChar = ascii.
Таким образом, весь API переходит в слой портов виртуальных УВВ.
Ещё пример: Указатель стека обнулён и следом идёт операция CALL. Есть идеи вариантов рефлексов процессора?
A) SP "провернётся" в 0FFFEh;
B) Исключительность ситуации крэшнит всю программу.
Ответ таков:
C) Исключение без креша. Как и трюки с портами, здесь: нулевой стек + вызов подпрограммы = вызов системной подпрограммы. Обращение к API.
Бред? Жуть?
Какрас-таки корни идут из моей OS для i386: У Windows верхние 2Гб служат под систему и API. В моей концепции приложение имеет в распоряжении полные 4Гб памяти. А обращение к API идёт при обнулённом указателе стека. Скажете, из-за генерации исключений приложение через такой API будет крайне тормознутое.
При классическом программировании - да.
Случай из жизни: Когда нужно "пробить" что-то важное, обычно человек бегает в городе по инстанциям и собирает кучу бумаг со штампами в бюрократическом лабиринте. На простую операцию уходят дни, недели, месяцы.
Однако, когда человек 100% знаком с конституцией, юриспруденцией и знаком с механизмами бюрократии, ему достаточно самостоятельно расписать несколько бумаг (в стиле "придраться не к чему"), посетить нескольких чиновников, получить подписи и штампы. Всё займёт от суток до пары дней (утрирую).
К чему это?
Мы привыкли в классической интерпретации API делать сотни тысяч пустяковых вызовов процедур. Тогда как можно было бы обойтись сценарием с чётким планом действий, который можно передать сервисному процессу - демону.
Т.е. вместо кучи PutChar вызвать не то, чтобы Print. А расписать все данные в файл и потом передать файл системе на распечатку - типа RenderHTML.
Вместо того, чтобы строить картинку по одной линии, расписать svg-файл (или метафайл Windows) и попросить систему отрендерить его...
Поняли, в чём суть?
Мою OS многие критиковали. Однако, единицы поняли, т.к. сами думали об этом.
К чему приложению копаться в портах, если можно попросить систему сделать это?
Из-за этого в моём процессоре я сделал всё, чтобы приложение обходилось без классического API уже с самого нижнего уровня.
Я, как бы это сказать, сделал "перезагрузку" самой концепции построения процессорных систем.
В Windows DirectX позволяет выбрать аппаратную реализацию плана или программную эмуляцию.
В своём процессоре я выполнил абстракцию этого.
Т.е. вместо того, чтобы приложение выбирало между Print (печать на экран) и LPrint (печать на ПУ), оно просто отправляет данные в порт.
Если архитектура ЭВМ на базе этого процессора содержит в себе "умное" интерфейсное устройство, способное аппаратно произвести печать, то без вмешательства OS приложение произведёт печать. Если же "умного" устройства нет, операционная среда запустит соответствующий драйвер.
Важно лишь, чтобы вместо кучи тупых GetChar, PutChar, SetColor, SetPixel, DrawLine и т. п. всё было организовано через язык сценариев (не Java или Perl), передаваемый "демону" через срыв стека...