![]() |
|
Модераторы: feodorv, GremlinProg, xvr, Fixin |
![]()
|
|
| Amid |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 3 Регистрация: 5.11.2004 Репутация: нет Всего: нет |
Как узнать полный размер установленной памяти?
Установлено 256 MB. Пока удается получить (через int31h AX = 0500h в ES:EDI адрес 48 байтного буфера) только следующее: MaxBlok = 65540096 - максимально доступный блок в байтах PageNotFix = 16001 PageFix = 16001 LineAdderInPage = 524288 AllPageNotFix = -1 AllPageFree = 16041 - 16041 * 4096(размер страницы) = 65703936 AllPagePhys = -1 AvailMem = 1627303936 - ???? SizeSWPFile = 0 Программа работает под DOS. Загрузчик 32RTM. А где остальные 192 метра? |
|||
|
||||
| Атос |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 22 Регистрация: 11.9.2004 Где: Екатеринбург Репутация: нет Всего: нет |
ИМХО ты запускал это дело под VM из-под винды - тогда конечно он тебе не скажет скока физической памяти есть () - будет пихать максимум что можно....
или если ты это через структуры - убедись, что структура не выровнена.... а то похоже на то... если AvailMem равен 0xFFFFFFFF (что соответствует заполнению 0xFF по смещениям +24h:0Ch) |
|||
|
||||
| Amid |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 3 Регистрация: 5.11.2004 Репутация: нет Всего: нет |
Атос
Спасибо за подсказку. Вообще выравнивание установлено по байту (проверил). Может подскажеш где найти описание DPMI32 лучше всего полное. Мне попадпались только отрывки и все не по теме. Я выделяю память через int 31h в AX 504h. код следующий: #define CallDPMI() _asm { mov ebx, ebx; push eax ; int 31h ; jnc $+8 ; push eax ; DB 0E8h ; DD (Offset DPMIError)-$-4 ; add esp, 4 } struct DPMIAllocMem { unsigned long Handle; void *Ptr; }; void * AllocLinearMem(unsigned long At, unsigned long Length, int Committed, unsigned long * XMSHandle) { BCFlatOp unsigned Temp; BCFlatOp unsigned Ofs; _asm { mov ax, 0504h mov ebx, At mov ecx, Length mov edx, Committed } CallDPMI(); _asm mov [Temp], esi _asm mov [Ofs], ebx *XMSHandle = Temp; return (void *) Ofs; } unsigned long GetDPMIMemory(struct DPMIAllocMem &stAlloc, unsigned long MemSize) { unsigned long Ofs, DSStart; BCFlatOp unsigned long DSLength; double Pages; Pages = (double)MemSize/(double)PAGESIZE; Pages = ceil(Pages); Ofs = (unsigned long)AllocLinearMem(0, MemSize , true, &stAlloc.Handle); DSStart = GetSegmentBase(_DS); DSLength = Ofs + MemSize - DSStart; SetSegmentLimit(_DS, DSLength); stAlloc.Ptr = (void *)(Ofs - DSStart); return MemSize; } Выделяет не больше чем MaxBlok, иначе ошибка. Не ужели все так сложно |
|||
|
||||
![]()
|
| Правила форума "C/C++: Системное программирование и WinAPI" | |
|
|
На данный раздел распространяются Правила форума и Правила раздела С++:Общие вопросы . Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Chipset, Step, Fixin, GremlinProg, xvr. feodorv. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Системное программирование и WinAPI | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |