У меня есть код (который я не могу изменить), который мне нужен, чтобы работать в среде Win32. Этот код вызывает mmap()
и munmap()
, поэтому я создал эти функции, используя CreateFileMapping()
, MapViewOfFile()
и т. Д., Чтобы выполнить то же самое. Первоначально это работает отлично, и код может получить доступ к файлам, как ожидалось. К сожалению, код переходит к munmap()
выбранным частям файла, который больше не нужен.Частичный unmap файла с отображением памяти Win32
x = mmap(0, size, PROT_READ, MAP_SHARED, fd, 0);
...
munmap(x, hdr_size);
munmap(x + foo, bar);
...
К сожалению, когда вы передаете указатель на середину преобразованного диапазона UnmapViewOfFile()
она разрушает все отображение. Хуже того, я не могу понять, как я смогу обнаружить, что это частичный запрос на карту, и просто игнорируйте его.
Я попытался позвонить по номеру VirtualFree()
, но, неудивительно, это производит ERROR_INVALID_PARAMETER.
Я начинаю думать, что я должен буду использовать статический/глобальные переменные для отслеживания всех открытых отображений памяти, так что я могу обнаружить и игнорировать частичный unmappings, но я надеюсь, что у вас есть идея получше ...
Редактировать:
Поскольку я недостаточно четко указывал выше, документы для UnMapViewOfFile не точно отражают поведение этой функции.
Отсортировать весь вид и переназначить фрагменты не является хорошим решением, потому что вы можете только предложить базовый адрес для нового сопоставления, вы не можете его контролировать. Семантика munmap()
не позволяет изменить базовый адрес неподвижной части.
Что мне действительно нужно, это найти базовый адрес и размер уже нанесенной области памяти.
edit2: Теперь, когда я повторяю проблему таким образом, похоже, что функция VirtualQuery()
будет достаточной.
Ах, если только документация может считаться точным. Я надеялся, что частичные un-сопоставления просто потерпят неудачу, как это видно из того, что вы цитировали, но это не так. –
Я тоже удивлен. Просто никогда не пробовал это раньше. –
Выполнение бесплатного() на указателе в середине выделенного блока не просто терпит неудачу :-) – 2010-09-29 14:58:31