Но все-таки БК0011М, за счет большего объема памяти (той же страничной) на порядок и софт позволила поднять по сравнению с БК0010.
А в каком именно? :) Её конечно же нигде нет в эмуляторах.
Вид для печати
Мне без разницы. Сейчас я пользуюсь каким то BK Emulator by Yuriy Kalmykov, потому что он прописался на автозапуск rom-файлов. Но у меня есть подозрение, что программы работают в нем медленнее, чем на реале. В этом эмуляторе время выполнения всех команд одинаково и в общем, процессор выполняет 100.000 команд в секунду. И еще там клавиатура не совсем реально работает и ноутбук жжот колени, когда запущен этот эмулятор.
Но только что посмотрел на эмулятор b2m. Попробую использовать его, надеюсь, что получится сделать автозапуск rom-ов для него. Я думаю, что когда потребуется использовать дополнительную память, b2m без проблем добавит её в свой эмулятор.
P.S. А еще его эмулятор падает, если не выбирая машину запустить отладчик.
---------- Post added at 11:15 ---------- Previous post was at 11:03 ----------
Кстати, сделал функции MemAlloc, MemFree. Пока в самом тормозном виде.
MemAlloc просматривает все блоки памяти от начала до конца. И если находится свободный блок подходящего размера, то этот блок делится пополам. Если находится несколько подряд идущих свободных блоков, то они объединяются.
В начале каждого блока памяти находится указатель на следующий блок. Односвязный список. А еще идентификатор задачи: 0-свободно, 1-15 система, 16-32767 задача, 32767-65535 DLL-файл. Причем номер является именем DLL-файла. Имена не используются для экономии ОЗУ.
Функция MemFree просто помечает блок свободным [CLR -4(R0)]
Попозже перепишу менеджер памяти. Он будет свободные блоки держать в виде двоичного дерева. И всегда находить минимально возможный блок (дефрагментация ОЗУ) за время log(n). Это работает быстрее, но расходует больше ОЗУ.
Еще будет функция EMemAlloc выделяющая страничную память. Указатель на эту память будет 32-х битным (Смещение + Страница). Она в том числе может выделить память и из основного пространства, если страницы закончились.
---------- Post added at 11:28 ---------- Previous post was at 11:15 ----------
У задач будет признак, разрешающий загружать их в страничную память. ОС будет устанавливать нужную страницу, при обращении к таким задачам.
Я вот только не знаю, сколько окон будет у страничной-памяти (зависит от используемого контроллера). Если всего одно окно, то такие задачи не смогут нормально использовать страничную-память, так как не смогут переключать страницы.
А в остальном работа со страницами будет полностью аналогична работе с сегментными регистрами x86 процессора. Только сегменты будут чуть меньше.
Серьезно Вы за дело взялись...
А насколько реализуемо предусмотреть, чтобы когда на БК0012 будет эта система запускаться, она нормально работала на полной скорости процессора (которая в 150-200 раз будет быстрее реального ВМ1)?
Не вижу проблем. Чем быстрее выполнится код, тем лучше.
А для всякой анимации, используется процессорный таймер.
vinxru, как думаете переключать задачи, передавать между ними данные (вызов ф-ции DLL в т.ч.), думаете ли организовывать кольца защиты?
Задаю глупые вопросы ибо с архитектурой БК знаком очень слабо.
---------- Post added at 13:10 ---------- Previous post was at 13:08 ----------
как вообще на PDP организованно обработка ловушек и исключений?
Защиты не будет, любая программа может уронить систему. У БК0010 есть пультовый режим (типа режима отладки с подключением альтернативного ПЗУ, с возможностью пошаговой отладки), но он требует железной поддержки (доп платы) и пока я его не планирую использовать. Так же можно сделать полноценный пейджинг (блокирование чтения или записи блоков размером 64 байта) на внешнем контроллере памяти, но это то же паяльник.
DLL
DLL выполняется в контексте задачи. То есть все созданные окна и выделенная память будет принадлежать вызвавшему процессу. Завершается процесс, уничтожаются все созданные окна.
DLL может обладать собственными данными, только если будет модифицировать свой сегмент данных.
(Но не должна. И если будет использоваться пейджинг, то это вызовет ошибку.)
Взаимодействие задач
Задачи должны будут общаться только через функцию SendMessage. Она переключает страницы памяти и изменяет контекст задачи. То есть все созданные ресурсы будут принадлежать новой задаче.
Если одна задача передает другой задаче блок памяти (например строку), то эта строка должна быть создана функцией GlobalMemAlloc. Что бы строка гарантированно была создана в общей памяти. А принимающая задача должна изменить владельца блока на себя.
(Если будет использоваться пейджинг, то любое обращение к строке, до изменения владельца, вызовет исключение. В адресном пространстве будет дыра).
Еще будут файловые трубы (CreatePipe). Одна задача пишет в виртуальный файл, другая читает.
---------- Post added at 14:43 ---------- Previous post was at 14:37 ----------
Внешнем или встроенным в процессор MMU (менеджером памяти). Он обеспечивает что то похожее на защищенный режим 286/386 процессоров.
В БК0010 этого нет.
---------- Post added at 15:15 ---------- Previous post was at 14:43 ----------
Вообще разные бывают MMU, я видел такой:
Адресное пространство 64Кб делится на 8 блоков по 8 килобайт.
К каждому блоку можно подключить любую область физической памяти. Например 4 Мб с шагом 64 байта.
(Аналог сегментных регистров, только тут их 8 и шаг 64 байта.)
Плюс контроллируется, имеет ли право процесс обращаться к определенной области памяти. Попытался прочитать чужие данные, произошло исключение.
(Аналог защищенного режима)
В БК есть страничная память? Как она организована? Для полноценной многозадачности надо как минимум два переключаемых окна, лучше 4 (несколько страниц ОС и переключаемые страницы кода задачи), ещё лучше 8 (как в UNIX для PDP-11).
В БК0010-01 нет страничной памяти.
Сначала находится 32 Кб ОЗУ, из которых 16 Кб занимает видеопамять.
Потом идет ПЗУ 24 Кб (Бейсик).
Конец памяти свободен для внешних устройств. Там обычно ПЗУ дисковода.
В БК0011 есть страничная память.
Адресное пространство поделено на 4 окна по 16 Кб.
В окне 0 всегда 0 страница ОЗУ.
В окне 1 можно выбирать любую страницу ОЗУ (их 8)
В окне 2 можно выбирать любую страницу ОЗУ или ПЗУ
Окно 3 свободно для внешних устройств. Там обычно ПЗУ дисковода.
Но к обоим компьютерам можно подключить внешнее ОЗУ с собственной страничной адресацией. У БК0010-01 обычно подключали 16-32 Кб вместо стандартного ПЗУ.
---------- Post added at 15:36 ---------- Previous post was at 15:32 ----------
Почти.
1) Задача передаёт данные ядру с "номером" получателя.
2) Ядро делает все необходимые проверки распоряжения, переключает контекст.
3) Вторая задача дает команду ядру, что на хочет забрать данные. Ядро меняет владельца у блока памяти.
Иначе, глючная Программа 1 может повесить на задачу 2 кучу ресурсов без её ведома.
для этого существует системы симафоров и TTL ответа.
т.е. DLL после инициализации становится в позу "готов!" и ждет.
задача осуществляет вызов, ситема передает данные включает счетчик и блокирут в ход в DLL. Следующаа задача вынуждена в очереди ждать освобождения или система будет вынуждена перегрузить DLL по TTL как повисшую.
такая реентерабильность потребует написания соответсвующего кода и передачу данных через стек.