Как отследить динамическую инструкцию в шипе (на RISC-V)

Я новичок в Spike и RISC V. Я пытаюсь выполнить динамическую трассировку инструкций с помощью Spike. Эти инструкции взяты из файла sample.c. Я пробовал следующие команды:

$ riscv64-unknown-elf-gcc simple.c -g -o simple.out
$ riscv64-unknown-elf-objdump -d --line-numbers -S simple.out

Но эти команды отображают собранные инструкции в выходном файле, чего я не хочу. Мне нужно отслеживать динамическую выполняемую инструкцию во время выполнения. Я нахожу только две относительные команды в опции узла Spike:

  • -g - отслеживать гистограмму ПК

  • -l - генерировать лог выполнения

Я не уверен, что результат будет таким, как я ожидал, как указано выше. Кто-нибудь знает, как сделать динамическую трассировку инструкций в шипе? Большое спасибо!


person Rosyphoton    schedule 19.03.2020    source источник


Ответы (1)


Да, вы можете вызвать Spike с помощью -l, чтобы получить трассировку всех выполненных инструкций.

Пример:

$ spike -l --isa=RV64gc ~/riscv/pk/riscv64-unknown-elf/bin/pk ./hello 2> ins.log

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

Трассировка все еще может быть полезна, например. вы можете искать начальный адрес вашего кода (т.е. искать его в выводе objdump) и использовать трассировку оттуда.

Кроме того, когда ваша программа вызывает системный вызов, вы видите что-то вроде этого в трассировке:

[.. inside your program ..]
core   0: 0x0000000000010088 (0x00000073) ecall
core   0: exception trap_user_ecall, epc 0x0000000000010088
core   0: 0x0000000080001938 (0x14011173) csrrw   sp, sscratch, sp
[.. inside the pk ..]
sret
[.. inside your program ..]

Это означает, что вы можете пропустить инструкцию sycall (выполняемую в pk), выполнив поиск следующего набора.

Кроме того, вы можете вызвать Spike с помощью -d, чтобы войти в режим отладки. Затем вы можете установить точку останова на первой интересующей вас инструкции в вашей программе (until pc 0 YOURADDRESS — найти адрес в выводе objdump) и сделать один шаг оттуда (нажав несколько раз return). См. также экран справки, введя h в подсказке шипа.

person maxschlepzig    schedule 21.03.2020
comment
Спасибо за Ваш ответ. Это именно то, что мне нужно! Но у меня все еще есть некоторые вопросы по поводу инструкций по трассировке. Я увидел в трассе ecall и sret и нашел между ними соответствующую связь. Однако есть также некоторые sret, соответствующие исключению trap_instruction_page_fault, .... Являются ли эти инструкции между ними инструкциями, выполняемыми в pk? - person Rosyphoton; 23.03.2020
comment
@Rosyphoton Ваша программа выполняется в пользовательском режиме, а pk выполняется в режиме супервизора. Если вы видите инструкцию sret, это означает возврат из режима супервизора. Это означает, что инструкции, предшествующие sret (до ловушки), относятся к pk. Ошибка страницы — это еще один пример того, как вызывается переключение из режима пользователя в режим супервизора (т. е. переключение из режима пользователя в пространство ядра). В ответе вы видите, что ловушка вызвана ecall. - person maxschlepzig; 23.03.2020