Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > верхняя память в DOS


Автор: cOZA 4.5.2006, 08:42
Помогите разобраться с выделением памяти под "чистым" DOS'ом. Необходимо увидеть, желательно, все 128 метров памяти. А он видит только порядка 640К. Говорят что можно использовать XMS расширитель, но я с ним не работал и не знаю как им пользоваться.
Если можно - то какие-нибудь доки (на русском, желательно) или примеры использования расширителей, или ссылки.

Заранее благодарен. 

Автор: e-moe 4.5.2006, 14:22
для XMS нужен драйвер hymem.sys
подробнее читай http://labinskiy.googlepages.com/home (Методички по системному программированию) 

Автор: cOZA 5.5.2006, 07:22
Спасибо - но я это знал и ранее. А вопрос у меня в том как писать программу в BC++3.1 так чтоб она ИСПОЛЬЗОВАЛА (по возможности всю) как можно больше памяти. И не говорила о том что structure too big.
Как это сделать?

Автор: bsa 5.5.2006, 08:55
Никак, имхо.
Для работы с непрерывными объемами памяти (для структур, например) более 64Кб необходимо работать в 32-х битном режиме. А чистый ДОС это делать не умеет. Для этого нужно использовать специальную надстройку (типа DOS-4GW, если не ошибаюсь). Но она должна поддерживаться компилятором.
Как вариант, попробуй использовать другой компилятор (не от Borland), который позволяет делать ДОС-приложения для защищенного режима процессора. 

Автор: cOZA 5.5.2006, 09:17
Не совсем согласен. Хотя бы 32 метра но увидеть можно. Видел как у человека прога захватывала ~20 метров и общалась с ними как хотела.
Вот только с ним я уже не могу поговорить.
Если кто знает - подскажите. Выход должен быть. 

Автор: Coala 5.5.2006, 12:12
В любом случае нужен драйвер памяти защищенного режима. В своё время писал на Watcom C/C++ 10, в его комплект как раз и входит DOS4GW.EXE, о котором говорил bsa. И опять же (если память МОЯ не изменяет) - доступны будут только 32 метра. 
ЗЫ - если кто ещё помнит досовские Дум и Хексен - они как раз были написаны на Ваткоме и работали в защищенном режиме. А сам драйвер был встроен в экзешник игры. 

Автор: cOZA 5.5.2006, 14:45
Подскажите как здесь поступить? Ругается в указанном месте:

#include<stdio.h>
#include<dos.h>
int main(void)
{
  union REGS regs;
  struct SREGS segregs;
  typedef struct _DRIVER
   {
     struct _DRIVER far *pNext;
     int DevAttr;
     unsigned int Strategy;
     unsigned int Interrupt;
     char sName[8];
   };
  struct _DRIVER far *ptr;
  unsigned int i, offset;
  printf("Адрес заголовка   Имя устройства\n\n");
  regs.h.ah = 0x52;
  intdosx(&regs, &regs, &segregs);
  ptr = MK_FP(segregs.es, regs.x.bx + 0x22); //<<-- несовметимы типы
  offset = FP_OFF(ptr);
  while(offset != 0xFFFF)
   {
     printf("%04X:%04X          ", FP_SEG(ptr), offset);
     if(ptr->DevAttr < 0)
        for(i = 0; i <= 7; i++) printf("%c", ptr->sName[i]);
       else printf("Блочное устройство");
     printf("\n");
     ptr=ptr->pNext;
     offset = FP_OFF(ptr);
    }
  return 0;
 }

Добавлено @ 14:52 
 smile  Сорри - только сейчас понял в чем проблема.

2 Coala :а можно этот экстендер прикрутить к BC++3.1?
и где достать по нему нормальную инфу. 

Автор: Coala 5.5.2006, 15:15
Цитата(cOZA @  5.5.2006,  15:45 Найти цитируемый пост)
Coala :а можно этот экстендер прикрутить к BC++3.1?
Это - вряд ли. В самом компиляторе должна быть возможность создавать приложения защищенного режима, а в твоем Борланде ее помоему просто нет. То есть, сам драйвер тебя не спасет.
 

Автор: cOZA 5.5.2006, 16:02
Хм. Да он пишет что Expanded Memory in use: 0
а: Extended Memory in use: 2619568

И помоему все приложение должно строиться так:
оно проверяет загружен ли экстендер, затем запрашивает у него блок, и в случае удачи -> копирует его в расширенную память. Так?
То есть нужно посылать в нужные регистры и извлекать из них...
По крайней мере именно об этом и говорят те "методички" на кои дали ссылки в самом первом ответе.

ЗЫ: Или я не туда иду? 

Автор: e-moe 5.5.2006, 16:37
Цитата(cOZA @  5.5.2006,  13:45 Найти цитируемый пост)
2 Coala :а можно этот экстендер прикрутить к BC++3.1?

а я думаю что можно. насколько я помню с экстендерами идет свой линкер который все это лепит в одну программу.
Хотя я могу ошибаться...

А вообще может проще перейти в Unreal режим? Тогда можно без проблем в "реальном" режиме использовать до 4 Гб памяти...
ну только нужно будет менеджер памяти написать на асме...
 

Автор: bsa 5.5.2006, 19:33
Действительно, а что мешает перейти на Linux (*BSD и т.п.) или Windows? Там таких проблем нет. Только драйвер уровня ядра надо написать. Но, имхо, это не так сложно. 

Автор: cOZA 6.5.2006, 05:27
Мешает - сама постановка задачи. ДОС система реал-таймовая, а именно это и нужно в данной задаче.

ЗЫ: Да и самому интересно решить проблему.
 

Автор: Exekutor 6.5.2006, 07:22
Адресовать более 64кб можно если использовать несколько сигментов кода. Но это чистый ассемблер. 

Автор: cOZA 6.5.2006, 07:43
Не согласен. Как выяснилось есть множество библиотек позволяющие производить данные манипуляции с памятью.

Кстати подскажите как подключить HIMEM.sys (обеспечивает XMS спецификацию) к WinXP -> ломает ходить на "ДОС-машину", хочется удобства.  smile 
 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)