Анимация
JavaScript


Главная  Библионтека 

0 1 2 3 4 5 6 7 8 [ 9 ] 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140

77 07 01 00: начальный адрес второго непрерывного регион виртуальной памяти 89 07 01 00: конечный адрес второго непрерывного региона виртуальной памяти DC 5D 00 00: смещение, по которому хранится второй регион виртуальной памяти в этом файле

По смещению 0x003998 (помним об обратном порядке байтов) в файле "tutor.id1" находится следующее содержимое:

00003998 0000398 000039B8 000039C8 000039D8

68 21 00 00

4F 01 00 00

64 01 00 00

52 01 00 00

0D 01 00 00

45 01 00 00 0C 01 00 00 61 01 00 00 4F 01 00 00 FF 01 00 00

4C 01 00 00 00 01 00 00 00 01 00 00 21 01 00 00 00 00 00 00

4C 01 00 00 H! eS l© l©

69 01 00 00 o© ,© © I©

70 01 00 00 D© A© © P© 20 01 00 00 r© o© !© ©

00 00 00 00 ©

Это и есть флаги виртуальной памяти, содержащие, ячейки и атрибуты виртуальной памяти, читая которые через каждый четвертый байт, можно разобрать "Hello, IDA Pro!"

Архитектура страничной памяти

Размещение виртуальной памяти в дисковом файле требует некоторого количества оперативной памяти компьютера под кэш-буфера, поскольку побайтовый обмен с диском крайне непроизводителен.

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

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

Если окно целиком заполнено, но требуется загрузить еще одну страницу, IDA просматривает буфер на предмет поиска не модифицированной страницы к которой дольше всего не было обращения. А отыскав такую, замещает ее прочитанной с диска. В противном случае (если все страницы со времени последней загрузки были модифицированы), IDA «сбрасывает» на диск самую старую страницу и только затем замещает ее новой.

Во избежание потерь информации при сбоях питания, зависаниях дизассемблера и т.д., предусмотрен автоматический «сброс» модифицированных страниц через определенные промежутки времени, длительность которых задается значением поля "AUTOSAVE" файла <idatui.cfg> и <idagui.cfg> - консольной и графической версий соответственно. По умолчанию буфера сохраняются после совершения пользователем ста любых действий или по истечении пяти минут, при этом в окне сообщений появится поясняющая надпись «Flushing buffers, please wait...ok»

Замечание: IDA не учитывает «популярность» страницы (т.е. частоту ее использования или количество обращений), а только время последнего обращения (чтения или записи).




??? #Художнику - перерисовать рисунок! Рисунок 14 Окно страничной памяти

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

Размеры и количество страниц задаются полями "VPAGES" и "VPAGESIZE" файла <ida.cfg> соответственно. Если VPAGES == 0, IDA пытается самостоятельно вычислить оптимальное значение, исходя из количества требующейся для анализа загруженного файла виртуальной памяти.

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

По умолчанию размер страницы (VPAGESSIZE) в зависимости от версии IDA равен либо 4096 либо 8192 байт, а, поскольку, количество страниц выражается 16-разрядным целым числом, доступное адресное пространство виртуальной памяти равно 64 и 128 мегабайт соответственно. Дальнейшее увеличение размера страниц расширяет границы доступного адресного пространства виртуальной памяти, но одновременно с этим ухудшает производительность за счет большей грануляции, поэтому, прибегать к нему рекомендуется в тех и только в тех случаях, когда требуется свыше 128 мегабайт виртуальной памяти.

Ввиду станичной адресации базы, IDA не позволяет «на лету» изменять размер страниц и при загрузке файлов *.idb величина размера страниц берется оттуда, а значения поля VPAGESIZE игнорируется. Поэтому, необходимо внимательно отнестись к выбору размера страницы - в дальнейшем изменить его не удастся! Существует возможность необратимо уничтожить результаты своей работы, выбрав слишком малый размер страниц - в этом случае адресного пространства виртуальной памяти может не хватить и попытка выделения очередного блока виртуальной памяти провалится, а сеанс работы с IDA аварийно завершится!



Поле VPAGES, задающие размер буфера окна в страницах, по умолчанию равно нулю, и его значение IDA самостоятельно вычисляет по следующему алгоритму (см. таблицу 2).

??? #Верстальщику CreateNewTable

Размер файла

Размер окна в страницах

Размер окна в байтах ,

0 КБ -- 255 КБ

(FILESIZE * 4) / VPAGESIZE

1 МБ

256 КБ - 1023 КБ

1048576 / VPAGESIZE

1 МБ

1024 КБ - 2559 КБ

FILESIZE / VPAGESIZE

1 - 2,5 МБ

2560 КБ - 10 МБ

4194304 / VPAGESIZE

4 МБ

> 10 МБ

(FILESIZE * 2) / (VPAGESIZE *5)

> 4 МБ

Таблица 2 Алгоритм автоматического выделения памяти

Важно понять - размер буфера окна не ограничивает количество доступной страничной памяти! Окно - всего лишь кэш-буфер, и IDA будет работать даже в том случае, если уменьшить его до размера одной страницы (правда, это чрезвычайно снизит производительность). Операционные системы Windows и OS/2 позволяют выделить под окно больше памяти, чем ее имеется в наличии, сбрасывая избыток на диск в файл подкачки. В результате количество обращений к диску удваивается и производительность дизассемблера резко падает. Рекомендуется выбирать размер окна таким образом, чтобы он полностью умещался в физической памяти компьютера. Значения, вычисляемые IDA по умолчанию, рассчитаны на компьютеры, обладающее 16 или менее мегабайтами оперативной памяти, при наличие же большего его количества (на конец 2000 года компьютер типичной конфигурации содержит 32-64 мегабайт оперативной памяти) можно значительно улучить производительности, увеличив размер буфера окна.

Помимо виртуальной памяти, содержащей образ загруженного фала, дизассемблеру требуется какое-то количество страничной памяти для хранения меток, имен функций, комментариев и т.д. В терминологии IDA такая память именуется DATEBASE MEMORY или Memory for b-tree - память базы данных двоичного дерева. Поле "DATEBASE MEMORY" конфигурационного файла <ida.cfg> позволяет изменять выделенное количество памяти под буфер базы данных. Объем памяти измеряется в байтах, но округляется до целого числа страниц, размер которых в текущих версиях IDA равен 8 килобайт (8.192 байт). Для нормальной работы дизассемблеру необходимо по крайней мере 5 страниц (40 килобайт), в противном случае IDA сообщит о нехватке памяти «bTree error: not enough memory» и аварийно завершит работу.

Если DATEBASE MEMORY = 0, IDA самостоятельно определяет оптимальный размер буфера по следующему алгоритму (см. таблицу 3):

Размер файла

Размер окна в страницах

Размер окна в байтах

0 - 256 КБ

256 КБ

256 КБ - 1 МБ

1 МБ

1 МБ - 2.5 МБ

128 - 320

1 МБ - 2.5 МБ

2.5 МБ - 5 МБ

4 МБ

> 5 МБ

FILESIZE / 20 / PAGESIZE

FILESIZE / 20

Таблица 3 Алгоритм автоматического определения размера окна

С целью увеличения производительности, IDA динамически создает список указателей на имена меток, для работы с которым так же требуется некоторое количество страничной памяти. Размер буфера в страницах задается значением поля NPAGES файла



0 1 2 3 4 5 6 7 8 [ 9 ] 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140