
Binding Python per BochsCPU
Binding Python per BochsCPU di @yrp che utilizzano FFI per emulare facilmente e con precisione il codice x86.
bochscpu-python richiede un ambiente Python 3.8 o più recente.
Il modo più semplice per iniziare è usare la versione stabile impacchettata disponibile su PyPI
python -m pip install bochscpu-python
Scarica l'ultimo artefatto funzionante dalla scheda Github Actions del repository. Estrai il file ZIP e installa il file .whl che troverai nella cartella wheel.
python -m pip install wheel/bochscpu-$version-$os-$arch.whl
Abbastanza semplice:
python -m pip install .
Oppure senza clonare
python -m pip install git+https://github.com/hugsy/bochscpu-python.git#egg=bochscpu-python
Nota che questo approccio richiede di avere installati tutti gli strumenti di build necessari (come descritto sotto).
cmakepipcl per Windows, clang++ per macOS e g++ per Linux)build*.lib in bochscpu/lib/<BuildType> (dove BuildType può essere Debug, Release, RelWithDebInfo, ecc.)python -m pip install -r requirements.txtcmake
Questo genererà il file pyd di bochscpu (e il suo PDB) che potrai importare da una sessione Python con import bochscpu..whl dalla radice del progetto:python -m pip wheel .
Basta importare il modulo bochscpu e il divertimento ha inizio! L'installazione del pacchetto installerà anche i file di interfaccia, consentendo agli IDE moderni (VSCode, PyCharm, ecc.) di offrire utili completamenti.
Un template molto grezzo può essere creato così:
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,])
Questo creerà una sessione bochscpu, imposterà lo stato della CPU per la modalità reale e pre-popolerà gli hook con callback di base (che eseguono solo una print al momento dell'esecuzione). Nota che questo esempio in realtà non fa nulla, poiché non abbiamo allocato pagine di codice né impostato correttamente i registri per puntare a esse.
Un template più completo è disponibile nella cartella examples/
https://github.com/hugsy/bochscpu-python/assets/590234/adc5ac5a-a8eb-4982-9537-5ece3f32f8f8
print("hello world") in modalità reale a 16 bit
https://github.com/hugsy/bochscpu-python/assets/590234/eb06af06-4b10-490e-ae40-a1d0aed333ca
rand() della Glibc di Linux su x64
https://github.com/hugsy/bochscpu-python/assets/590234/2486adbc-0878-46f5-83ed-3bcf9774fd26