[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Re: eseguire software di un'architettura hardware diversa da quella del proprio sistema (ERA: Re: Ancora CIE e middleware)



> notably 64bit kernels often support running 
> 32bit software (but most probably not the converse)" che non sembra 
> escludere definitivamente

Se il mondo non e` cambiato nel frattempo, mi sentirei di escluderlo.
Un eseguibile a 64 bit usa puntatori a 64 bit e vuole una memoria
virtuale a 64 bit (non ricordo quanti, ma piu` di 32). Se il kernel
e` a 32 bit, offre una memoria virtuale a 32.

> "or a qemu-user instance is configured 
> to act as an on-the-fly emulation layer, see QemuUserEmulation"

Questo funziona come un gioiellino. Ma ovviamente il codice viene
interpretato (da qemu), non eseguito, quindi va piu` lento. Qemu e`
straordinariamente efficente (e` Fabrice Bellard, mica l'ultimo
pistola) ma comunque siamo circa 10x piu` lento del nativo.

> La cosa è molto interessante e, ad avere tempo, sarebbe da sperimentare

E' banale. Si prende un eseguibile arm e si esegue. E` uno dei primi
esempi che faccio ai miei studenti, partendo da PC per andare su
micretto.

Certo, se e` un eseguibile "serio" occorrono anche le librerie dinamiche
dell'architettura eccetera. Io lo faccio vedere senza libreria,
implementando le 2 chiamate di sistema che mi servono (write e exit):

   laptopo% make hell-arm
   arm-none-eabi-gcc    -c -o syscalls-arm.o syscalls-arm.S
   arm-none-eabi-gcc -Wall -static -ffreestanding   -c -o hell.o hell.c
   arm-none-eabi-ld -e main -o hell-arm syscalls-arm.o hell.o

   laptopo% ./hell-arm
   Hello

   laptopo% file hell-arm
   hell-arm: ELF 32-bit LSB executable, ARM, EABI5 version 1 (SYSV), statically linked, not stripped

   laptopo% uname -m
   x86_64

Il trucco sta in binfmtmisc, che definisce interpreti per vari formati
di file, in base al contenuto del file (il "magic number"):

   laptopo% ls /proc/sys/fs/binfmt_misc/
   cli              qemu-aarch64     qemu-mips        qemu-sh4
   jar              qemu-alpha       qemu-mipsel      qemu-sh4eb
   llvm-3.1.binfmt  qemu-arm         qemu-ppc         qemu-sparc
   python2.6        qemu-armeb       qemu-ppc64       qemu-sparc32plus
   python2.7        qemu-cris        qemu-ppc64abi32  qemu-sparc64
   python3.2        qemu-m68k        qemu-ppc64le     register
   python3.4        qemu-microblaze  qemu-s390x       status


Reply to: