User Tag List

Страница 1 из 5 12345 ПоследняяПоследняя
Показано с 1 по 10 из 49

Тема: Взялся я писать статью... SDCC как всегда:)

Комбинированный просмотр

Предыдущее сообщение Предыдущее сообщение   Следующее сообщение Следующее сообщение
  1. #1

    Регистрация
    27.01.2005
    Сообщений
    924
    Спасибо Благодарностей отдано 
    28
    Спасибо Благодарностей получено 
    193
    Поблагодарили
    154 сообщений
    Mentioned
    2 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию Взялся я писать статью... SDCC как всегда:)

    Итак, взялся я писать статью, забыв про новый год. И меня понесло. 12 страниц про динамическое связывание и подгружаемые модули на SDCC (SDCC-NOINIT). С примерами.

    С одной стороны мне горетно, что в новогодние издания она не войдет. С другой - радостно, что всё ж написал.

    Так что выкладываю её на обзор. Опечаток там наверное много и других оговорок. Но что получилось, то получилось. Вдруг кому интересно.

    Специально извиняюсь перед WBR, что на новый год не получилось сделать то, что нужно - к лету ещё что-нибудь напишу для зарулем. Если доживу

    ----------------------------------------------------------------------------------------------------
    Итак статья https://github.com/salextpuru/sdcc-n.../sdcc-art2.pdf
    ----------------------------------------------------------------------------------------------------

    Примеры там же:
    https://github.com/salextpuru/sdcc-n...r/apps/test-so
    https://github.com/salextpuru/sdcc-n...bsrc/libtestso
    https://github.com/salextpuru/sdcc-n...r/libsrc/libso

    Другая дока по SDCC-NOINIT:
    https://github.com/salextpuru/sdcc-n...ree/master/doc
    https://github.com/salextpuru/sdcc-noinit

  2. #1
    С любовью к вам, Yandex.Direct
    Размещение рекламы на форуме способствует его дальнейшему развитию

  3. #2

    Регистрация
    14.05.2015
    Адрес
    г. Харьков, Украина
    Сообщений
    2,940
    Спасибо Благодарностей отдано 
    150
    Спасибо Благодарностей получено 
    302
    Поблагодарили
    171 сообщений
    Mentioned
    4 Post(s)
    Tagged
    1 Thread(s)

    По умолчанию

    SfS, теперь ядро надо и графический интерфейс
    Увы общий формат форума вышел из рамок моего любимого места , более тут не бываю.

  4. #3

    Регистрация
    27.01.2005
    Сообщений
    924
    Спасибо Благодарностей отдано 
    28
    Спасибо Благодарностей получено 
    193
    Поблагодарили
    154 сообщений
    Mentioned
    2 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от JV-Soft Посмотреть сообщение
    SfS, теперь ядро надо и графический интерфейс
    Пока бы менеджер памяти осилить. Там проблема - как данные между страничками передавать при вызове...

    - - - Добавлено - - -

    Да и в одного както грустно творить чтото большое.

  5. #4

    Регистрация
    19.01.2017
    Адрес
    г. Арзамас
    Сообщений
    2,450
    Записей в дневнике
    42
    Спасибо Благодарностей отдано 
    8
    Спасибо Благодарностей получено 
    162
    Поблагодарили
    119 сообщений
    Mentioned
    7 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию


  6. #5

    Регистрация
    24.08.2007
    Адрес
    Днепропетровская обл.
    Сообщений
    1,681
    Спасибо Благодарностей отдано 
    2,712
    Спасибо Благодарностей получено 
    170
    Поблагодарили
    130 сообщений
    Mentioned
    1 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    SfS, красава! Направление взял чёткое, без базара.
    Придерусь к частности. ИМХО зря использовал HL вот здесь:


    Лучше взять BC или DE. Чтобы иметь возможность использовать в функциях модель вызова __z88dk_fastcall с передачей аргумента в паре HL.

  7. #6

    Регистрация
    08.05.2007
    Адрес
    Dnepropetrovsk
    Сообщений
    1,089
    Спасибо Благодарностей отдано 
    281
    Спасибо Благодарностей получено 
    70
    Поблагодарили
    49 сообщений
    Mentioned
    3 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Отличный проект и красивая реализация! Спасибо! Очень пригодится как компонент будущей ОСи.

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

    Также присоединяюсь к мнению Oleg N. Cher:
    Цитата Сообщение от Oleg N. Cher Посмотреть сообщение
    Придерусь к частности. ИМХО зря использовал HL вот здесь:
    ...
    Лучше взять BC или DE.
    А по-моему лучше вообще не использовать никаких регистров. Кроме программистов на Си встречаются ещё программисты на ассемблере, которые передают параметры в регистрах. Например, "резидентная интерфейсная часть" (в английском используется термин "Import Library") может состоять из команд JP 0, JP 3, JP 6 и т.д., которые изменяются в ходе настройки основной программы на фактический адрес загрузки модулей.

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

    - - - Добавлено - - -

    Цитата Сообщение от SfS Посмотреть сообщение
    Там проблема - как данные между страничками передавать при вызове...
    Я тоже думал над этой проблемой. Пришел к следующим идеям:

    1) Исполняемые файлы и динамические библиотеки состоят из сегментов. Paged Code/data - код или данные, которые можно размещать в страницах (C000-FFFF); Nonpaged Code/data - то, что необходимо размещать вне страниц, в резидентной памяти. Сегменты реализованы в современных исполняемых форматах (Windows EXE, ELF). Упомянутый подход реализован для драйверов Винды, где часть кода или данных загрузчик размещает в "дорогой" резидентной памяти (Nonpaged Pool), а остальные - в той памяти, которая может свопиться.

    2) Системный менеджер памяти принимает параметр - какая требуется память: резидентная (которой мало), страничная в текущей странице (которой тоже мало, но предпочтительно использовать её) или же страничная в любой странице (которой много, но доступ неудобный).

    3) Программист должен стремиться свести к минимуму перемещения данных между страницами и использование Nonpaged Memory. Вызовы функций можно разделить на "близкие" (когда вызываемый код находится в резидентной памяти или той же странице); и "далёкие" - посредством системной функции, переключающей страницу перед вызовом и после возврата.

    4) Для крайних случаев сделать системные функции вроде "Far memory Read" и "Far memory Write", которые перемещают данные из "чужой" или "в чужую" страницы.

    5) Резидентный код может вызывать системные фукнции переключения страниц и иметь непосредственный доступ к памяти из любых страниц.
    Цитата Сообщение от SfS Посмотреть сообщение
    Да и в одного както грустно творить чтото большое.
    Ну дык, аналогично. Давай скооперируемся. Я уже выкладывал прототип диспетчера многозадачности. С тех пор пришло много идей его улучшения, грустно только было за это браться ввиду отсутствия единомышленников! Также я недавно выложил свой оконный интерфейс, драйверы клавиатур, диска. Этот код старый, но тоже может быть тщательно переработан и выведен на современные стандарты качества. За последнюю неделю занимался функциями быстрого вывода текста. Выложить только не успел еще.
    Последний раз редактировалось Barmaley_m; 27.12.2018 в 01:40.

  8. #7

    Регистрация
    27.01.2005
    Сообщений
    924
    Спасибо Благодарностей отдано 
    28
    Спасибо Благодарностей получено 
    193
    Поблагодарили
    154 сообщений
    Mentioned
    2 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от Barmaley_m Посмотреть сообщение
    А по-моему лучше вообще не использовать никаких регистров. Кроме программистов на Си встречаются ещё программисты на ассемблере, которые передают параметры в регистрах. Например, "резидентная интерфейсная часть" (в английском используется термин "Import Library") может состоять из команд JP 0, JP 3, JP 6 и т.д., которые изменяются в ходе настройки основной программы на фактический адрес загрузки модулей.
    Отвечу сразу обоим.

    Не может резидентная часть "состоять из команд JP 0, JP 3, JP 6 и т.д., которые изменяются в ходе настройки основной программы" и вот почему. Я там кратко упомянул (потом дополню), что задача резидентной части не просто переход, но и обращение к менеджеру памяти для впечатывания нужной странички, той, в которой лежит данная библиотека. Поэтому, там придётся много чего использовать. И fastcall не выйдет. Опять же ограничение - стек должен быть в НЕПЕРЕКЛЮЧАЕМОЙ странице на момент обращения к библиотеке.

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

    Тут выбор простой - или "все предельно быстро" или "всё стандартно и по возможности быстро".

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

    - - - Добавлено - - -

    Кроме программистов на Си встречаются ещё программисты на ассемблере, которые передают параметры в регистрах
    Да пусть сколько угодно передают. Кто ж им мешает. Например, в альтернативном наборе, если хотят. Я могу пообещать его не использовать в менеджере памяти и своих процедурах поддержки подгружаемых модулей.

    Если немного философии-болтологии, то так. Как бы нам ни хотелось - любой ЯВУ это прежде всего стандарт. А стандарт - это рамки и ограничения. Зато и возможности быстро соединять разные модули воедино. Собственно, отсутствие стандартов на порты, системные вызовы и прочее и убило в своё время спектрум. Точнее убило возможности логичного расширения его аппаратной и программной архитектуры.

    Поэтому для "программистов на ассемблере" - остаётся ассемблер. Пусть хоть jump через stack себе там засовывают по ret на call. Но если они хотят, чтобы их модуль использовали другие, то им не сложно будет сделать интерфейсную часть, совместимую со стандартом - например забрать параметры со стека или отдать их в нужном регистре.

    - - - Добавлено - - -

    Цитата Сообщение от Barmaley_m Посмотреть сообщение
    Ну дык, аналогично. Давай скооперируемся. Я уже выкладывал прототип диспетчера многозадачности. С тех пор пришло много идей его улучшения, грустно только было за это браться ввиду отсутствия единомышленников!
    Я не против кооперации. Но есть проблема - мой абсолютно непредсказуемый и невменяемый график. Я вот несколько месяцев вообще ни за что не брался. Загруз был полный. Появилось время - за недельку по вечерам накидал описалово и доработал модульность. Кстати, описалово я больше для себя делаю. Пока код пишешь вроде все логично. А как возмешься его объяснять - другим и себе - сразу начинают косяки всплывать, которые не заметил.

    Я к тому, что мне сложно обещать что-то сделать в срок. Сегодня время есть - завтра трах-бах и я полетел на другой конец нашей необъятной Родины по наитию начальства. Или привалило работы, что до 22.00 сидишь и в 23.00 домой приходишь.

    - - - Добавлено - - -
    Для Shiny

    О каком "тулчейне венды" речь? Если о SDCC-NOINIT - то https://www.cygwin.com/ должен пойти.

  9. #8

    Регистрация
    19.01.2017
    Адрес
    г. Арзамас
    Сообщений
    2,450
    Записей в дневнике
    42
    Спасибо Благодарностей отдано 
    8
    Спасибо Благодарностей получено 
    162
    Поблагодарили
    119 сообщений
    Mentioned
    7 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от SfS Посмотреть сообщение
    Для Shiny

    О каком "тулчейне венды" речь? Если о SDCC-NOINIT - то https://www.cygwin.com/ должен пойти.
    кхм. а можно привести пример компиляции сырка для чайников и сковородок?

  10. #9

    Регистрация
    08.05.2007
    Адрес
    Dnepropetrovsk
    Сообщений
    1,089
    Спасибо Благодарностей отдано 
    281
    Спасибо Благодарностей получено 
    70
    Поблагодарили
    49 сообщений
    Mentioned
    3 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от SfS Посмотреть сообщение
    Не может резидентная часть "состоять из команд JP 0, JP 3, JP 6 и т.д., которые изменяются в ходе настройки основной программы" и вот почему. Я там кратко упомянул (потом дополню), что задача резидентной части не просто переход, но и обращение к менеджеру памяти для впечатывания нужной странички, той, в которой лежит данная библиотека. Поэтому, там придётся много чего использовать. И fastcall не выйдет.
    Понятно. Ну что ж, соглашусь. Если всякий раз сохранять регистры, используемые при переключении страницы, в стек, а потом их восстанавливать - то это будет по скорости не лучше, чем передача параметров сразу через стек.
    Цитата Сообщение от SfS Посмотреть сообщение
    Я могу пообещать его не использовать в менеджере памяти и своих процедурах поддержки подгружаемых модулей.
    Я думаю, достаточно гарантировать неиспользование каких-то регистров только при вызове функций из динамической библиотеки. Во всех остальных случаях твоей системы модулей это не критично.

    С остальным сказанным согласен.
    Цитата Сообщение от SfS Посмотреть сообщение
    Я не против кооперации. Но есть проблема - мой абсолютно непредсказуемый и невменяемый график.
    Ну и славно. А с графиком у меня не лучше. Так что просто посмотрим по обстоятельствам, как сложится.

    - - - Добавлено - - -

    Цитата Сообщение от SfS Посмотреть сообщение
    В общем как сделать прозрачный и удобный вызов функций при мягком связывании, если есть много страничек памяти - голову ломаю...
    У тебя же есть точка входа _hl_jumper. Вот и возвращать её адрес и требуемое значение hl из твоего аналога функции GetProcAddress.

    Ну или добавить к резидентной части каждого модуля функцию "CallProcModule", которая будет принимать один параметр и прыгать на _hl_jumper. Значение же этого параметра будет возвращать GetProcAddress.
    Последний раз редактировалось Barmaley_m; 28.12.2018 в 03:44.

  11. #10

    Регистрация
    27.01.2005
    Сообщений
    924
    Спасибо Благодарностей отдано 
    28
    Спасибо Благодарностей получено 
    193
    Поблагодарили
    154 сообщений
    Mentioned
    2 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от Barmaley_m Посмотреть сообщение
    У тебя же есть точка входа _hl_jumper. Вот и возвращать её адрес и требуемое значение hl из твоего аналога функции GetProcAddress.

    Ну или добавить к резидентной части каждого модуля функцию "CallProcModule", которая будет принимать один параметр и прыгать на _hl_jumper. Значение же этого параметра будет возвращать GetProcAddress.
    Она есть только если есть есть резидентная часть. Если я просто загрузил модуль и нашёл в нем функцию по имени, то ни точки _hl_jumper нет.
    Наверное придётся в библиотеку libso какойто универсальный кусочек пихать для вызова функций. Я подумаю, в общем.

Страница 1 из 5 12345 ПоследняяПоследняя

Информация о теме

Пользователи, просматривающие эту тему

Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)

Похожие темы

  1. Ответов: 8
    Последнее: 04.11.2006, 13:14
  2. Как писать простые програмы?
    от alexfreed в разделе Софт
    Ответов: 3
    Последнее: 11.12.2005, 14:57

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •