На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
! Перед отправкой сообщения внимательно прочтите правила раздела!!!
1. Запрещается обсуждать написание вирусов, троянов и других вредоносных программ!
2. Помните, что у нас есть FAQ раздела Assembler и Полезные ссылки. Посмотрите, возможно, там уже имеется решение вашего вопроса.

3. Настоятельно рекомендуем обратить особое внимание на правила форума, которые нарушаются чаще всего:
  3.1. Заголовок темы должен кратко отражать её суть. Темы с заголовками типа "Срочно помогите!" или "Ассемблер" будут отправляться в Корзину для мусора.
  3.2. Исходники программ обязательно выделяйте тегами [code]...[/code] (одиночные инструкции можно не выделять).
  3.3. Нежелательно поднимать старые темы (не обновлявшиеся более года) без веской на то причины.

Не забывайте также про главные Правила форума!

Добро пожаловать и приятного вам общения!!! ;)
 
Модераторы: Jin X, Qraizer
Страницы: (2) [1] 2  все  ( Перейти к последнему сообщению )  
> линейный адрес для DOS UMB , как определить 32-битный адрес блока памяти в области UMB
    Программа загружена "вверх" (область UMB).
    Для взаимодействия с контроллером DMA и т.п., необходимо знать линейный (физический, он же 32-х битный)
    адрес.

    В случае, когда блок памяти расположен в "нижней" памяти - всё просто.
    А вот в случае с UMB - засада. :wacko:

    Обратившись к HIMEM.SYS по запросу
    mov ax,4309h
    int 2Fh
    можно получить адрес таблицы дескрипторов XMS-блоков; что-то близкое, но
    в этой талибце нет информации об "отображении" UMB.

    Итак, можно ли определить для сегмент:смещение (UMB) - его 32-х битный адрес ?
      Ну так выделяй буфер в нижней памяти, кто мешает то? Все равно контроллер DMA работает только с 24-х битным физическим адресом, так что 32-х битный тебе не поможет.
        XMS только менеджит UMA, если она есть, но не управляет ею. Создаёт UMA (точнее, эмулирует за счёт Extended или XMS, потому как UMA ьывает ещё и аппаратная) менеджер EMS. Так что на предмет отображения линейных адресов на физические - это к EMS/VCPI. Вообще же, для поддержки DMA в EMS4.0 есть дополнительные функции.
        Сообщение отредактировано: Qraizer -
          Цитата Qraizer @
          Вообще же, для поддержки DMA в EMS4.0 есть дополнительные функции.
          Которые лучше не использовать, все равно не работают :) Это как и в стандарте VCPI предусмотрено управление PIC, но это не значит, что эти функции сделают свое дело :)
          Под досом любой менеджер обеспечивает отображение первого мегабайта памяти на его физические адреса, так что все эти сервисы просто не нужны, достаточно откусить памяти в этом первом меге, что собственно и предоставляет дос.
            Ну да, рассказывай. Win2.xx и 3.0 на всю катушку юзали все эти фичи, которые простым смертным на фиг не нужны. Если не работатет, возможно, не были разрешены ОСные функции. Это тоже через EMS выставляется. Ради этих фич MS и добивалась-то EMS4.0 в таком виде, как он получился.
            PIC и DMA функции этой EMS4 руками не щупал, спорить не буду, а convertional кадрить - кадрил. QEMM, к примеру, кадрил почти всю convertional, EMM386 - поменьше, так что при желании можно было залинеить и младший метр. Потом через VCPI быстренько получал их физические адреса и строил свою таблицу страниц, чтобы выйти в PM через VCPI-API. Так что работает, проверено. Можно было обойтись и стандартным EMS-кадром, который 64К, только это медленнее. Да и многие DPMI-хосты и DOS-экстендеры таким образом получали карту соответствия.
            Другое дело, что это действительно на фиг не нужно, если есть возможность распределить блок прямо в первом метре. Тут ты прав. Но может у человека выбора нет.
            Сообщение отредактировано: Qraizer -
              Я проверял на DMA ;) Была такая либа, MIDAS, для проигрывания трекерной музыки. Если запускалась под досом, то она намеренно обходила этот сервис, юзая первый мег напрямую, если же под виндой, то юзала этот сервис, только вот несмотря на успешное завершение функций прога висла, поскольку функции работали неверно. После того, как я отрубил использование этого сервиса либа нормально заработала и под виндой. Версию EMM386 естественно уже не помню, но раз не сработало на одной, то значит есть риск нарваться. Выводы очевидны - не стоит использовать экзотические фичи от микрософта, это их девиз - стандарты пишутся для всех, кроме микрософта ;)
              Что касается PIC, то эта фича так и не заработала ни под досом, ни под виндой. Так и пришлось напрямую контроллер перепрограммировать, поскольку никак не смог снять скриншот с одной заумной програмки :)
              Что касается QEMM, то не проверял, использовал его только для перехвата обращений к портам (и софт-айс нафиг не нужен :) ). Но простые смертные пользовались им крайне редко, из-за проблем совместимости с виндой.
                Мы слегка уклонились от основой темы, не находишь? Эдак ещё в один холивар свалимся. MIDAS под виндой не юзал, а DMA юзал, проблем не заметил. Программил - работало, через SB успешно играл и писал. Траблы ИМХО не там были. Повторяю, это не MSные фичи, это EMSные (offtop - E MS :lol: ) фичи, введённые туда по инициативе MS, потому как они были полезны для многозадачности и виртуализации PICовых и DMAшных сущностей, и проапрувленные как стандартные, потому как никто не стал спорить, что за многозадачными ОСАми будущее, и MS не будет единственной с подобными инициативами. Реализация EMS может быть кривой, по рукам программерам давать надо вовремя, но это претензии не к EMS как таковой, согласись. И кстати, с чего ты взял, что эти функции не работали? Ты их правильно юзал? Я вот далеко не с первого раза осилил правила работы с ними, потому как имеющаяся документация была очень скудной, и то не уверен, что осилил правильно. Эти функции только помогают отслеживать параметры PIC и DMA, чтобы EMS сам следил за соответствием, когда странички перемапливал. Неважно, прямо по запросам приложений или опосредовано - путём других связанных с переотображением функций. А программить это всё равно самому надо было.
                Что касается основного вопроса топика возражений, надеюсь, нет? ;)
                Сообщение отредактировано: Qraizer -
                  Насколько я помню, для работы с DMA всегда память выделялась в первом Мбайте, причем надо было еще следить за тем, чтобы граница 64К-страницы не проходила внутри буфера, для чего при необходимости выделялось 2 буфера: один, чтобы выбрать память до границы страницы и второй - рабочий.
                  Проблема связана с тем, что для уменьшения стоимости IBM PC был использован процессор с 8-разрядной внешней шиной (8088) и набор периферии не от 16-разрядных, а от 8-разрядных процессоров, работающих с максимальным адресным пространством 64К. Соответственно и DMA имел адресное пространство 64К и при помощи 4 битов внешнего порта подключался к одной из шестнадцати 64К-байтных "страниц" Мбайтного адресного пространства процессора 8086/88.
                    Цитата andriano @
                    Насколько я помню, для работы с DMA всегда память выделялась в первом Мбайте, причем надо было еще следить за тем, чтобы граница 64К-страницы не проходила внутри буфера, для чего при необходимости выделялось 2 буфера: один, чтобы выбрать память до границы страницы и второй - рабочий.

                    Это смотря какой DMA :)
                    В ISA было два вида DMA - очень старые DMA1 (адрес 4+16), и DMA2 (адрес 8+16).
                    Сейчас в составе южного моста идут вроди оба (на самом деле он один - DMA2 просто расширение DMA1, адреса IO портов разные).
                    Так что в принципе можно в первых 16Мб память выделять.
                    http://elancev.h1.ru/texno/dma/dma.htm
                    Сообщение отредактировано: cppasm -
                      Нашел - как.

                      С помощью VCPI, int 67h, функция 6:
                      "Получить физический адрес страницы памяти, располагающейся в пределах первого мегабайта, т.е. в стандартной памяти".

                      Действительно отрабатывает как надо. Получаю реальные (32 бит) адреса для сегментов C000h, D000h, E000h.

                      Критический случай - когда программа загружена вверх, а VCPI отсутствует (адрес int 67h==NULL или VCPI просто не отзывается).

                      Пока доволен :)
                      Всем спасибо !
                        Цитата cppasm @
                        Так что в принципе можно в первых 16Мб память выделять.
                        http://elancev.h1.ru/texno/dma/dma.htm

                        Есть такое понятие - IBM PC совместимый компьютер.
                        В современном "совместимом" ися рассыпуха, которая была в оригинальном IBM PC, сосредоточена в одной микросхеме, при этом, как правило, никакого расширения функций не наблюдается, а вот наоборот - сколько угодно: приходилось сталкиваться со случаями, когда чипсет того или иного производителя поддерживал не все режимы DMA оригинального конроллера (а только часто используемые), имеют ограничение на длину буфера в 4 Кбайта и т.п.
                        В оригинальном IBM PC был 1 Мбайт, и нет никаких оснований считать, что ВСЕ производители чипсетов будут расширять это пространство, причем единообразным способом.
                        Опять же, функция выделеия памяти в 1-м Мбайте есть, а вот в первых 16-ти - что-то не припоминаю.
                          Я спорить не собираюсь.
                          Ссылку выше привёл, и таких ещё найти можно множество.
                          С флопика например данные успешно читаются в буфер в первых 16Мб.
                          И кто сказал что этот режим является IBM не совместимым?
                            cppasm
                            1. На каком именно чипсете это работает? Или ты возмешься утверждать, что на всех без исключения?
                            2. Адресное пространство IBM PC - 1 Мбайт. Все, что выше, не является IBM-совместимым.
                              Цитата andriano @
                              1. На каком именно чипсете это работает? Или ты возмешься утверждать, что на всех без исключения?

                              Да, на всех без исключения чипсетах рассчитанных на работу с х286 и выше.
                              Цитата andriano @
                              2. Адресное пространство IBM PC - 1 Мбайт. Все, что выше, не является IBM-совместимым.

                              Какой-то странный у тебя критерий совместимости. Машина с i386 уже не является IBM-совместимой?
                              Даже все современные ПК на базе х86 считаются IBM-совместимыми, и так оно по сути и есть.
                                Ключевые слова для гугления - Virtual DMA Services или VDS.
                                http://support.microsoft.com/kb/93469
                                0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                                0 пользователей:


                                Рейтинг@Mail.ru
                                [ Script execution time: 0,0382 ]   [ 16 queries used ]   [ Generated: 28.03.24, 12:44 GMT ]