Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
Форум программистов > 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(®s, ®s, &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 ![]() 2 Coala :а можно этот экстендер прикрутить к BC++3.1? и где достать по нему нормальную инфу. |
Автор: Coala 5.5.2006, 15:15 |
Это - вряд ли. В самом компиляторе должна быть возможность создавать приложения защищенного режима, а в твоем Борланде ее помоему просто нет. То есть, сам драйвер тебя не спасет. |
Автор: cOZA 5.5.2006, 16:02 |
Хм. Да он пишет что Expanded Memory in use: 0 а: Extended Memory in use: 2619568 И помоему все приложение должно строиться так: оно проверяет загружен ли экстендер, затем запрашивает у него блок, и в случае удачи -> копирует его в расширенную память. Так? То есть нужно посылать в нужные регистры и извлекать из них... По крайней мере именно об этом и говорят те "методички" на кои дали ссылки в самом первом ответе. ЗЫ: Или я не туда иду? |
Автор: e-moe 5.5.2006, 16:37 |
а я думаю что можно. насколько я помню с экстендерами идет свой линкер который все это лепит в одну программу. Хотя я могу ошибаться... А вообще может проще перейти в 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 -> ломает ходить на "ДОС-машину", хочется удобства. ![]() |