DPMI экстендеров много Если совсем просто - делаешь таблицу GDT. Создаешь сегмент данных R/W по максимуму. И твоя программа тупо записывает какое-либо значение в ячейки, потом считывает и сравнивает (надежнее писать разные значения- есть малая вероятность совпадения со сбойным). Если отличается - ячейка сбойная. И так всю память. Когда пространство закончится, возникнет исключение, здесь, если будет обработчик, можно определить сколько памяти стоит. Если писать обработчик нет желания, тогда можно перед тестом подсмотреть в БИОС. Лучше всего, конечно объем памяти узнать у чипсета, но этот метод не универсален, если у тебя конечно нет спецификаций под все северники. Написал первое что пришло в голову, а вообще в форуме уже были темы.
вообще то поиск по форуму рулит. А вот загрузиться в проверочку под дос екстендером это глупость, ибо можешь повредить системные таблицы и свой код, хотя, если расположить всё это в первом метре озу а проверять всё остальное, то можно. А лучше переключиться в нереальный режим и там уже сканить
Ок. Допустим, память будет проверяться начиная со второго мегабайта. Тогда надо создать дескриптор сегмента данных с базой 100000h, установить для него лимит 4Gb, и последовательно проверять ячейки памяти. Так что ли? Тогда у меня возникли следующие вопросы. 1) как написать обработчик исключения, которое возникнет, когда физическая память закончится? 2) можно ли через функцию DPMI 500h получить количество физических страниц, умножить это число на размер страницы и установить как лимит для сегмента данных?
Я сомневаюсь что возникнет исключение. Скорее всего будешь читать FF. Размер памяти вроде-бы где-то в BIOS есть... Вот к примеру:
Возникнет. При условии что чипсет ровненько на конец ОЗУ ничего не смаппировал. А в RM действительно будет писаться в пустоту и читаться FF. Но надо признать я не подумал с высказыванием. Потому что, как раз если первые байты после конца ОЗУ будут мап какого нибудь чипсета, то результат не заставит себя ждать Лучше действительно, перед входом в PM спросить БИОС о размере памяти и быть уверенным.
Зачем писать если не знаешь? Исключения никакого не будет. Всё будет отлично читаться/писаться. Исключение возникает только при выходе за границы сегмента или при обращении к странице памяти помеченной в таблице страниц как неприсутствующая. С физической памятью это никак не связано. Сделай сегмент 4Гб и читай/пиши куда хочешь. Просто при отсутствующей памяти в ячейке всегда будет FFh
Ole Вопервых никто не горонтирует, что сама память смепированна ровна. По этому советую определять доступную память, через биос смотри атач.
Исключения никакого не будет. Всё. Выспаться мне пора. Уже хотел аттач приложить, как случайно заметил что размер сегмента данных стоял FFFFFFF0, а писал намеряно в последнюю ячейку. И получилось естественно Исключение возникает только при выходе за границы сегмента Эх...
да можно конечное пишешь драйвер который все останавливает в том числе все интеррупты дизаблит сохраняет системные таблицы готовит свою - плоскую такую типа прямое отображение запускает тесты потом все восстанавливает только в реал, вернее унреал моде все это в 100 раз проще