MMU + защита памяти

Микропроцессоры и микроконтроллеры от фирмы Zilog, а также компьютеры на них построенные

Moderator: Shaos

User avatar
masterspammer
Fanat
Posts: 98
Joined: 13 Dec 2020 21:11

MMU + защита памяти

Post by masterspammer »

Ещё в ковидные времена посетила меня такая идея:

Сначала делается такой компьютер на Z80:
* все шины буферизованы (в принципе надо, иначе печально);
* шина умеет по внешнему сигналу заменять на 0 читаемый байт;
* всё адресное пространство разбито на окна, каждое окно - переключаемо;
* в "номер" страницы для окна входит один бит - R/O;
* есть отдельный механизм - принудительно включить "особую" страницу в качестве первых 8 или 16 килобайт;

Потом начинается веселье
* один бит (триггер) - режим системный или обычный;
* относительно простой дешифратор команд (на GAL/PAL или ПЗУ) - плюс триггеры для префиксов;
* в несистемном режиме доступа до портов ввода-вывода нет;
* в несистемном режиме IM*, EI, DI, MOV I,* - не пропускаются до процессора;
* выполнение команд RST*, CALL, RET, RETI (и ещё нескоторых) после сочетания префиксов DD/FD - отслеживаются;
* есть механизм отложенного (после сохранения адреса возврата в стек) переключения триггера режима;
* RST* и аппаратные прерывания вызывают отложенное переключение в системный режим.

(вроде ничего не забыл)

Как это работает
* ...как-то всё настроено, назначены страницы для всех окон, работает несистемная программа;
* прилетает прерывание или выполняется команда DD FD RST*;
* в страницы пользовательской программы сохраняется адрес возврата;
* переключается триггер в системный режим, в нулевую страницу подставляется "операционка";
* начинает обрабатываться прерывание - все регистры сохраняются;
* что-то делается;
* восстанавливаются страницы и регистры (НЕ ФАКТ, ЧТО ТОЙ) пользовательской программы;
* выполняется команда DD FD RET или DD FD RETI (регистр SP уже восстановлен)
* переключается триггер
* из страницы пользовательской программы читается адрес возврата
* программа продолжается

Что это нам даёт
* возможность дать пользовательской программе ВСЁ адресное пространство - "операционка" вызывается через EI DI RST* и живёт в своём адресном пространстве;
* программа не может переключить страницы (кроме вызова операционки), писать в порты и прочее, как у взрослых;
* программа не может запретить или испортить прерывания;
* страница памяти может быть подключена как "пзу"
* операционка может делать с программами вообще что угодно.

На практике
* под CP/M можно написать очень маленький BIOS, выкинув всю реальную работу в адресное пространство операционки;
* операционка - гипервизор над несколькими CP/M;
* несмотря на вроде как ограниченное количество физических страниц, их можно выгружать/загружать и поддерживать вариант "работает 8 CP/M, 43 в фоне"
Last edited by masterspammer on 30 Jun 2025 03:40, edited 1 time in total.
aviator
Maniac
Posts: 301
Joined: 10 Dec 2008 08:39
Location: Стокгольм, Швеция

Re: MMU + защита памяти

Post by aviator »

...и получится недо-286.
С уважением, Сергей.
Mondx
Doomed
Posts: 528
Joined: 10 Aug 2022 07:27
Location: Crimea

Re: MMU + защита памяти

Post by Mondx »

Мечтать/изобретать тут много чего можно. И тут уже есть мечтатели. Но без софта/стандарта никакого толку.
А учитывая прошедшее время... Нет никаких надежд...
Mixa64
Doomed
Posts: 485
Joined: 25 Aug 2009 07:02
Location: Москва

Re: MMU + защита памяти

Post by Mixa64 »

И даже не в этом дело, Z80 и без того трудится, пыхтит своим 4-битным АЛУ, изображая 8-битную машину, стараясь успеть в растактовку с 8-ми и 16-битными операциями. У него внутри при INC H новое HL формируется в тактах постепенно, сначала новый L, потом новая половинка H, потом другая новая половинка H :)
Он уже недо- внутри себя, зачем такому MMU ? Недо-squared?
User avatar
masterspammer
Fanat
Posts: 98
Joined: 13 Dec 2020 21:11

