
![]() |
Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
|
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[216.73.216.3] |
![]() |
|
Сообщ.
#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 |
Сообщ.
#16
,
|
|
|
Хорош вам спорить
![]() Для тех, кто по прежнему считает, что можно безбояненно использовать сервис 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) |