Здравствуйте, jek_, Вы писали:
_>Собственно, сабж.
_>Есть некий виртуальный адрес в конкретный момент исполнения приложения. Хочется узнать, на какой физический адрес он отображается в этот момент.
_>Есть ли способ узнать это? Если да, то как?
В третьем кольце никак. Более того, если бы ты и мог узнать это, то пока узнавал бы — этот адрес мог бы поменяться (отправили страницу в своп и вернули в ОП, но в другое место).
В нулевом кольце — не проблема. Местоположение каталога страниц задается регистром CR3, дальше вручную проводишь трансляцию виртуального адреса (делишь по схеме 10-10-12, берешь значения из каталога и таблицы страниц) и получаешь искомое, если бит присутствия не равен 0.
А зачем это вдруг понадобилось ? Вся идея виртуальной памяти основана на том, что она абсолютно прозрачна, ты не можешь это знать, не должен знать и не должен хотеть знать.
With best regards
Pavel Dvorkin
Re[2]: Как в процессе узнать физический адрес по виртуальном
Здравствуйте, Pavel Dvorkin, Вы писали:
PD>В третьем кольце никак. Более того, если бы ты и мог узнать это, то пока узнавал бы — этот адрес мог бы поменяться (отправили страницу в своп и вернули в ОП, но в другое место).
Дык я понимаю, что может перемапироваться или усвопиться. Но всё же хочется узнать, хотя бы при таких условиях.
PD>В нулевом кольце — не проблема. Местоположение каталога страниц задается регистром CR3, дальше вручную проводишь трансляцию виртуального адреса (делишь по схеме 10-10-12, берешь значения из каталога и таблицы страниц) и получаешь искомое, если бит присутствия не равен 0.
Угу. Но неужели таки нету API какой-нибудь Ki..... функции? Может быть, всё-таки есть?
PD>А зачем это вдруг понадобилось ? Вся идея виртуальной памяти основана на том, что она абсолютно прозрачна, ты не можешь это знать, не должен знать и не должен хотеть знать.
Так и знал, что этот вопрос задаст кто-нибудь Дело в том, что на одной из систем периодически валится большой тест. Изредка портится элемент массива — всегда однообразно портится — но всегда разный элемент. Отследить, кто гадит в память, не представляется возможным. Никак. На других системах не проявляется. Всё это наводит на мысль, что на данной системе битая память/шина, хотя все третьесторонние тесты на память система проходит...
Дык вот и хочется понять, есть ли какая-то корреляция между физическими адресами битого элемента массива после N падений теста.
Re[3]: Как в процессе узнать физический адрес по виртуальном
Здравствуйте, jek_, Вы писали:
_>Угу. Но неужели таки нету API какой-нибудь Ki..... функции? Может быть, всё-таки есть?
Нет. Просто потому, что не должно быть. Представь себе, что есть. Это бы означало, что ты можешь вмешиваться в механизм вирт. памяти, а это не положено в 3 кольце.
PD>>А зачем это вдруг понадобилось ? Вся идея виртуальной памяти основана на том, что она абсолютно прозрачна, ты не можешь это знать, не должен знать и не должен хотеть знать.
_>Так и знал, что этот вопрос задаст кто-нибудь
Естественно
>Дело в том, что на одной из систем периодически валится большой тест. Изредка портится элемент массива — всегда однообразно портится — но всегда разный элемент. Отследить, кто гадит в память, не представляется возможным. Никак. На других системах не проявляется. Всё это наводит на мысль, что на данной системе битая память/шина, хотя все третьесторонние тесты на память система проходит...
Так, стоп. Что такое система ? Конкретная машина ? На другой машине с примерно тем же ПО не валится ? Если есть предположение, что там аппаратные проблемы, то надо не Windows внутри изучать, а взять тест памяти, работающий в DOS (memtest,
goldmem) и пустить на сутки. У меня goldmem прекрасно ошибки памяти на новокупленной машине отловил.
With best regards
Pavel Dvorkin
Re[4]: Как в процессе узнать физический адрес по виртуальном
Здравствуйте, Pavel Dvorkin, Вы писали:
PD>Нет. Просто потому, что не должно быть. Представь себе, что есть. Это бы означало, что ты можешь вмешиваться в механизм вирт. памяти, а это не положено в 3 кольце.
Дык надо-то всего лишь read access. Linux, к примеру, позволяет... хотя там и утилитный драйвер написать — десять минут работы. А под виндами я не умею
PD>Так, стоп. Что такое система ? Конкретная машина ?
Угу.
PD>На другой машине с примерно тем же ПО не валится ?
Угу.
PD>Если есть предположение, что там аппаратные проблемы, то надо не Windows внутри изучать, а взять тест памяти, работающий в DOS (memtest, PD>goldmem) и пустить на сутки. У меня goldmem прекрасно ошибки памяти на новокупленной машине отловил.
Угу, пробовали. Один хрен — DOS тесты проходят, моя приблуда падает.
Поменяли память — падёж исчез. Вот так вот.
Re[5]: Как в процессе узнать физический адрес по виртуальном
Здравствуйте, jek_, Вы писали:
_>Дык надо-то всего лишь read access.
Понятно, что надо. Непонятно, какой в этом может быть практический смысл. Память тестируется другими средствами, а зачем бы разработчикам API делать какую-то возможность просто так, для красоты?
_>Поменяли память — падёж исчез. Вот так вот.
Тайминги памяти по SPD в точности те же? Ибо это мог быть очень хитрый глюк синхронизации, например.