Модераторы: feodorv, GremlinProg, xvr, Fixin
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Выделение диапазона адресов для окна памяти платы 
:(
    Опции темы
Veri
Дата 27.9.2011, 08:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 6
Регистрация: 27.9.2011

Репутация: нет
Всего: нет



Здравствуйте, уважаемые специалисты.
Прошу вашего совета и рекомендации в следующей проблеме:
В наличии есть одноплатный компьютер, работающий с шиной PC-104 и плата ISA, разработанная сторонним специалистом. Тот специалист проводил разработку и тестирование из DOS, благодаря чему сразу встал вопрос о написании драйвера к данному устройству. Так как соответствующего специалиста в отделе нет, то проблема решается готовыми решениями - вроде драйвера PortIO, который замечательно работает с регистрами данной платы. Но кроме задачи доступа к регистрам, требуется доступ к окну памяти в 16 кб, который должен располагаться в диапазоне адресов С8000-DFFFF. Работая из XP, требуется записывать 16кб в диапазон приписанный к плате, а плата разом забирает эти данные - это быстрее, чем через регистры (пишу это заранее, как ответ на вопрос, почему бы не сделать пакетную пересылку).
Мною были осуществлены попытки по написанию драйвера под ISA. Проблема ISA, не являющейся PNP-устройством, в отличие от PCI платы (где благодаря PNP вопросы о выделении памяти и выдаче необходимых указателей решаются системой) именно в том, что нигде я не могу найти нужного механизма описания платы и диапазона адресов, который к ней нужно прицепить. Я рассматривал примеры amcc5933 и pcidrv, но проблема там та же самая (в первом случае драйвер для ISA рассматривает лишь доступ к порту, а во втором - диапазон адресов цепляется через PNP).
Итак, следующие вопросы:
1) Если плата работает с тестами под DOS, хотя при этом в BIOS нет настроек, позволяющих закрепить некий адресный диапазон за PCI (shared memory, shadowing имею в виду), то каким образом правила игры меняются, когда загружается XP со своими кольцами защиты и драйверной моделью? 
2) Каким образом требуется описывать не только порты ISA-платы, но и используемую ей память? 
Любые примеры, рекомендации, указания к действию, слова о том, что я все неправильно понимаю и что все по-другому - с благодарностью принимаются. Но только напишите, как "по-другому" и куда копать 

Заранее спасибо.
PM MAIL   Вверх
borisbn
Дата 27.9.2011, 09:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

Репутация: 6
Всего: 135



Veri, PortIo устарел. Вот на этом сайте есть WinIO. Позволяет работать как с портами, так и с физической памятью.
Вот пример работы с WinIO
Код

#include "winio.h"
void main()
{
  DWORD dwPortVal;
  DWORD dwMemVal;
  bool bResult;
  HANDLE hPhysicalMemory;
  PBYTE pbLinAddr;

  bResult = InitializeWinIo();
  if ( bResult ) {
    GetPortVal(0x378, &dwPortVal, 4);
    SetPortVal(0x378, 10, 4);

    // Map physical addresses 0xA0000 - 0xAFFFF into the linear address space of the application.
    pbLinAddr = MapPhysToLin((PBYTE)0xA0000, 65536, &hPhysicalMemory);
    if ( pbLinAddr ) {
      *pbLinAddr = 10;
      UnmapPhysicalMemory(hPhysicalMemory, pbLinAddr);
    }
    ShutdownWinIo();
  }
}


Мало того, парочку действий (сам не догадаешься каких - спрашивай) и ты сможешь использовать твой DOS-овский код под Windows.


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
Veri
Дата 27.9.2011, 10:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 6
Регистрация: 27.9.2011

Репутация: нет
Всего: нет



borisbn, спасибо, я даже уже встречал данный драйвер на волне своих поисков. Говоря по-простому, мне нужно реализовать досовские peek и poke, но перед этим решив следующий вопрос - требуется ли каким-то образом размечать диапазон памяти для системы, что он является ресурсом конкретной платы? Дело в том, что даже используя подобные модули для чтения и записи физической памяти, будь то через драйвер или через device\physicalmemory, участки этого диапазона читаются (и там изначальное пусто), но не пишутся. То есть даже после записи там остаются незаписанные свободные ячейки памяти. При этом на одноплатнике, где не стоит сторонних устройств шины PCI, вся память данного диапазона работает так - читается пустой и не пишется. На рабочем десктопе с вставленными PCI-устройствами некоторые участки данного диапазона и читаются, и пишутся, а некоторые ведут себя аналогично первому. Отсюда возникло подозрение - что если данный диапазон не закреплен за каким-либо устройством, то запись туда и не производится. Но если это так, то кто это курирует, на каком этапе, BIOS, OS или нечто иное?
PM MAIL   Вверх
borisbn
Дата 27.9.2011, 10:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

