sun.misc.Unsafe consente l'accesso al sistema o solo alla JVM?

5

Nota : sebbene questa domanda riguardi i microcontrollori, è al suo interno una domanda Java e quindi credo che possa essere risolta da qualsiasi Java stanco della battaglia guru.

Mi sono imbattuto in questo blog che parlava di sun.misc.Unsafe e Stavo cercando di capire tutte le sue capacità per vedere se fosse appropriato per un mio progetto di hobby.

Alla vista di 30.000 piedi, sto provando a programmare un chip ARM (Arduino Due - un MCU ARM SAM3X8E) per pilotare alcune periferiche IO (flash alcuni LED, servo drive, ecc.) su un semplice dispositivo elettronico. Per un buon sport, vorrei amare per farlo in puro Java, se possibile. Fino a leggere quell'articolo, non pensavo nemmeno che fosse possibile, e ho pensato che avrei dovuto fare la maggior parte se non tutta la programmazione in C. Perché questo sapore di ARM può supportare Linux, in particolare uno stile unikernel ridotto al minimo "di Linux, mi piacerebbe scrivere il mio programma di controllo interamente in Java e distribuirlo in una posizione (ad esempio /opt/myapp ) su un'immagine Linux che posso quindi visualizzare sul chip ARM. Con un po 'di complicazioni / hacking, dovrei essere in grado di ottenere il chip ARM per eseguire l'app Java quando il dispositivo si accende.

La mia domanda

Per pilotare le periferiche IO del mio dispositivo, ho bisogno di accedere a specifici indirizzi di memoria che esisteranno al di fuori del processo JVM che esegue la mia app. Fino ad ora avevo l'impressione che le JVM " sandbox " le loro app residenti, impedendo loro di accedere direttamente a qualsiasi cosa nella memoria di sistema. Quindi il mio piano doveva scrivere un po 'di codice C (che in realtà guida le periferiche, lampeggia i LED, ecc.) E poi fare in modo che la mia app invochi il codice C attraverso JNI.

Ma se leggo correttamente il blog, sembra che sun.misc.Unsafe mi dia accesso alla memoria di sistema esterna della JVM. Se questo è vero, allora tecnicamente non ho bisogno di alcun codice C. Certo, sto commettendo ogni sorta di sicurezza no-no, rendendo il mio codice non portatile, ecc. Ma va bene: questo è solo un progetto per hobby che gira su una piattaforma specifica che non intendo cambiare.

Quindi chiedo: sto comprendendo correttamente Unsafe , e se sì, ci sono altri avvertimenti / limitazioni / limitazioni che dovrei prendere in considerazione mentre lo uso?

    
posta smeeb 19.05.2015 - 03:24
fonte

2 risposte

4

sun.misc.Unsafe non fa parte dello standard Java. Pertanto, il tuo primo compito determinerà se l'implementazione Java che eseguirai sul chip ARM lo supporta.

Se la risposta a quanto sopra è sì, è necessario chiedersi se gli indirizzi I / O che è necessario accedere siano mappati all'interno del processo di JVM. Non sicuro consente di evitare il normale modello di memoria Java, ma non ha alcuna possibilità di sfuggire allo spazio degli indirizzi del processo JVM. Non sarebbe inusuale che gli indirizzi I / O hardware fossero scrivibili solo dallo spazio indirizzo del kernel, ma la tua piattaforma potrebbe essere diversa.

Supponendo che gli indirizzi I / O siano mappati nel processo JVM, l'ultimo ostacolo è controllare se tutti i protocolli che si prevede di utilizzare siano abbastanza lenti o flessibili abbastanza da poterli guidare da un processo Java, che può essere soggetto alla raccolta dati obsoleti di stop-the-world e ad altri fattori che lo rendono non-even-remotamente-in tempo reale.

Se tutto ciò si verifica, sembra un progetto interessante.

Oh, aspetta, devi anche trovare un modo per adattare Linux e una JVM a 512 KB di memoria flash ... ed eseguirli in 100 KB di RAM. Sembra che avresti bisogno di aggiornare ad un chip molto più potente per realizzare questo concetto, probabilmente uno con un controller DRAM per essere in grado di collegare quantità ragionevoli di RAM.

    
risposta data 19.05.2015 - 11:46
fonte
2

Se vuoi programmare un ARM economico chip in Java (che è probabilmente non una buona idea ) e se accetti di codificare una vecchia versione del linguaggio di programmazione Java, potresti prendere in considerazione l'utilizzo di gcj , il compilatore in anticipo di Java all'interno di alcune versioni di GCC .

(Attenzione, il supporto Java nel GCC sembra essere scomparso nel 2015, o almeno sta diventando meno importante per la comunità GCC)

Tuttavia, potresti voler usare un'altra lingua. Se garbage collection è importante per te, puoi usare D , o Vai , o forse anche usare (magari portandolo sul nudo metallo) il Boehm garbage collector conservativo in C (o anche in C ++, vedi this ) - che viene utilizzato da gcj . Potresti anche prendere in considerazione la codifica in Ocaml , vedi MirageOS . E Rust non è garbage collection ma potrebbe essere utile su un piccolo chip ARM.

Leggi anche wikipage su Java in tempo reale

    
risposta data 19.05.2015 - 12:09
fonte

Leggi altre domande sui tag