Файл сопоставления памяти Win32 с представлениями в соседних местах - PullRequest
0 голосов
/ 12 сентября 2018

У меня есть файл с несколькими блоками. Я хотел бы отобразить файл так, чтобы блоки, не являющиеся смежными, были смежными в памяти.

Пример:

Предположим, размер куска равен 1 кБ.

  • Блок 1: смещение 0 в файле, сопоставленное с местоположением X
  • Блок 2: смещение 1 кБ в файле, сопоставленное с местоположением X + 2 кБ
  • Блок 3: смещение 2 кБ в файле, сопоставленное с местоположением X + 1 кБ

Я знаю, что могу дать предложения MapViewOfFileEx о месте размещения вида.

Я попытался выделить адресное пространство, используя VirtualAlloc, а затем передать его в качестве базового адреса (X), но это выдает ошибку 487 - «Попытка получить доступ к неверному адресу».

Как бы я гарантировал, что в адресном пространстве достаточно большой регион, чтобы я знал, что это будет работать?


Как уже указывалось, представления должны отображаться с кратностью детализации выделения памяти, поэтому блоки размером 1 КБ не будут работать должным образом. Можно ли заставить пример работать, если размер порции такой же, как и степень детализации выделения памяти?

1 Ответ

0 голосов
/ 12 сентября 2018

Вы не можете. Эта идея не сработает. Есть две проблемы. Во-первых, адрес, который вы передаете MapViewOfFileEx, является запросом. Система не обязана сопоставлять ваш файл там и не будет работать, если адрес не свободен. Во-вторых, адрес, который вы передаете, должен быть кратен гранулярности распределения системы. (Используйте функцию GetSystemInfo для получения этого значения.) Вы просто не можете выделить диапазоны виртуальной памяти, которые находятся на расстоянии всего 1 КиБ, в любой архитектуре, о которой я знаю.

Редактировать

Если ваше сердце настроено на это, то я думаю, что единственный (безопасный) способ сделать это - это слой косвенности. Создайте новый класс, в котором хранится vector указателей на базовый адрес каждой отображаемой области. Класс operator[] определит правильный блок на основе индекса и вычислит адрес нужного элемента в нем. (В основном, как работает std::deque.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...