Как перевести адрес виртуальной памяти в физический адрес?

19
задан Jonathan Leffler 4 April 2015 в 17:59
поделиться

5 ответов

1) Никакой

2) Да, необходимо записать драйвер. Лучше всего был бы или виртуальный драйвер или изменил бы драйвер для специального внешнего устройства.

3) Это становится очень сбивающим с толку здесь. MmGetPhysicalAddress должен быть метод, который Вы ищете, но я действительно не знаю, как физический адрес отображается на банке/микросхеме/и т.д. на физической памяти.

4) Вы не можете использовать страничную память, потому что это перемещено. Можно заблокировать страничную память с MmProbeAndLockPages на MDL, в котором можно основываться на памяти, переданной от контекста вызова непривилегированного режима. Но лучше выделить нестраничную память и руку это к Вашему приложению непривилегированного режима.

PVOID p = ExAllocatePoolWithTag( NonPagedPool, POOL_TAG );
PHYSICAL_ADDRESS realAddr = MmGetPhysicalAddress( p );

// use realAddr
5
ответ дан 30 November 2019 в 04:25
поделиться

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

, Но если обработка вызовов является драйвером, и я использую свое приложение для вызова драйвера для той функции, я изменяю контексты, и я больше не нахожусь в контексте приложения, когда mmGetPhysicalAddress стандартную программу называют

