
Python bindings for BochsCPU
Bindings Python pour le BochsCPU d'@yrp, utilisant la FFI pour émuler facilement et avec précision du code x86.
bochscpu-python requiert uniquement un environnement Python 3.8 ou plus récent.
De loin le moyen le plus simple de démarrer est d'utiliser la version stable empaquetée sur PyPI.
python -m pip install bochscpu-python
Téléchargez le dernier artefact fonctionnel depuis l'onglet Github Actions du dépôt. Extrayez le fichier ZIP, puis installez le fichier .whl situé dans le dossier wheel.
python -m pip install wheel/bochscpu-$version-$os-$arch.whl
Assez simple :
python -m pip install .
Ou sans cloner :
python -m pip install git+https://github.com/hugsy/bochscpu-python.git#egg=bochscpu-python
Notez que cette approche nécessitera d'avoir installé tous les outils de compilation nécessaires (comme décrit ci-dessous).
cmakepipcl sous Windows, clang++ sous MacOS et g++ sous Linux)build*.lib dans bochscpu/lib/<BuildType> (où BuildType peut être Debug, Release, RelWithDebInfo, etc.)python -m pip install -r requirements.txtcmake
Cela générera le fichier bochscpu pyd (et son PDB) que vous pouvez importer depuis une session Python avec import bochscpu..whl depuis la racine du projet :python -m pip wheel .
Importez simplement le module bochscpu et que l'aventure commence ! L'installation du paquet installera également des fichiers d'interface, permettant aux IDE modernes (VSCode, PyCharm, etc.) de proposer de l'autocomplétion utile.
Un gabarit très rudimentaire peut être réalisé comme suit :
import bochscpu, bochscpu.utils, bochscpu.cpu
sess = bochscpu.Session()
sess.missing_page_handler = bochscpu.utils.callbacks.missing_page_cb
state = bochscpu.State()
bochscpu.cpu.set_real_mode(state)
hook = bochscpu.Hook()
bochscpu.utils.callbacks.install_default_callbacks(hook)
sess.run([hook,])
Cela créera une session bochscpu, définira l'état du CPU en mode réel, et pré-remplira les hooks avec des callbacks de base (qui ne font qu'un print à l'exécution). Notez que cet exemple ne fera en réalité rien, car nous n'avons pas alloué de pages de code ni défini correctement les registres pour y pointer.
Un gabarit plus complet se trouve dans le dossier examples/.
https://github.com/hugsy/bochscpu-python/assets/590234/adc5ac5a-a8eb-4982-9537-5ece3f32f8f8
print("hello world") en mode réel 16 bits
https://github.com/hugsy/bochscpu-python/assets/590234/eb06af06-4b10-490e-ae40-a1d0aed333ca
rand() de la Glibc Linux sur x64
https://github.com/hugsy/bochscpu-python/assets/590234/2486adbc-0878-46f5-83ed-3bcf9774fd26