2013-08-18 3 views
7

Sto lavorando su una versione modificata del kernel 2.6.35 per Olinuxino, una piattaforma basata su ARM9. Sto cercando di modificare il driver di gestione dell'alimentazione (la parte specifica dell'architettura).Shutdown (incorporato) linux dallo spazio del kernel

Il processore è un iMX23 di Freescale. Questo processore ha un pin "speciale", chiamato PSWITCH, che attiva un interrupt gestito dal driver di gestione dell'alimentazione. Se si preme l'interruttore, il sistema passa in standby. Questo viene fatto nel driver chiamando pm_suspend(PM_SUSPEND_STANDBY).

Data la mia configurazione hardware, mi piacerebbe, invece, spegnere il sistema. Quindi la mia domanda è:

Qual è il modo preferito per un processo nello spazio del kernel per avviare un arresto/spegnimento del sistema pulito?

Suppongo che ci sia una bella funzione chiamata, ma non ho potuto trovarla finora.

Il mio codice del kernel (il file su cui sto lavorando è arch/arm/mach-mx23/pm.c) può essere trovato qui: github.com/spairal/linux-for-lobster, sebbene la mia domanda richieda un approccio generale del kernel Linux.

+0

Si potrebbe eseguire un 'strace' su' init 0' e vedere quali sysc vengono eseguite. –

risposta

9

Il più generale modo sarebbe per il driver di invocare shutdown come aiutante userspace:

static const char * const shutdown_argv[] = 
    { "/sbin/shutdown", "-h", "-P", "now", NULL }; 

call_usermodehelper(shutdown_argv[0], shutdown_argv, NULL, UMH_NO_WAIT); 

(Presumendo di avere un /sbin/shutdown binario installato). Ciò interromperà lo spazio dell'utente, smonterà i filesystem e richiederà l'arresto del kernel e spegnimento.

Tuttavia, si può essere in grado di fare meglio di questo - ad esempio se si può garantire che non ci siano file system del disco montati in lettura/scrittura, si potrebbe dire a una thread del kernel di richiamare la funzione kernel_power_off() (non dovrebbe essere fatta dal contesto di interruzione).

+0

Che funziona magnificamente. Speravo che ci sarebbe stata una soluzione che non comportava la chiamata di userspace, ma immagino ci sia un sacco di cose nello spazio utente che devono essere fatte ... Solo un dettaglio: shutdown_argv dovrebbe essere const char * const * o []. – pcarranzav

+0

@pcarranzav: Ahh sì, corretto quel refuso, grazie. – caf

+0

Ho usato kernel_halt() per eseguire questa operazione sul mio powerpc incorporato, e sembrava passare attraverso il processo di init 0. Pensi che mi sia sfuggito qualcosa? –