, Драйверы не имеют контекста как приложения непривилегированного режима, делают; если Вы звоните в драйвер через IOCTL или что-то, Вы обычно (но не гарантируемый!), чтобы быть в контексте потока вызывающего абонента. Но действительно, это не имеет значения, какой Вы просите, потому что память привилегированного режима (что-либо выше 0x80000000) является тем же отображением, неважно, где Вы, и Вы закончили бы тем, что выделили память в стороне ядра. Но снова, пишут надлежащий драйвер . Используйте WDF ( http://www.microsoft.com/whdc/driver/wdf/default.mspx ), и он сделает запись корректного драйвера намного легче (хотя все еще довольно хитрый, запись драйвера Windows не легка)

РЕДАКТИРОВАНИЕ: Просто мысль, я вывел бы несколько книжных ссылок для выручения Вас, Вы должны определенно (даже если Вы не преследуете запись драйвера), Windows Internals чтения Russinovich и Solomon ( http://www.amazon.com/Microsoft-Windows-Internals-4th-Server/dp/0735619174/ref=pd_bbs_sr_2?ie=UTF8&s=books&qid=1229284688&sr=8-2 ); Программирование Модели Драйвера Microsoft Windows хорошо также ( http://www.amazon.com/Programming-Microsoft-Windows-Driver-Second/dp/0735618038/ref=sr_1_1?ie=UTF8&s=books&qid=1229284726&sr=1-1 )

4
ответ дан 30 November 2019 в 04:25
поделиться

Ожидайте, существует больше. Для полномочия выполнения на Vista Вашего клиента 64 бита, которые Вы получаете, расходуют больше времени, и деньги для получения драйвера режима ядра оставили мою Microsoft,

-4
ответ дан 30 November 2019 в 04:25
поделиться

В моей программе C++ (в Windows), я выделяю блок памяти и могу удостовериться, что это остается заблокированным (неподкачанный и непрерывный) в физической памяти (т.е. использование VirtualAllocEx (), MapUserPhysicalPages () и т.д.).

нет, Вы не можете действительно удостовериться, что это остается заблокированным. Что, если Ваш процесс отказывает или выходит рано? Что, если пользователь уничтожает его? Та память будет снова использована для чего-то еще, и если Ваше устройство все еще делает DMA, который в конечном счете приведет к потере/повреждению данных или bugcheck (BSOD).

кроме того, MapUserPhysicalPages часть Windows AWE (Расширения Работы с окнами Адреса), который является для обработки больше чем 4 ГБ RAM на 32-разрядных версиях Windows Server. Я не думаю, что это было предназначено, чтобы использоваться, чтобы изрубить непривилегированный режим DMA.

1. Есть ли какой-либо способ, которым я могу перевести виртуальный адрес в физический в рамках моей программы в Непривилегированном режиме?

существуют драйверы, которые позволяют Вам сделать это, но Вы не можете программировать DMA от непривилегированного режима в Windows и все еще иметь устойчивую и защищенную систему. При разрешении процессу, который работает, поскольку ограниченная физическая память чтения-записи учетной записи пользователя позволяет тому процессу владеть системой. Если это для одноразовой системы или прототипа, это, вероятно, приемлемо, но если Вы ожидаете, что другие люди (особенно оплата клиентов) будут использовать Ваше программное обеспечение и Ваше устройство, необходимо записать драйвер.

2. В противном случае я могу узнать это виртуальное к физическому отображению только в ПРИВИЛЕГИРОВАННОМ РЕЖИМЕ. Я предполагаю, что это означает, что я должен записать драйвер, чтобы сделать это...?

, Который является рекомендуемым способом приблизиться к этой проблеме.

Вы знаете о каком-либо легко доступном драйвере/DLL/API, который я могу использовать, что мое приложение (программа) будет взаимодействовать через интерфейс со сделать перевод?

можно использовать MDL (Список Дескриптора Памяти) , чтобы заблокировать вниз произвольную память, включая буферы памяти, принадлежавшие процессу непривилегированного режима, и перевести его виртуальные адреса в физические адреса. У Вас может также быть Windows, временно создают MDL для буфера, переданного в вызов DeviceIoControl при помощи METHOD_IN_DIRECT или METHOD_OUT_DIRECT .

Примечание, что непрерывные страницы в виртуальном адресном пространстве почти никогда не непрерывны в физическом адресном пространстве. Надо надеяться, Ваше устройство разработано для обработки этого.

3. В случае, если я должен буду записать драйвер сам, как я делаю этот перевод? какие функции я использую? Это - mmGetPhysicalAddress ()? Как я использую его?

существует намного больше к записи драйвера, чем просто вызов нескольких API. Если бы Вы собираетесь записать драйвер, я рекомендовал бы читать столько соответствующего материала, сколько Вы можете от MSDN и OSR. Кроме того, посмотрите на примеры в Windows Driver Kit .

4. Кроме того, если я понимаю правильно, mmGetPhysicalAddress () возвращает физический адрес виртуального базового адреса, который находится в контексте обработки вызовов. Но если обработка вызовов является драйвером, и я использую свое приложение для вызова драйвера для той функции, я изменяю контексты, и я больше не нахожусь в контексте приложения, когда mmGetPhysicalAddress стандартную программу называют... поэтому, как я перевожу виртуальный адрес в приложении (непривилегированный режим) пространство памяти, не драйвер?

Драйверы не являются процессами. Драйвер может работать в контексте любого процесса, а также различных поднятых контекстах (обработчики прерываний и DPCs).

11
ответ дан 30 November 2019 в 04:25
поделиться

У вас есть практически непрерывный буфер в вашем приложении. Этот диапазон виртуальной памяти, как вы отметили, доступно только в контексте вашего приложения, и некоторые из них могут быть выгружены в любое время. Итак, чтобы получить доступ к памяти с устройства (то есть выполнить DMA), вам необходимо заблокировать его и получить описание, которое можно передать устройству.

Вы можете получить описание буфер, называемый MDL или списком дескрипторов памяти, путем отправки IOCTL (через функцию DeviceControl) вашему драйверу с помощью METHOD_IN_DIRECT или METHOD_OUT_DIRECT. На следующей странице обсуждается определение IOCTL.

http://msdn.microsoft.com/en-us/library/ms795909.aspx

Теперь, когда у вас есть описание буфера в драйвере для вашего устройства, вы можете заблокировать его, чтобы буфер оставался в памяти в течение всего периода, пока ваше устройство может с ним работать. Найдите MmProbeAndLockPages в MSDN.

Ваше устройство может быть или не иметь возможность читать или записывать всю память в буфере. Устройство может поддерживать только 32-битный DMA, а на машине может быть более 4 ГБ ОЗУ. Или вы можете иметь дело с машиной, на которой есть IOMMU, GART или какая-либо другая технология преобразования адресов. Для этого используйте различные API-интерфейсы DMA, чтобы получить набор логических адресов, которые подходят для использования вашим устройством. Во многих случаях эти логические адреса будут эквивалентны физическим адресам, о которых изначально задан ваш вопрос, но не всегда.

Какой DMA API вы используете, зависит от того, может ли ваше устройство обрабатывать списки разброса / сбора и тому подобное. Ваш драйвер в своем установочном коде вызовет IoGetDmaAdapter и будет использовать некоторые из возвращаемых им функций.

Как правило, вас будут интересовать GetScatterGatherList и PutScatterGatherList. Вы предоставляете функцию (ExecutionRoutine), которая фактически программирует ваше оборудование для выполнения передачи.

Здесь задействовано множество деталей. Удачи.

5
ответ дан 30 November 2019 в 04:25
поделиться
Другие вопросы по тегам:

Похожие вопросы: