Archie es un marco basado en QEMU para la evaluación de fallas independientes de la arquitectura. Permite al usuario definir campañas de fallas utilizando un archivo de configuración JSON y ejecutar automáticamente toda la campaña sin entrada adicional del usuario. Archie es capaz de simular fallas permanentes y transitorias en instrucciones, memoria y registros. Los datos de comportamiento del objetivo se recopilan y almacenan dentro de un archivo de registro HDF5 para un análisis posterior.
Para usar este programa de Python, se necesita QEMU con el complemento de falla (QEMU se puede encontrar en QEMU, el complemento de falla se puede encontrar en la carpeta de FaastPlugin).
Un proyecto de ejemplo, que inyecta fallas en un firmware de Tinyaes incrustado, se puede encontrar unter https://github.com/tibersam/archie-aes-example
[[ TOC ]]
Para la cadena de herramientas QEMU y el complemento de falla deben ser compilados. Esto se puede hacer automáticamente ejecutando el script Build.sh . Asegúrese de que se instalen las bibliotecas requeridas para QEMU y las bibliotecas de Python para Archie. Para Ubuntu, el script de compilación puede instalar las dependencias faltantes para QEMU y Python. Le preguntará si debe instalar las dependencias.
./build.sh
Alternativamente, las instrucciones de compilación se proporcionan en las siguientes secciones.
Archie fue probado con QEMU 6.0, que está disponible en Archie-Qemu. Primero asegúrese de que se instalen los requisitos básicos para QEMU. Vea el wiki para las bibliotecas requeridas (https://wiki.qemu.org/hosts/linux). En los sistemas Ubuntu, puede instalar los paquetes mínimos requeridos con:
sudo apt install git build-essential ninja-build libglib2.0-dev libfdt-dev libpixman-1-dev zlib1g-dev
Visite Git Submodule Qemu, que debería revisar TCG_PLUGIN_DEV del GIT. Vea el segmento de código a continuación.
git submodule update --init
mkdir -p qemu/build/debug
cd qemu/build/debug
./../../configure --target-list=arm-softmmu --enable-debug --enable-plugins --disable-sdl --disable-gtk --disable-curses --disable-vnc
make -j {CPUCORENUMBER}
cd ../../../faultplugin/
make
Con esto, Archie-Qemu se construye en qemu/ build/ depug/ y el complemento se construye en fastplugin/ si cambia el directorio de compilación para Archie-Qemu , cambie la ruta en el archivo de making en la carpeta de faushplugin/ para construir el complemento.
Para el programa Python3, se necesitan las siguientes bibliotecas
pandas (tested 0.25.3)
tables (tested 3.6.1)
python-prctl (tested 1.6.1)
numpy (tested 1.17.4)
json (tested 2.0.9), or json5 (tested 0.9.6)
Estas bibliotecas Python3 se pueden instalar utilizando el método de instalación de su Distribución de Linux o utilizando PIP3. JSON5 se recomienda fuertemente, ya que permite que los enteros se representen como números hexadecimales.
Para PIP3, se pueden usar requisitos.txt. Si está utilizando PIP3, asegúrese de instalar libcap-dev . Se requiere para Python-PRCTL. Ver también https://pythonhosted.org/python-prctl/#downloading-andinstalling
Para usar el programa Python3 (controlador.py), se necesitan dos archivos de configuración. Estos archivos están en formato JSON. Consulte https://www.json.org/json-en.html para más detalles.
qemuconf.json contiene un objeto con la ruta al ejecutable QEMU, la biblioteca de complementos, el BIOS y el núcleo que debe ser ejecutado por QEMU. Los argumentos adicionales que deben pasar a QEMU se pueden especificar con additional_qemu_args . Consulte "qemuconf.json" para un archivo JSON válido con rutas. Ajuste las rutas a su respectivo sistema. La carpeta miniblink contiene un binario de demostración para la experimentación inicial. Para probarlo, modifique la ruta del núcleo a "kernel" : "miniblink/miniblink.bin . Si se debe utilizar otra arquitectura, cambie la línea "machine" : "stm32f0discovery" reemplazar stm32f0discovery con el nombre asociado en qemu. Para encontrar el nombre, ejecutar el binario de QEMU con opción -M ?
fall.json contiene la descripción de fallas. Contiene un objeto que implica el objeto de punto de inicio, el objeto de punto final, el objeto Memdump y una matriz de fallas. Consulte las descripciones en fallas-readme.md para ver cómo construir este objeto JSON. Se puede encontrar una configuración de ejemplo para varios experimentos en fall.json
La salida del programa se almacenará en un archivo HDF5. Para obtener una descripción de cómo interpretar el contenido del archivo, consulte HDF5-Readme.md .
Para ejecutar el programa Python3, escriba:
python3 controller.py --debug --fault fault.json --qemu qemuconf.json output.hdf5
Reemplace Fauth.json y qemuconf.json con los archivos correspondientes.
El indicador - -debug crea un archivo de registro para cada experimento. El nombre del archivo de registro tiene el siguiente formato: log_experiment-id.txt , por ejemplo, log_4.txt para el experimento con ID 4.
Para obtener más información sobre los parámetros de entrada, escriba:
python3 controller.py --help
Es posible conectarse a una instancia de QEMU con GDB. Para usar esta función en el marco y observar fallas introducidas se puede establecer el indicador - -GDB . Archie iniciará el proceso QEMU interno con GDB habilitado y se detendrá al inicio del sistema simulado. Para conectarse a QEMU desde el puerto de uso de GDB 1234. También obligará al marco a generar solo un trabajador y pasará por todas las fallas configuradas en fall.json . Si se requiere una falla específica, el archivo JSON debe editarse para contener solo esta falla específica.
python3 controller.py --gdb --fault fault.json --qemu qemuconf.json output.hdf5
Para conectarse de GDB al uso de la sesión QEMU
targ rem:localhost:1234
QEMU esperará unil La sesión GDB está adjunta. El modo de depuración solo es adecuado para el análisis de un bajo número de fallas. Pasar por una gran cantidad de fallas es engorroso. Esto debe considerarse al ajustar los archivos JSON.