Domanda

sto cercando informazioni relative ad attuare determinate estensioni della CPU in un modulo del kernel. Ho trovato qualcosa legato: http: / /www.mirrors.docunext.com/lxr/http/source/arch/mips/kernel/unaligned.c infatti, è l'unico codice sorgente che posso trovare è che nemmeno vicino.

In sostanza, ho un binario unico oggetto condiviso costruito con determinate estensioni di CPU, di cui ho bisogno per funzionare su una CPU leggermente più vecchio, che ha la maggior parte del set di istruzioni, ma non la roba di fantasia nuova. Sì, lo so che sarà piuttosto lento, ma è meglio di schiantarsi con SIGILLs.

È stato utile?

Soluzione 4

Bene, dopo aver letto i sorgenti del kernel, sembra che ci sia già il supporto minore per questo. Davvero non riesco a vedere quanto è effettivamente utilizzato, ma esiste una lista concatenata per memorizzare le varie istruzioni emulato. Se sono in grado di ottenere in realtà questo andare, io probabilmente cambiarlo nel kernel-header albero in dotazione.

Se sono i moduli del kernel giusta comprensione, ci Non sembra ci sarebbe stato un problema per supportare l'emulazione pluggable.

Altri suggerimenti

penso che si può fare questo in userland. Installare un gestore per SIGILL con sigaction() e specificare SA_SIGINFO. Il si_code campo nel siginfo_t permette distinguere tra diverse cause di SIGILL. Ad esempio, cercando di emulare un'istruzione quando il segnale è venuto da kill() non ha senso. Il terzo argomento ai punti gestore ad una struttura che contiene il contesto della CPU al momento del guasto (documentazione See). Si può probabilmente modificare questo e tornare dal gestore di segnale, le modifiche che entreranno in vigore; se questo non funziona, provare setcontext().

Ovviamente, sarà un po 'meno efficiente che farlo nel kernel, ma più pulito e più sicuro.

Si può fare questo, ma la sua un po 'doloroso. I codici operativi non validi hanno bisogno di essere intercettati, in modo che sia necessario modificare il gestore di istruzioni illegali esistenti, o avvolgere il gestore, che è sporco e complicato.

Se si vuole evitare qualsiasi mods kernel, ma fare come un kernel puro, l'approccio avvolto-eccezione è probabilmente l'unico modo per farlo. Se è possibile modificare il kernel, il gestore patch è migliore.

Non credo che si può risolvere questo problema utilizzando un modulo del kernel. io vi penso sia necessità di eseguire questo in una macchina virtuale che permette alle istruzioni mancanti (vorrei provare a utilizzare XEN) o ricompilare l'oggetto in modo che non li usa.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top