
![]() |
Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
|
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[216.73.216.52] |
![]() |
|
Страницы: (2) [1] 2 все ( Перейти к последнему сообщению ) |
Сообщ.
#1
,
|
|
|
Программа загружена "вверх" (область UMB).
Для взаимодействия с контроллером DMA и т.п., необходимо знать линейный (физический, он же 32-х битный) адрес. В случае, когда блок памяти расположен в "нижней" памяти - всё просто. А вот в случае с UMB - засада. ![]() Обратившись к HIMEM.SYS по запросу mov ax,4309h int 2Fh можно получить адрес таблицы дескрипторов XMS-блоков; что-то близкое, но в этой талибце нет информации об "отображении" UMB. Итак, можно ли определить для сегмент:смещение (UMB) - его 32-х битный адрес ? |
Сообщ.
#2
,
|
|
|
Ну так выделяй буфер в нижней памяти, кто мешает то? Все равно контроллер DMA работает только с 24-х битным физическим адресом, так что 32-х битный тебе не поможет.
|
![]() |
Сообщ.
#3
,
|
|
XMS только менеджит UMA, если она есть, но не управляет ею. Создаёт UMA (точнее, эмулирует за счёт Extended или XMS, потому как UMA ьывает ещё и аппаратная) менеджер EMS. Так что на предмет отображения линейных адресов на физические - это к EMS/VCPI. Вообще же, для поддержки DMA в EMS4.0 есть дополнительные функции.
|
Сообщ.
#4
,
|
|
|
Цитата Qraizer @ Которые лучше не использовать, все равно не работают Вообще же, для поддержки DMA в EMS4.0 есть дополнительные функции. ![]() ![]() Под досом любой менеджер обеспечивает отображение первого мегабайта памяти на его физические адреса, так что все эти сервисы просто не нужны, достаточно откусить памяти в этом первом меге, что собственно и предоставляет дос. |
![]() |
Сообщ.
#5
,
|
|
Ну да, рассказывай. Win2.xx и 3.0 на всю катушку юзали все эти фичи, которые простым смертным на фиг не нужны. Если не работатет, возможно, не были разрешены ОСные функции. Это тоже через EMS выставляется. Ради этих фич MS и добивалась-то EMS4.0 в таком виде, как он получился.
PIC и DMA функции этой EMS4 руками не щупал, спорить не буду, а convertional кадрить - кадрил. QEMM, к примеру, кадрил почти всю convertional, EMM386 - поменьше, так что при желании можно было залинеить и младший метр. Потом через VCPI быстренько получал их физические адреса и строил свою таблицу страниц, чтобы выйти в PM через VCPI-API. Так что работает, проверено. Можно было обойтись и стандартным EMS-кадром, который 64К, только это медленнее. Да и многие DPMI-хосты и DOS-экстендеры таким образом получали карту соответствия. Другое дело, что это действительно на фиг не нужно, если есть возможность распределить блок прямо в первом метре. Тут ты прав. Но может у человека выбора нет. |
Сообщ.
#6
,
|
|
|
Я проверял на DMA
![]() ![]() Что касается PIC, то эта фича так и не заработала ни под досом, ни под виндой. Так и пришлось напрямую контроллер перепрограммировать, поскольку никак не смог снять скриншот с одной заумной програмки ![]() Что касается QEMM, то не проверял, использовал его только для перехвата обращений к портам (и софт-айс нафиг не нужен ![]() |
![]() |
Сообщ.
#7
,
|
|
Мы слегка уклонились от основой темы, не находишь? Эдак ещё в один холивар свалимся. MIDAS под виндой не юзал, а DMA юзал, проблем не заметил. Программил - работало, через SB успешно играл и писал. Траблы ИМХО не там были. Повторяю, это не MSные фичи, это EMSные (offtop - E MS
![]() Что касается основного вопроса топика возражений, надеюсь, нет? ![]() |
Сообщ.
#8
,
|
|
|
Насколько я помню, для работы с DMA всегда память выделялась в первом Мбайте, причем надо было еще следить за тем, чтобы граница 64К-страницы не проходила внутри буфера, для чего при необходимости выделялось 2 буфера: один, чтобы выбрать память до границы страницы и второй - рабочий.
Проблема связана с тем, что для уменьшения стоимости IBM PC был использован процессор с 8-разрядной внешней шиной (8088) и набор периферии не от 16-разрядных, а от 8-разрядных процессоров, работающих с максимальным адресным пространством 64К. Соответственно и DMA имел адресное пространство 64К и при помощи 4 битов внешнего порта подключался к одной из шестнадцати 64К-байтных "страниц" Мбайтного адресного пространства процессора 8086/88. |
Сообщ.
#9
,
|
|
|
Цитата 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 |
Сообщ.
#10
,
|
|
|
Нашел - как.
С помощью VCPI, int 67h, функция 6: "Получить физический адрес страницы памяти, располагающейся в пределах первого мегабайта, т.е. в стандартной памяти". Действительно отрабатывает как надо. Получаю реальные (32 бит) адреса для сегментов C000h, D000h, E000h. Критический случай - когда программа загружена вверх, а VCPI отсутствует (адрес int 67h==NULL или VCPI просто не отзывается). Пока доволен ![]() Всем спасибо ! |
Сообщ.
#11
,
|
|
|
Цитата cppasm @ Так что в принципе можно в первых 16Мб память выделять. http://elancev.h1.ru/texno/dma/dma.htm Есть такое понятие - IBM PC совместимый компьютер. В современном "совместимом" ися рассыпуха, которая была в оригинальном IBM PC, сосредоточена в одной микросхеме, при этом, как правило, никакого расширения функций не наблюдается, а вот наоборот - сколько угодно: приходилось сталкиваться со случаями, когда чипсет того или иного производителя поддерживал не все режимы DMA оригинального конроллера (а только часто используемые), имеют ограничение на длину буфера в 4 Кбайта и т.п. В оригинальном IBM PC был 1 Мбайт, и нет никаких оснований считать, что ВСЕ производители чипсетов будут расширять это пространство, причем единообразным способом. Опять же, функция выделеия памяти в 1-м Мбайте есть, а вот в первых 16-ти - что-то не припоминаю. |
Сообщ.
#12
,
|
|
|
Я спорить не собираюсь.
Ссылку выше привёл, и таких ещё найти можно множество. С флопика например данные успешно читаются в буфер в первых 16Мб. И кто сказал что этот режим является IBM не совместимым? |
Сообщ.
#13
,
|
|
|
cppasm
1. На каком именно чипсете это работает? Или ты возмешься утверждать, что на всех без исключения? 2. Адресное пространство IBM PC - 1 Мбайт. Все, что выше, не является IBM-совместимым. |
Сообщ.
#14
,
|
|
|
Цитата andriano @ 1. На каком именно чипсете это работает? Или ты возмешься утверждать, что на всех без исключения? Да, на всех без исключения чипсетах рассчитанных на работу с х286 и выше. Цитата andriano @ 2. Адресное пространство IBM PC - 1 Мбайт. Все, что выше, не является IBM-совместимым. Какой-то странный у тебя критерий совместимости. Машина с i386 уже не является IBM-совместимой? Даже все современные ПК на базе х86 считаются IBM-совместимыми, и так оно по сути и есть. |
Сообщ.
#15
,
|
|
|
Ключевые слова для гугления - Virtual DMA Services или VDS.
http://support.microsoft.com/kb/93469 |