Re: MMU + защита памяти

Post by masterspammer »

Вот как раз софт подразумевался готовый.

Прежде всего - то, с чего это счастье начиналось.
1. желание сделать компьютер на Z80, так что он тут данность.
2. желание сделать его модульным, расширяемым и "богатым" по железу.
3. желание использовать готовый софт.

Из пунктов 1 и особенно 2 сразу следует наличие MMU и буферизация всех шин - просто сразу и заранее решив огромную часть проблем.
Простой и практичный MMU делается из двух четырёхбитных регистровых файлов 74HC670 - до 256 страниц по 16 килобайт, всё адресное пространство стоит из таких страниц,
в любое окно можно назначить любую страницу - ну не знаю, что можно сделать лучше, разве что страницы помельче. Про буфера и говорить нечего - просто надо и очень полезно.

Получается восьмибитная шина, чем-то напоминающая IBM PC :-) периферии не обязательно знать, что процессор адресует всего 64 килобайта - будут и A16, A17...

Дальше возникает вопрос - а что можно "гонять" на такой машине? Ну вот CP/M вполне можно, можно значительное подмножество программ Радио-86РК (работающих через монитор)
запускать, что-то по мелочи можно самому написать, но это как-то не очень. И где-то тут родилась идея вынести всё системное вообще за пределы адресного пространства обычных программ (тут CP/M считаем обычной программой) и как-то защитить.

Логика простая - при прерывании (в любом смысле - и INT и RST) дожидаться сохранения адреса возврата, переключать нулевую страницу, а там уже обработчик сохранит
все регистры, __что-то поделает__, восстановить регистры (в том числе и SP) и перед самым возвратом переключит страницы назад, возвращаясь к программе - не факт, что к той,
на которую выпало прерывание, кстати.

На таком механизме часто делают (при RST) корпоративную многозадачность; при INT она получается уже вытесняющая.

И вот то самое __что-то поделает__ может включать в себя всё, что угодно.

Чтоб запускать CP/M - нужен минимальный BIOS, который сам почти ничего не делает, а просто вызывает нужный RST (тут важно не конфликтовать с системным RST CP/M),
а работающий код уже будет на своей странице; так между прочим можно запустить несколько экземпляров CP/M и переключаться между ними. Примерно так же и с "монитором" - поддельный монитор с нужными точками входа вызывает RST и всё (ну почти всё) работает как надо. Для отсутствия разночтений достаточно использовать префикс DD FD перед RST, а обычные RST обрабатывать как обычно, пусть ими пользовательская программа пользуется для своих нужд.

А дальше хочется запретить программам что-то делать с железом - заблокировать доступ ко всем портам, включая переключение страниц, так и память окажется защищена - за пределы "своих" 64k программа не вылезет никак.

Следующий шаг к идеалу - запретить программе "гадить" системе - отключать прерывания и менять их режим, вмешиваться в регенерацию динамического ОЗУ. Для этого самое простое - отключать буфер шины данных при чтении соответствующего байта из памяти, переводя его в Z-состояние (тогда на процессоре шина подтянута к нулю).

Для программы всё выглядит так - она одна во всём адресном пространстве, выполняется на процессоре без части команд, прерывания существуют только в том смысле, что иногда выполнение прерывается на непрогнозируемые промежутки времени, при этом над верхушкой стека портится пара байт. Весь внешний мир доступен по DD FD RSTXX (я там выше по запарке написал EI DI почему-то, это ошибка).

Есть ещё Unix-like система, не вспомню название, которая работает на Z80, тоже должна пойти.
imsushka
Maniac
Posts: 239
Joined: 01 Jan 2022 04:34
Location: USSR, Tashkent

Re: MMU + защита памяти

Post by imsushka »

схему такого я приводил viewtopic.php?p=170737#p170737

а здесь реализация оной на плисине viewtopic.php?t=22445

но софт все равно не совместимый
народ биосами / мониторами не желает пользоватся