Как скомпилировать и запустить исполняемый файл в режиме эмуляции системного вызова gem5 с помощью se.py?

Есть много возможных ошибок и обходных путей, разбросанных по разным местам. Может ли кто-нибудь предоставить хотя бы одну подробную рабочую настройку с точными версиями gem5 и компилятора, надеюсь, в Ubuntu?

1 ответ

Минимальная рабочая настройка Ubuntu

По состоянию на октябрь 2018 года gem5 https://github.com/gem5/gem5/commit/8162e0da0285d346046151b2a45ceeb1baf63b8f, C hello world для всех x86, arm и aarch64, работает только в Ubuntu 16.04 и 18.04. x86 работал ранее, но этот коммит завершил некоторые необходимые изменения руки, чтобы заставить код glibc int запускаться до main работать должным образом.

Учитывая ту версию gem5 и одну из этих версий Ubuntu, вы можете запустить следующую программу на C:

main.c

#include <stdio.h>

int main(int argc, char **argv) {
    size_t i;
    for (i = 0; i < (size_t)argc; ++i)
        printf("%s\n", argv[i]);
    return 0;
}

просто как:

sudo apt-get install gcc
gcc -O0 -ggdb3 -std=c99 -static -o x86.out main.c
build/X86/gem5.opt \
  configs/example/se.py \
  -c x86.out \
  -o 'asdf qwer' \
;

sudo apt-get install gcc-arm-linux-gnueabihf
arm-linux-gnueabihf-gcc -O0 -ggdb3 -std=c99 -static -o arm.out main.c
build/ARM/gem5.opt \
  configs/example/se.py \
  -c arm.out \
  -o 'asdf qwer' \
;

sudo apt-get install gcc-aarch64-linux-gnu
aarch64-linux-gnu-gcc -O0 -ggdb3 -std=c99 -static -o aarch64.out main.c
build/ARM/gem5.opt \
    configs/example/se.py \
    -c aarch64.out \
    -o 'asdf qwer' \
;

и во всех случаях выдает правильный вывод:

asdf
qwer

-static требуется в ARM, как упоминалось в разделе: Как запустить динамически связанный исполняемый файл режима эмуляции syscall se.py в gem5?

Если кто-то найдет установку с более новой версией gem5 или версией Ubuntu, для которой такая минимальная программа на С не выполняется правильно в одной из ранее упомянутых арок, пожалуйста, отправьте электронное письмо с подробным описанием настроек вашей системы в список рассылки и CC me.

Отсутствующие системные вызовы

Затем, конечно, когда вы попытаетесь запустить более сложные пользовательские программы, вы неизбежно встретите невыполненные системные вызовы, поскольку их много.

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

Скорее не откладывайте, а попробуйте патч!

Многие из системных вызовов тривиальны для реализации, см., Например, https://github.com/gem5/gem5/commit/8162e0da0285d346046151b2a45ceeb1baf63b8f.

Только тогда, если вы попробовали патч, но потерпели неудачу, начните пинговать людей в списке рассылки и спрашивать, как заставить работать ваш патч.

Многопоточность

ТОДО это известная главная болевая точка. Я не знаю, каков статус, но я слышал, что он ненадежный.

Последние исправления, которые заставили ARM работать

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

crosstool-NG

Использование crosstool-NG для включения ulibc вместо glibc может иногда использоваться в качестве обходного пути для кода инициализации glibc, поскольку ulibc является более минимальным и требует меньше кода, чем glibc. Это не идеально, но может сработать, если вам действительно не удастся исправить gem5. Описано по адресу: Как решить "FATAL: слишком старое ядро" при запуске gem5 в режиме SE эмуляции syscall?

Другие вопросы по тегам