Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[54.224.52.210] |
|
Сообщ.
#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 @ Которые лучше не использовать, все равно не работают Это как и в стандарте VCPI предусмотрено управление PIC, но это не значит, что эти функции сделают свое дело Вообще же, для поддержки 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 Была такая либа, MIDAS, для проигрывания трекерной музыки. Если запускалась под досом, то она намеренно обходила этот сервис, юзая первый мег напрямую, если же под виндой, то юзала этот сервис, только вот несмотря на успешное завершение функций прога висла, поскольку функции работали неверно. После того, как я отрубил использование этого сервиса либа нормально заработала и под виндой. Версию EMM386 естественно уже не помню, но раз не сработало на одной, то значит есть риск нарваться. Выводы очевидны - не стоит использовать экзотические фичи от микрософта, это их девиз - стандарты пишутся для всех, кроме микрософта
Что касается PIC, то эта фича так и не заработала ни под досом, ни под виндой. Так и пришлось напрямую контроллер перепрограммировать, поскольку никак не смог снять скриншот с одной заумной програмки Что касается QEMM, то не проверял, использовал его только для перехвата обращений к портам (и софт-айс нафиг не нужен ). Но простые смертные пользовались им крайне редко, из-за проблем совместимости с виндой. |
Сообщ.
#7
,
|
|
|
Мы слегка уклонились от основой темы, не находишь? Эдак ещё в один холивар свалимся. MIDAS под виндой не юзал, а DMA юзал, проблем не заметил. Программил - работало, через SB успешно играл и писал. Траблы ИМХО не там были. Повторяю, это не MSные фичи, это EMSные (offtop - E MS ) фичи, введённые туда по инициативе MS, потому как они были полезны для многозадачности и виртуализации PICовых и DMAшных сущностей, и проапрувленные как стандартные, потому как никто не стал спорить, что за многозадачными ОСАми будущее, и MS не будет единственной с подобными инициативами. Реализация EMS может быть кривой, по рукам программерам давать надо вовремя, но это претензии не к EMS как таковой, согласись. И кстати, с чего ты взял, что эти функции не работали? Ты их правильно юзал? Я вот далеко не с первого раза осилил правила работы с ними, потому как имеющаяся документация была очень скудной, и то не уверен, что осилил правильно. Эти функции только помогают отслеживать параметры PIC и DMA, чтобы EMS сам следил за соответствием, когда странички перемапливал. Неважно, прямо по запросам приложений или опосредовано - путём других связанных с переотображением функций. А программить это всё равно самому надо было.
Что касается основного вопроса топика возражений, надеюсь, нет? |
Сообщ.
#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 |
Сообщ.
#16
,
|
|
|
Хорош вам спорить Абсолютно все ОС, в целях совместимости со старым програмным обеспечением, предоставляют средства для выделения памяти в первом мегабайте. Что касается следующих 15-ти метров, то не стоит на них ориентироваться, если предполагается работа в виртуальном режиме, которым управляет не ваша прога. И с VDS не стоит заморачиваться, легко нарваться на неприятности. Вчера попробовал под 98-й виндой. Прога намертво висла, т.е. функции VDS не возвращали признаков ошибок (именно поэтому и висла). Стоило только заменить сервис VDS на старый-добрый ДОС, как все нормально заработало.
Для тех, кто по прежнему считает, что можно безбояненно использовать сервис VDS советую заглянуть в "The x86/MSDOS Interrupt List", от Ralf Brown. Далеко ходить не нужно: Цитата INT 4B - Virtual DMA Specification - LOCK DMA REGION AX = 8103h DX = flags (see #03220) ES:DI -> DMA descriptor structure (see #03221,#03222,#03223) Return: CF clear if successful DDS physical address field filled in DDS buffer ID field filled (0000h if no buffer allocated) CF set on error AL = error code (see #03218) DDS region size field filled wth maximum contiguous length in bytes BUGS: Windows 3.0 does not correctly support automatic remapping or copying in enhanced mode Windows 3.0 in enhanced mode does not return a correct code on error Именно на этой функции у меня и висла прога под 98-й виндой Добавлено Цитата cppasm @ А теперь подумай, почему они считаются совместимыми? Да потому, что они способны выполнять код 8086-го процессора, который и назывался IBM PC. Но с программами немножко по другому. Если твоя программа сможет выполняться на 8086-м, то это IBM PC совместимая прога, если же она расчитана на более совершенные модели процессоров/систем, то это уже x86-совместимость. Так что andriano прав. Даже все современные ПК на базе х86 считаются IBM-совместимыми, и так оно по сути и есть. |
Сообщ.
#17
,
|
|
|
Можно подробнее о функции
mov ax,4309h int 2Fh |
Сообщ.
#18
,
|
|
|
--------m-2F4309----------------------------- INT 2F U - HIMEM.SYS v3.09+ - GET XMS HANDLE TABLE AX = 4309h Return: AL = 43h if function supported ES:BX -> XMS handle table (see #02747) Note: HIMEM.SYS v3.09 is part of MS-DOS 6.0. SeeAlso: AX=4308h Format of XMS handle table: Offset Size Description (Table 02747) 00h BYTE ??? (01h in HIMEM.SYS v3.09) 01h BYTE size of one handle descriptor 02h WORD number of handles (default = 20h) 04h DWORD pointer to XMS handle array (see #02748) SeeAlso: #02777 Format of XMS handle descriptor [array]: Offset Size Description (Table 02748) 00h BYTE flag 01h=free, 02h=used, 04h=in pool but not associated with any EMB 01h BYTE lock count (00h=unlocked) 02h DWORD address of XMS block in KB (shift left by 10 for abs. address) 06h DWORD size of XMS block in KB |
Сообщ.
#19
,
|
|
|
Функция mov ax,4309h int 2Fh прекрасно работает на XMS v3+
Существует ли чтонибуть подабное для старых версий (например XMS v2) |