Тест физ. памяти под Виндами.

Тема в разделе "WASM.WIN32", создана пользователем Dva, 14 ноя 2005.

  1. Dva

    Dva New Member

    Публикаций:
    0
    Регистрация:
    14 ноя 2005
    Сообщения:
    5
    Всем привет!



    Партия поставила задачу. Протестить физическую память.

    Ну самый примитивный алгоритм записать

    по физ. адресу число и прочитать.



    Проблема однако в том что задача ставится под Виндами 2000(цитата "пищешь драйвер чего тут такого ?"), тесты в реал моде есть, я не знаю зачем им тесты под виндами, большое подозрение что это глупость.



    В связи с чем проблема а именно страничная адресация и тд и тд.



    Можно конечно, создать свою таблицу страниц

    отмапить линейные адреса = физические.

    (или вообще отключить на время тестов страничную адресацию)

    Затем сбросить часть физ. памяти на диск(опять же непонятно как) потестить кусок, загрузить обратно и тд



    Затем все восстановить(восст. регистры, загрузить в cr3 пред. таблицу страниц) включить стран. адресацию

    и завершить выполнение задачи теста.



    Как бы мне по объяснить начальству что это невозможнопод виндами (есть у меня такие мысли) ?



    С уважением Дмитрий.
     
  2. Narkoliga

    Narkoliga New Member

    Публикаций:
    0
    Регистрация:
    13 ноя 2005
    Сообщения:
    19
    Адрес:
    С конопляного поля :)
    Алгоритм должен быть примерно такой:

    1) С помощью MmMapIoSpace отобразить всю физическую память на участок виртуальной памяти.

    1) На многопроцессорной системе остановить все побочные процессоры (с помощью DPC)

    2) Запретить прерывания на текущем процессоре.

    3) Провести тесты также, как это делается в RealMode

    4) Разрешить прерывания

    5) Запустить остановленые процессоры

    6) Снять отображение памяти



    В общем, не так страшен черт как его малюют. Ручная работа с таблицами страниц не понадобиться.







    Возможно и легко реализуемо.
     
  3. Dva

    Dva New Member

    Публикаций:
    0
    Регистрация:
    14 ноя 2005
    Сообщения:
    5
    Спасибо за столь

    быстрый и полный ответ!
     
  4. Dva

    Dva New Member

    Публикаций:
    0
    Регистрация:
    14 ноя 2005
    Сообщения:
    5
    Да кстати вот еще какой момент вылез.



    Допустим я отобразил виртуальную(V_from - V_to) память на диапaзон (P_from - P_to) физической памяти с помощью MmMapIoSpace

    (routine maps the given physical address range to nonpaged system space).



    Итак работа тестовой функции следующая-

    она сбрасывает на диск(или копирует в другое место nonpaged system space) часть данных из делта V начиная с V_from, тестирует,затем восстанавливает данные обратно, и идет дальше до V_to.



    Но у нас есть проблема.



    Получается некоторые данные могут находится и по виртуальному адресу из выделенного диапазона(V_from - V_to) и в тоже время по другому виртуальному адресу(например данные некой структуры ядра) в случае если эти адреса транслируются на одну и ту же страницу с одним и тем же физическим адресом. (Адресное простр. одно)



    Что будет если этими данными будет текущий исполняемый код и я запишу туда тестовые данные и как этого избежать?



    Конечно я могу определить какие диапазоны адресов тестировать нельзя.



    Но в этом случае

    из тестов выпадет некий кусок диапазона адресов. Если с кодом тестовой функции еще более менее понятно(его можно перезаписать в другое место), то что делать с кодом и данными ядра которые прямо или косвенно будут учавствовать в процессе совсем непонятно.

    Скажем как протестировать память в том месте где лежат таблицы страниц ведь они учавствуют в трансляции адресов(перезаписать их в другое место и обновить cr3?) ...



    С уважением

    Дмитрий.
     
  5. Narkoliga

    Narkoliga New Member

    Публикаций:
    0
    Регистрация:
    13 ноя 2005
    Сообщения:
    19
    Адрес:
    С конопляного поля :)




    А вот это при том методе тестирования что я описал уже невозможно. Врядли под виндами возможно работать с диском в момент полной заморозки системы, которую необходимо произвести перед тестированием.





    Придется определять какие диапазоны памяти заняты кодом и данными и в тесте их не трогать. Но чтобы протестировать всю память можно после тестирования одного участка перенести код и данные в другое место и протестировать остаток.

    Единственно, тест придется построить без сброса памяти на диск, так как это в данном случае абсолютно невозможно.





    Все очень просто. Никакие вызовы ядра нельзя использовать в тесте. Во время теста во всей системе должен работать ТОЛЬКО твой код, собственно для этого заморозка системы и делается.
     
  6. Dva

    Dva New Member

    Публикаций:
    0
    Регистрация:
    14 ноя 2005
    Сообщения:
    5
    Ага ясно.

    С кодом ядра понятно, использовать их не будем поэтому спокойно копируем в буфер, часть данных, тестим, копируем обратно.



    А как потестировать кусок данных где лежат каталоги страниц ведь эти данные участвуют в страничной адресации? Правильно я понял - скопировать их в другое место и занести в регистр

    cr3 новый адрес, и после теста обратная операция?



    Спасибо за ответы :)
     
  7. Narkoliga

    Narkoliga New Member

    Публикаций:
    0
    Регистрация:
    13 ноя 2005
    Сообщения:
    19
    Адрес:
    С конопляного поля :)




    да
     
  8. Dva

    Dva New Member

    Публикаций:
    0
    Регистрация:
    14 ноя 2005
    Сообщения:
    5
    Ок все более менее прояснилось.

    Спасибо за помощь :)