![]() |
Модераторы: Daevaorn |
![]() ![]() ![]() |
|
cOZA |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 16 Регистрация: 28.4.2006 Репутация: нет Всего: нет |
Помогите разобраться с выделением памяти под "чистым" DOS'ом. Необходимо увидеть, желательно, все 128 метров памяти. А он видит только порядка 640К. Говорят что можно использовать XMS расширитель, но я с ним не работал и не знаю как им пользоваться.
Если можно - то какие-нибудь доки (на русском, желательно) или примеры использования расширителей, или ссылки. Заранее благодарен. |
|||
|
||||
e-moe |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 88 Регистрация: 3.8.2004 Где: Украина, Донецк Репутация: нет Всего: 4 |
||||
|
||||
cOZA |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 16 Регистрация: 28.4.2006 Репутация: нет Всего: нет |
Спасибо - но я это знал и ранее. А вопрос у меня в том как писать программу в BC++3.1 так чтоб она ИСПОЛЬЗОВАЛА (по возможности всю) как можно больше памяти. И не говорила о том что structure too big.
Как это сделать? |
|||
|
||||
bsa |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9185 Регистрация: 6.4.2006 Где: Москва, Россия Репутация: 63 Всего: 196 |
Никак, имхо.
Для работы с непрерывными объемами памяти (для структур, например) более 64Кб необходимо работать в 32-х битном режиме. А чистый ДОС это делать не умеет. Для этого нужно использовать специальную надстройку (типа DOS-4GW, если не ошибаюсь). Но она должна поддерживаться компилятором. Как вариант, попробуй использовать другой компилятор (не от Borland), который позволяет делать ДОС-приложения для защищенного режима процессора. Это сообщение отредактировал(а) bsa - 5.5.2006, 09:01 |
|||
|
||||
cOZA |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 16 Регистрация: 28.4.2006 Репутация: нет Всего: нет |
Не совсем согласен. Хотя бы 32 метра но увидеть можно. Видел как у человека прога захватывала ~20 метров и общалась с ними как хотела.
Вот только с ним я уже не могу поговорить. Если кто знает - подскажите. Выход должен быть. |
|||
|
||||
Coala |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 70 Регистрация: 4.5.2006 Где: Москва Репутация: нет Всего: 0 |
В любом случае нужен драйвер памяти защищенного режима. В своё время писал на Watcom C/C++ 10, в его комплект как раз и входит DOS4GW.EXE, о котором говорил bsa. И опять же (если память МОЯ не изменяет) - доступны будут только 32 метра.
ЗЫ - если кто ещё помнит досовские Дум и Хексен - они как раз были написаны на Ваткоме и работали в защищенном режиме. А сам драйвер был встроен в экзешник игры. Это сообщение отредактировал(а) Coala - 5.5.2006, 12:15 |
|||
|
||||
cOZA |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 16 Регистрация: 28.4.2006 Репутация: нет Всего: нет |
Подскажите как здесь поступить? Ругается в указанном месте:
#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 |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 70 Регистрация: 4.5.2006 Где: Москва Репутация: нет Всего: 0 |
||||
|
||||
cOZA |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 16 Регистрация: 28.4.2006 Репутация: нет Всего: нет |
Хм. Да он пишет что Expanded Memory in use: 0
а: Extended Memory in use: 2619568 И помоему все приложение должно строиться так: оно проверяет загружен ли экстендер, затем запрашивает у него блок, и в случае удачи -> копирует его в расширенную память. Так? То есть нужно посылать в нужные регистры и извлекать из них... По крайней мере именно об этом и говорят те "методички" на кои дали ссылки в самом первом ответе. ЗЫ: Или я не туда иду? |
|||
|
||||
e-moe |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 88 Регистрация: 3.8.2004 Где: Украина, Донецк Репутация: нет Всего: 4 |
а я думаю что можно. насколько я помню с экстендерами идет свой линкер который все это лепит в одну программу. Хотя я могу ошибаться... А вообще может проще перейти в Unreal режим? Тогда можно без проблем в "реальном" режиме использовать до 4 Гб памяти... ну только нужно будет менеджер памяти написать на асме... |
|||
|
||||
bsa |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9185 Регистрация: 6.4.2006 Где: Москва, Россия Репутация: 63 Всего: 196 |
Действительно, а что мешает перейти на Linux (*BSD и т.п.) или Windows? Там таких проблем нет. Только драйвер уровня ядра надо написать. Но, имхо, это не так сложно.
|
|||
|
||||
cOZA |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 16 Регистрация: 28.4.2006 Репутация: нет Всего: нет |
Мешает - сама постановка задачи. ДОС система реал-таймовая, а именно это и нужно в данной задаче.
ЗЫ: Да и самому интересно решить проблему. |
|||
|
||||
Exekutor |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 440 Регистрация: 1.11.2005 Где: Казахстан. Костан ай Репутация: 1 Всего: 4 |
Адресовать более 64кб можно если использовать несколько сигментов кода. Но это чистый ассемблер.
-------------------- [color=blue][size=2]En taro addun, ma sol larinas[/size][/color] |
|||
|
||||
cOZA |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 16 Регистрация: 28.4.2006 Репутация: нет Всего: нет |
Не согласен. Как выяснилось есть множество библиотек позволяющие производить данные манипуляции с памятью.
Кстати подскажите как подключить HIMEM.sys (обеспечивает XMS спецификацию) к WinXP -> ломает ходить на "ДОС-машину", хочется удобства. ![]() |
|||
|
||||
![]() ![]() ![]() |
Правила форума "С++:Общие вопросы" | |
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |