nedoPC.org

Electronics hobbyists community established in 2002
Atom Feed | View unanswered posts | View active topics It is currently 28 Mar 2024 07:58



Reply to topic  [ 23 posts ]  Go to page Previous  1, 2
DLL для Спринтера (LIBMAN) 
Author Message
Maniac

Joined: 05 Oct 2009 19:44
Posts: 223
Location: 212.164.105.5
Reply with quote
Свободные места для расположения всяких хуков:
Code:
;RST 10h
      jp sys         ; вектор ДОС-а
      ds 0x18-$, -1      ;свободно

;RST 20h, заглушка
      jp empty__      ;свободно
      ds 0x28-$, -1      ;свободно


;RST 28h, свободный
      jp empty__      ; заглушка, свободно
      ds 0x30-$, -1      ;свободно

загрузка либ можно пока оставить на system.exe, а вот L_CALL, L_INFO и L_FREE можно скрыть под досом, в 0м окне. чтобы корректно вылетать из них в либу, можно использовать стэк, с адреса 0x10 в странице с вызывалкой либы (L_CALL, L_INFO и L_FREE) поставить возврат страницы с досом. Либман в шелле может узнать эту страницу через In a,(0x82) и подставив в возвратную процедуру ld a,dss_page:out (0x82),a. следующим байтом будет стоять ret который откинет нас в страницу и адрес с либой. конечно, она должна быть предварительно уже включена, с запоминанием страницы юзера. и т.д.
но это всё, конечно, будет накладывать лишний тормоз. но это пока... мы же пока тренируемся)))


16 Dec 2020 00:42
Profile
Admin
User avatar

Joined: 08 Jan 2003 23:22
Posts: 22409
Location: Silicon Valley
Reply with quote
да я уже примерно разметил где там код раскидать между #0020 и #002F
щас простой тест напишу, чтобы проверить, что на лету по живому коду можно страницами ОЗУ щёлкать

_________________
:dj: https://mastodon.social/@Shaos


16 Dec 2020 01:30
Profile WWW
Maniac

Joined: 05 Oct 2009 19:44
Posts: 223
Location: 212.164.105.5
Reply with quote
а у меня вопрос возник - получается, либы закрыты в рамки одного окна? если какая-то либа будет большой, как тогда она будет погружаться? например. оконная либа, всяко уплывёт за пределы 16к.


16 Dec 2020 01:46
Profile
Admin
User avatar

Joined: 08 Jan 2003 23:22
Posts: 22409
Location: Silicon Valley
Reply with quote
Sayman wrote:
а у меня вопрос возник - получается, либы закрыты в рамки одного окна? если какая-то либа будет большой, как тогда она будет погружаться? например. оконная либа, всяко уплывёт за пределы 16к.

Должен быть механизм самодокачки как с EXE (другой вопрос, что сейчас этот механизм в либмане сломан т.к. регистр A перетирается при вызове L_CALL из L_LOAD - надо пофиксить). Для либмана все точки входа либы будут в одной странице, а большая либа сама будет знать сколько у неё ещё страниц и что с ними делать.

Кстати вполне возможно существование DLL-ек чисто состоящих из одних данных, которые могут открываться в любом окне и не требует релокации - для них обязательные функции 0 и 1 будут содержать XOR A и RET, а всё остальное будут данные, к которым можно получить полный доступ через будущий вызов L_FREEZE. Плюс такого способа хранения данных - они будут храниться на диске в сжатом виде (сейчас сжимаются только последовательности нулей, однако в будущем возможны другие варианты компресси, например SHAFF). Чтобы не путать никого, у таких файлов расширение вместо .DLL можно сделать .DLD ( Dynamically Loaded Data ; )

_________________
:dj: https://mastodon.social/@Shaos


16 Dec 2020 09:06
Profile WWW
Admin
User avatar

Joined: 08 Jan 2003 23:22
Posts: 22409
Location: Silicon Valley
Reply with quote
Вот нашёл в архивах кусок моей беседы про DLL на Спринтере предположительно с Горячевым в июне 2002:
Code:
> Формально exe-формат это совмещение кода библиотеки и ее инсталятора

проще сделать отдельно библиотеку и инсталятор в виде exe - так мы сможем
избежать путаницы

> Ну если встраивать в систему механизм библиотек, то и управлять ими
> должна система

когда система сможет ими управлять? тогда, когда выйдет новая версия,
а предварительную поддержку внутри приложений я могу сделать за один вечер

> библиотеки будут занимать около 16Kb и здесь хватить экономии в пределах
> страниц

