Коллеги, облагодетельствуйте советом. Есть комп с 4 гигабайтами памяти. Есть своя программа на С. Хочется отдать ей максимум памяти. Под Windows XP больше трех гиг не получается. ( В boot.ini ключи /3GB /Userva=2900 и ключ /largeaddressaware ) Под FreeBSD тоже больше 3G не получается. ( Если ставить hw.physmemsiz="4G" фря уходит в перезагрузку ) DR-DOS 7 больше 8М под задачку не отдает. Посоветуйте какой-нибудь дос-экстендер способный почти все 4G использовать.
Врубай протекдед моде сам ) Будешь сам управлять защищенном режимом как тебе захочется, делай плоскую модель и адресуй все гигы адресного пространства )) Есть такая штука, как PAE (Physical Address Extensions), позволяющая адресовать 64 гига через проекции
Была такая мысль, но тогда придется, как минимум, делать свой файловый и консольный интерфейс (программе моей они нужны). Уж больно не хочется тратить время на изобретение велосипеда. Проще подобрать подходящую ОС и/или экстендер. А компилировать, скорее всего, Watcom-ом. Увы, при четырех гигах физ памяти, от PAE толку никакого. Беда в том, что старший гигабайт винды под себя занимают.
Great 64Гб виртуальной памяти. Gray В обычной системе такого не получится, системе тоже нужна память для себя. Так что только реализовывать своё, с нуля или по исходникам.
IceStudent Разумеется. Потому тема и называется "4G - 1M под задачу". Под ОС я готов целый мегабайт оставить. А вот остальное хочется самому использовать.
Gray А тебе непременно хочется все 4Г сразу иметь ? Ведь можно и с проецируемыми окнами работать через FileMapping или AWE
Gray Опять-таки, для обычной системы 1Мб - слишком мало. Скорее всего, не в ту сторону идёшь. Меняй алгоритмы/дизайн. А если 4Гб мало станет, что потом станешь делать? Можно, конечно, переписать под x64, там 16 Гб ОЗУ есть (под ХР, 64Гб под 2k3).
IceStudent Для всей линейки MSDOS и родственных ей ОС одного мега - более чем достаточно. MSDOS 3.11 вообще прекрасно жил на 512К. Меня вполне устроило бы сочетание MSDOS и какого-нибудь дос экстендера. Пока больше 2 гигов получить под задачу, увы, не удалось.
Включите в DOS линейную адресацию (так наз. Нереальный режим) для FS и/или GS. и память вся будет, и функции DOS/BIOS переписывать не надо.
Проблема решена, но, увы, решение принесло меньше радости, чем ожидалось. Прежде всего следует сказать, что для большинства мам получить под задачу 3100-3300 МВ нереально. Дело в том, что 700-900 М старших адресов заняты железом (PCI, Video и т.д.). Ужасно много! Только некоторые новые мамы умеют делать Memory Re-maping (В меню BIOS это часто называется Memory Relocating). Таким образом, если при загрузке BIOS выдал 3190 МB, то хотя у вас стоит 4 GB, более 3190 MB отдать под задачу не удастся. Увы, у меня именно такая мама. Решение же таково. Грузим чистый MSDOS (без himem.sys или emm386) и запускаем задачу (откомпилированную Visual C++ 6.0 как Win32 Console Application) используя HX DOS extender (http://www.japheth.de). Этот замечательный экстендер умеет виндовые PE executable файлы запускать под досом. Только сначала надо HDPMI32 чуть-чуть подправить. В файле PAGEMGR.asm закомментировать кусочек и добавить явное указание имеющегося размера памяти: ; cmp ax, 3C00h+1 ;max is 3C00h (15360 kB) ; jnc e801_err ; movzx eax, ax ; shr ax, 2 ;kb -> pages ; movzx ebx, bx ; shl ebx, 4 ;64kb -> pages ; add eax, ebx ; page=4096 bytes =4K ; BIOS detected 3190M memory ; 0C7600h=3190*1024/4 mov eax,0C7600h P.S. Можно работать и с загруженым himem.sys, но тогда программа будет работать на 5-10% медленнее.
Gray На самом деле там должно быть 512Мбайт или 1024МБ. Можно попробовать поджать, до 128МБайт. Основной объем сжирает видео память. Если к компьютеру не подключено ни каких устройств со встроенной памятью. Кроме видео карты. То по идее под PCI устройства должно хватить удвоенного размера видео памяти. И все выровнять на границе 128МБ. Так что можно поджать. А в конфигурационном пространстве PCI северного моста выставить Top of Low Usable DRAM (TOLUD) - граница которая отвечает за размер используемой памяти все что выше отводиться под устройства. Если видео карта содержит много видео памяти, можно отключить и ее. В конфигурационном пространстве PCI видео карты BAR регистр установить в 0. LFB точно(0,9) работать не должен. А вот B0000-AFFFF не знаю.
Gray Тут вот какая штука получается: физическая памятть в компьютере неразрывна, т.е. с 0 по максимум нет пробелов. Так вот PCI и AGP карты в основном 32 разрядные (я имею в виду выбор адреса на шине), т.о. если установить 4 G в материнку специально для этого не предназначенную, то солидный кусок памяти пропадет (это не свсем так посколку можно менять базовый адрес памяти в VGA карте, а потом восстанавливать его, т.о. получится использовать оставшуюся часть паимяти, но ни одна операционка этого пока не делает). А в спец плате имееттся возможность сделать в физической памяти дыру. Второй момент: архитектура х86 позволяет задать логический адрес в 32 бита, а вот физический до 36 и даже 64 бит. Потому либо переходи на Itanium или Opertron, либо "подгружай" память частями в свое пространство.
.PROFi У меня нет матери с 4ГБ основной памяти. Так что не могу сказать БИОС отводит под PCI устройство 1ГБ или все-таки поджимает. Тут не все так просто, память устройств должны быть выровнена. выравнивание зависит от размера памяти. Если ты выставишь адрес не правильно аппаратура под корректирует. В самом верху лежит БИОС. Так что тут получается серьезная дырка. Между БИОСом с APIС и видео памятью. Если какой либы диапазон будет перекрыт это черева-то ошибками. Так что видео память находиться вверху на своем месте. Возможно если ее перенести ниже TOLUD все будет хорошо, а может и нет. Запись 0, должен по идее отключить вообще видео память, но опять таки это не гарантировано, но я у верен в этом 90% процентов. Так насчет спец плат. Я знаю о двух категориях мат плат. Те которые не поддерживают 4ГБ. Те которые поддерживают 4ГБ, но часть памятью откушивается под PCI и др устройства. А вот про то что есть матери которые позволяют делать дырки в физической памяти не слышал. Можно пример чипсета желательно интеловского? Насчет архитектуры x86 позволяет иметь 36 битное физическое адресатное пространство. Используя механизм PAE отображает физическую память. Но есть огромное но. Это все заложено в процессор. А ниже идет северный мост у которого физически 32 линии адреса. Так что разделить основную память и память других устройств не возможно. Есть матери у которых есть 64 адрестных линии, но они должны поддерживать возможность сделать дырку в физической памяти.
Pavia Так что разделить основную память и память других устройств не возможно. Еще и как возможно. Чипсетом где-то с pentium 1 подерживается мепирование BIOSа с адреса 0FFFE0000 на адрес 0E0000, причем это делается аппаратно. Что касается плат которые позволяют делать дырки в физической памяти, то они выпускались для Pentium Pro и Xeon, а для рядовых компьютеров такого нет.
PROFi Ты меня не понял. Я говорил что подвинуть видео память некуда. А также что у нас одно адрестное пространство которое делется между основной памятью и устройства. А так как объем основной памяти равен размеру адресного пространства. То разделить устройства и память нельзя, просто адрестного пространства нехватает. Можно только заблокировать одни участки в основной памяти и поместить туда память устройств к примеру BIOS по адрессу 0E0000. Но это специальное исключение для БИОСа и видео памяти. И плюс есть еще верхняя граница, которая на разных материнках программируется по разному.
Pavia Увы, в реальности железо сжирает больше памяти. Вот несколько ссылок на эту тему: http://asus.ru/ftp/forum/MapOfMemory.gif http://www.polywell.com/us/support/faq/4GB_Rev1.pdf http://forum.asus.ru/viewtopic.php?t=3335 Идея, безусловно, хороша. Попробую разобраться в программировании моста. PROFi и Pavia На материнках с чипсетами Intel 975X, Intel P965 и Intel 955X можно подвинуть адреса железа в старшую часть 8 ГБ пространства. См: http://support.microsoft.com/kb/929605
PageFault А толку то? Во-первых: В этом случае сама операционка сожрет столько памяти под себя, что задачам больше трех гиг памяти не останется. Во-вторых: Ни Win64 ни Vista выделяют под одну задачу не более 2GB оперативной памяти. Или я не прав?