Репутация: 6
Всего: 135



Цитата(Veri @  27.9.2011,  10:12 Найти цитируемый пост)
Отсюда возникло подозрение - что если данный диапазон не закреплен за каким-либо устройством, то запись туда и не производится

Нет. Это не так. Когда ты пишешь в какую-то ячейку памяти, процессор тупо выставляет соответствующий физический адрес на шину адресов, и данные - на шину данных.
Единственный момент - на плате находится не совсем память в обычном понимании. Плата может принять данные по какому-то адресу, но совершенно не обязательно будет отдавать эти же данные по этому же адресу. Если какому-либо PCI-устройству выделен тот же диапазон адресов, что и твоей ISA-плате, то она будет отдавать свои данные при попытке чтения с этого адреса, и как-то интерпретировать их при попытке записи.

Цитата(Veri @  27.9.2011,  10:12 Найти цитируемый пост)
Но если это так, то кто это курирует, на каком этапе, BIOS, OS или нечто иное?

BIOS. Ос тут не при чём. В BIOS-ах (в некоторых, не во всех) можно выставить, что такой-то диапазон памяти зарезервировать под не PnP-устройства. Тогда его не будут отдавать этим устройствам.

Это сообщение отредактировал(а) borisbn - 27.9.2011, 10:27


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
Veri
Дата 27.9.2011, 10:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 6
Регистрация: 27.9.2011

Репутация: нет
Всего: нет



Цитата(borisbn @  27.9.2011,  10:26 Найти цитируемый пост)
Единственный момент - на плате находится не совсем память в обычном понимании. Плата может принять данные по какому-то адресу, но совершенно не обязательно будет отдавать эти же данные по этому же адресу. Если какому-либо PCI-устройству выделен тот же диапазон адресов, что и твоей ISA-плате, то она будет отдавать свои данные при попытке чтения с этого адреса, и как-то интерпретировать их при попытке записи.

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

Спасибо вам большое за ответы, но не могли бы вы разъяснить такой момент - все платы, использующие память компьютера для своей работы должны изначально не скрещиваться друг с другом по используемым диапазонам, ведь bios не занимается тем, что распределяет по своему усмотрению диапазоны памяти, кому и в каком порядке - те просят сами, так? Именно в таком случае выходит, что задавая базовый адрес окна на нашей плате записью этого адреса в регистр, при этом уже находясь в среде XP, мы затем запрашиваем напрямую через драйвер этот диапазон и пишем туда. Признаюсь, я использовал другую библиотеку для записи в память, MemAccess, но проводя все требуемые действия по установке базового адреса окна, записи туда данных, я при чтении получал FF. Поэтому я выискиваю проблему именно в контексте невидимости для какого-либо диспетчера этой связи платы и памяти. Не могли бы вы как-то это прокомментировать?

Это сообщение отредактировал(а) Veri - 27.9.2011, 10:53
PM MAIL   Вверх
borisbn
Дата 27.9.2011, 11:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

Репутация: 6
Всего: 135



Цитата(Veri @  27.9.2011,  10:46 Найти цитируемый пост)
все платы, использующие память компьютера для своей работы должны изначально не скрещиваться друг с другом по используемым диапазонам, ведь bios не занимается тем, что распределяет по усмотрению им нужные диапазоны памяти, так?

Для PCI-плат (вернее для PnP) BIOS как раз и занимается тем, чтобы распределить адреса таким образом, чтобы они не пересекались. Для ISA-же плат - полная вакханалия.

Цитата(Veri @  27.9.2011,  10:46 Найти цитируемый пост)
я при чтении получал FF

Повторю, плата не обязана выдавать по какому-либо адресу то, что в этот адрес было записано.
Если такой код
Код
mem[ 0 ] = 42;
bool b = ( mem[ 0 ] == 42 );

всегда выдаёт true, если mem - это указатель на ОЗУ (изменение этой ячейки в другом потоке сейчас не рассматриваем), то совершенно не факт, что, если mem указывает на память платы, результат будет true.

Цитата(Veri @  27.9.2011,  10:46 Найти цитируемый пост)
базовый адрес окна можно выставлять на регистре платы

имеется в виду физически джамперами или базовый адрес задаётся записью в некий порт платы (адрес этого порта ессно должен быть жёстко "прошит") ?


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
Veri
Дата 27.9.2011, 11:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 6
Регистрация: 27.9.2011

Репутация: нет
Всего: нет



Цитата(borisbn @  27.9.2011,  11:00 Найти цитируемый пост)
имеется в виду физически джамперами или базовый адрес задаётся записью в некий порт платы (адрес этого порта ессно должен быть жёстко "прошит") ? 

Нет, не джамперами, а именно в порт. Плата поддерживает лишь диапазон С8000-DFFFF для выбора окна (в целевом же устройстве три таких платы одновременно с выделенным в этом диапазоне окном под каждую из них).
PM MAIL   Вверх
borisbn
Дата 27.9.2011, 11:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

Репутация: 6
Всего: 135



Кстати, ты можешь посмотреть задействованные адреса в диспетчере устройств, если выберешь в меню "Вид" пункт "Ресурсы по типу".
user posted image


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
Veri
Дата 27.9.2011, 11:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 6
Регистрация: 27.9.2011

Репутация: нет
Всего: нет



Условно, говоря, ISA-плата - этой такой варвар, который будет лезть в чужое адресное пространство, причем даже разное, если ему уже из XP постоянно менять базовый адрес окна записью значения в порт? smile
PM MAIL   Вверх
bsa
Дата 27.9.2011, 13:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 1
Всего: 196



Veri, да. именно поэтому необходим грамотный драйвер, который уведомит ОС о том, что есть такой-то диапазон адресов, который используется устройством. После этого ОС исключит этот адрес из "свободного обращения". Если же диапазон памяти уже занят, то ОС вернет ошибку. В этом случае, можно попытаться использовать другой диапазон... И так далее, пока не будет найден свободный. А уже после этого можно включать и инициализировать устройство.
PM   Вверх
borisbn
Дата 27.9.2011, 13:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

Репутация: 6
Всего: 135



Veri, и всё же посмотри в Setup'е копьютера, есть ли там пункт с примерно таким содержанием: "Зарезервировать следующий диапазон адресов для не PnP-плат". Если есть, то можно обойтись без драйвера.


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
xvr
Дата 27.9.2011, 17:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 40
Всего: 223



Цитата(Veri @  27.9.2011,  11:24 Найти цитируемый пост)
словно, говоря, ISA-плата - этой такой варвар, который будет лезть в чужое адресное пространство,

Нет, не будет. На PCI машинах ISA шина находится за специальным PCI-ISA мостом, на котором активирован Substractive Decoder. Т.е. обращения пойдут на ISA шину только тогда, когда на всех PCI шинах не найдется никого, кому бы этот адрес понадобился. Так что смотри memory map ( http://forum.vingrad.ru/index.php?showtopi...t&p=2406830 ) и проверяй. 
А для захвата адресов (и организации обмена) придется писать свой драйвер


PM MAIL   Вверх
Veri
Дата 28.9.2011, 15:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 6
Регистрация: 27.9.2011

Репутация: нет
Всего: нет



Спасибо за ответы!
Но при пробе работы WinIO возникает ошибка при запуске процедуры инициализации драйвера WinIO. Это каким-то образом связано с уже наличием UserPort, так как он уже стоял на исходной машине. Для пробы я установил userport на другой машине, где WinIO успешно запускался - и тот перестал инициализироваться. Сталкивался ли кто-либо с такой проблемой и можно ли справиться иным способом, нежели заново развертывать систему?
Само собой, я удалял файл драйвера и ключи в реестре, но что-то упускаю.

Это сообщение отредактировал(а) Veri - 28.9.2011, 15:56
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Системное программирование и WinAPI"
Fixin
GremlinProg
xvr
feodorv
  • Большое количество информации и примеров с использованием функций WinAPI можно найти в MSDN
  • Описание сообщений, уведомлений и примеров с использованием компонент WinAPI (BUTTON, EDIT, STATIC, и т.п.), можно найти в MSDN Control Library
  • Непосредственно, перед созданием новой темы, проверьте заголовок и удостоверьтесь, что он отражает суть обсуждения.
  • После заполнения поля "Название темы", обратите внимание на наличие и содержание панели "А здесь смотрели?", возможно Ваш вопрос уже был решен.
  • Приводите часть кода, в которой предположительно находится проблема или ошибка.
  • Если указываете код, пользуйтесь тегами [code][/code], или их кнопочными аналогами.
  • Если вопрос решен, воспользуйтесь соответствующей ссылкой, расположенной напротив названия темы.
  • Один топик - один вопрос!
  • Перед тем как создать тему - прочтите это .

На данный раздел распространяются Правила форума и Правила раздела С++:Общие вопросы .


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Chipset, Step, Fixin, GremlinProg, xvr. feodorv.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Системное программирование и WinAPI | Следующая тема »


 




[ Время генерации скрипта: 0.1054 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.