2015-02-02 4 views
1

Я хочу сделать статистику доступа к байтам памяти в программах, запущенных на Linux (X86_64). Я использую perf инструмент для дампа файла, как это:Могу ли я получить информацию о доступе к памяти с помощью машинного кода X86_64?

    :  ffffffff81484700 <load2+0x484700>: 
    2.86 :  ffffffff8148473b:  41 8b 57 04    mov 0x4(%r15),%edx 
    5.71 :  ffffffff81484800:  65 8b 3c 25 1c b0 00 mov %gs:0xb01c,%edi 
    22.86 :  ffffffff814848a0:  42 8b b4 39 80 00 00 mov 0x80(%rcx,%r15,1),%esi 
    25.71 :  ffffffff814848d8:  42 8b b4 39 80 00 00 mov 0x80(%rcx,%r15,1),%esi 
    2.86 :  ffffffff81484947:  80 bb b0 00 00 00 00 cmpb $0x0,0xb0(%rbx) 
    2.86 :  ffffffff81484954:  83 bb 88 03 00 00 01 cmpl $0x1,0x388(%rbx) 
    5.71 :  ffffffff81484978:  80 79 40 00    cmpb $0x0,0x40(%rcx) 
    2.86 :  ffffffff8148497e:  48 8b 7c 24 08   mov 0x8(%rsp),%rdi 
    5.71 :  ffffffff8148499b:  8b 71 34    mov 0x34(%rcx),%esi 
    5.71 :  ffffffff814849a4:  0f af 34 24    imul (%rsp),%esi 

Мой текущий метод анализа файла и получить все инструкции доступа к памяти, такие как move, cmp и т.д. Затем вычислите каждые доступа байт каждой команды, такие как mov 0x4(%r15),%edx добавит 4 байт.

Я хочу знать, есть ли способ рассчитать через machine code, например, анализируя «41 8b 57 04», я также могу добавить 4 байт. Потому что я не знаком с X86_64 машинным кодом, может ли кто-нибудь дать какие-либо подсказки? Или есть лучший способ сделать статистику? Заранее спасибо!

+1

Звучит как работа для Valgrind. –

+0

@SevaAlekseyev: Не могли бы вы предоставить подробную информацию? Благодаря! –

+0

Ваши требования не ясны. Вы хотите знать, что выбрало распределение байтовых значений (вы знаете, что машина часто извлекает значения других размеров)? Распределение адресов, используемых текущей программой? ... адресов, найденных в объектном коде, игнорируя выполнение? FWIW, можно использовать «машинный код», чтобы разрывать отдельные машинные инструкции, так же, как вы можете использовать C, чтобы сделать то же самое (код C фактически скомпилирован в машинный код, и, таким образом, программа C для этого неявно предоставляет машину программа для этого). Предоставьте больше объяснений и еще несколько примеров. –

ответ

1

См. https://stackoverflow.com/a/20319753/120163 для получения информации о декодировании Intel; на самом деле вам действительно нужно обратиться к справочным руководствам Intel: http://download.intel.com/design/intarch/manuals/24319101.pdf Если вы хотите сделать это вручную только для нескольких инструкций, вы можете просто просмотреть данные в этих руководствах.

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

Мой ответ https://stackoverflow.com/a/23843450/120163 содержит код C, который отображает инструкции x86-32 по их длине, учитывая буфер, содержащий блок двоичного кода. Такой код необходим, если нужно начать в какой-то момент в буфере объектного кода и просто перечислить используемые инструкции. (Этот код использовался в производстве, он довольно прочный). Эта процедура была построена в основном, очень внимательно прочитав справочное руководство Intel. Для OP это должно быть расширено до x86-64, что не должно быть очень сложным, в основном вы учитываете байты кода операций префикса расширенного регистра и некоторые отличия от x86-32.

Чтобы решить проблему OP, можно также изменить эту процедуру, чтобы также вернуть количество байтов, считываемых каждой отдельной инструкцией. Эти последние данные также должны быть извлечены путем тщательной проверки из справочных руководств Intel.

OP также должен беспокоиться о том, где он получает код объекта; если он не запускает эту процедуру в адресном пространстве самого объектного кода, ему нужно каким-то образом получить этот объектный код из файла .exe. Для этого ему нужно построить или запустить эквивалент загрузчика Windows, и я готов поспорить, что у есть куча темных углов. Проверьте формат файлов объектных кодов.