2016-08-16 6 views
2

Я вижу, что для разделов в файлах изображений поле VirtualSize представляет собой общий размер раздела при загрузке в память, а поле SizeOfRawData - это размер инициализированных данных раздела на диске.PE: отношение между полями SizeOfRawData и VirtualSize заголовка раздела

При рассмотрении участка .idata поле VirtualSize было установлено равным 0x14, а поле SizeOfRawData - 0x400.

Зачем нужен компоновщик - в этом случае MinGW ld - сделать раздел файла таким большим, в то время как раздел, загруженный в память, является лишь его фракцией?

Кроме того, что является целью поля VirtualSize? Почему бы не всегда загружать весь раздел, т. Е. Загружать байты SizeOfRawData?

Я не вижу описания или их отношения в официальной документации PE.

ответ

3

SizeOfRawData (размер необработанных участков данных в файле изображения) всегда кратно IMAGE_OPTIONAL_HEADER.FileAlignment

FileAlignment

Выравнивание исходных данных секций в файле изображения, в байтах. Значение должно быть в силе 2 от 512 до 64K (включительно). Значение по умолчанию равно 512. Если элемент SectionAlignment меньше, чем размер страницы , этот элемент должен быть таким же, как SectionAlignment.

цель поля VirtualSize, сколько памяти нужно выделить и скопировать в разделе. без этого поля, как загрузчик может это знать?

VirtualSize может быть больше или меньше, чем SizeOfRawData.

мы, например, можем иметь только несколько байт инициализированных фактических данных в разделе и не неинициализированного данные - так VirtualSize будет только несколько размеров байт, в то время как SizeOfRawData 512 байт

в другом случае в .data или .bss секция - не может быть инициализированы данные на всех (так SizeOfRawData == 0), но VirtualSize = 0.

так загрузчик выделить!байтов для раздела и копии min(VirtualSize, SizeOfRawData) байт к нему из файла

+0

Большое спасибо. Не всегда .data всегда содержит только инициализированные данные? Кроме того, где вы получаете "(VirtualSize + PAGE_SIZE - 1) & ~ (PAGE_SIZE-1)" от? Если это возможно, не могли бы вы указать мне на свой источник? Я хотел бы узнать больше на эту тему :-) – Shuzheng

+0

@NicolasLykkeIversen размер раздела должен быть выровнен по размеру раздела (обычно это PAGE_SIZE (по умолчанию) - можно посмотреть здесь - MiCreateImageFileMap - http: //gate.upm. ро/OS/LAB,/Windows_OS_Internals_Curriculum_Resource_Kit-АКАДЕМИЧЕСКИЙ/WindowsResearchKernel-WRK/WRK-v1.2/основание/НТО/мм/creasect.c - MI_ROUND_TO_SIZE (LENGTH, ALIGNMENT) макрос – RbMm

+0

Что делать, если раздел содержит как неинициализированные, так и инициализированные данные? Затем загрузчик копирует слишком много, потому что SizeOfRawData - 512? – Shuzheng

 Смежные вопросы

  • Нет связанных вопросов^_^