Библиотека размером 16К - это ОЧЕНЬ большая библиотека (конечно же в понятиях z80 :)
Достаточно сказать, что программа на ассемблере, размером 3 тысячи строк
компилируется в код размером порядка 5-6 килобайт. Так что без перемещаемости
не обойтись!

> Предлагаю вариант, при котором можно будет
> сообщить системе являеться ли код библиотеки
> перемещаемый или же нет

Перемещаемым - однозначно! даже если она будет занимать ровно 16К и будет
открываться в окне #C000, все равно, рано или поздно, появится необходимость
открыть ее где-нибудь в другом месте - #4000 например. Перемещаемость это даст.
Причем код привязывается к адресам при загрузке - это не сильно напрягает
процессор. Напомню, что наиболее часто используемым способом перемещаемости
на i8080-z80 (начиная с CP/M-80) является так называемая BitMap таблица,
которая занимает 1/8 от размера кода - по одному биту на байт и определяет
какие байты должны быть смещены при смещении блока кода в памяти.

> Также есть идея указывать может ли библиотека быть shared

Разделяемость библиотеки влечет за собой много накладных расходов по контролю
непересекаемости блоков данных для разных вызовов и т.д. Проще загрузть
несколько библиотек со своими статическими данными. Хотя такой контроль
можно отнести на саму библиотеку и, действительно, взвести соответствующий
флажок в атрибутах, чтобы система не расходовала память попусту.

> это требует более конкретных примеров с исходными кодами

пример - выделение арифметических операций, например с фиксированной точкой
произвольной точности (FRACTALS.EXE), в отдельную библиотеку.

Это было за пару дней до выхода LIBMAN версии 0.0

_________________
:dj: https://mastodon.social/@Shaos


22 Dec 2020 08:07
Profile WWW
Admin
User avatar

Joined: 08 Jan 2003 23:22
Posts: 22409
Location: Silicon Valley
Reply with quote
Что-то я подумал, что целый RST либману ненужен - я могу также легко и непринуждённо поставить точки входа в либман на свободные функции DSS, например #Dx:

#DA - DLL_FREEZE
#DB - DLL_UNFREEZE
#DC - DLL_INFO
#DD - DLL_CALL
#DE - DLL_LOAD
#DF - DLL_FREE

А вот RST #20 можно отдать под эксперименты с кооперативной многозадачностью, а RST #28 под брекпоинты в отладчике...

_________________
:dj: https://mastodon.social/@Shaos


16 Mar 2021 20:29
Profile WWW
Maniac

Joined: 05 Oct 2009 19:44
Posts: 223
Location: 212.164.105.5
Reply with quote
Shaos wrote:
Что-то я подумал, что целый RST либману ненужен - я могу также легко и непринуждённо поставить точки входа в либман на свободные функции DSS, например #Dx:

#DA - DLL_FREEZE
#DB - DLL_UNFREEZE
#DC - DLL_INFO
#DD - DLL_CALL
#DE - DLL_LOAD
#DF - DLL_FREE

А вот RST #20 можно отдать под эксперименты с кооперативной многозадачностью, а RST #28 под брекпоинты в отладчике...

хочешь свой вариант доса выпустить? в 1.62 ты никак не воткнёшь, законно конечно. а потом выходит 1.63 или что там дальше будет. там тоже адреса съедут. опять рыскать и править будешь? занимай #20 пока есть...


17 Mar 2021 03:28
Profile
Admin
User avatar

Joined: 08 Jan 2003 23:22
Posts: 22409
Location: Silicon Valley
Reply with quote
Sayman wrote:
хочешь свой вариант доса выпустить? в 1.62 ты никак не воткнёшь, законно конечно. а потом выходит 1.63 или что там дальше будет. там тоже адреса съедут. опять рыскать и править будешь? занимай #20 пока есть...

Найти таблицу не проблема - я же уже описывал алгоритм - трассируем с адреса #10 и ищем подпрограмму перепрыга
Свой вариант доса выпустить не хочу - хочу уметь цепляться к любой версии доса
А #20 я тоже займу - не волнуйся :mrgreen:

_________________
:dj: https://mastodon.social/@Shaos


17 Mar 2021 12:54
Profile WWW
Display posts from previous:  Sort by  
Reply to topic   [ 23 posts ]  Go to page Previous  1, 2

Who is online

Users browsing this forum: No registered users and 4 guests


You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot post attachments in this forum

Search for:
Jump to:  
Powered by phpBB® Forum Software © phpBB Group
Designed by ST Software.