2013-08-18 5 views
7

Ich arbeite an einer modifizierten Version des 2.6.35-Kernel für Olinuxino, eine ARM9-basierte Plattform. Ich versuche, den Energieverwaltungstreiber (den architekturspezifischen Teil) zu ändern.Shutdown (embedded) Linux vom Kernel-Space

Der Prozessor ist ein Freescale i.MX23. Dieser Prozessor hat einen "speziellen" Pin namens PSWITCH, der einen Interrupt auslöst, der vom Power-Management-Treiber gehandhabt wird. Wenn der Schalter gedrückt wird, wechselt das System in den Standby-Modus. Dies wird im Treiber durch den Aufruf pm_suspend(PM_SUSPEND_STANDBY) getan.

meine Hardware-Setup gegeben, würde Ich mag an, stattdessen das System herunterfahren. Also meine Frage ist:

Was ist der bevorzugte Weg für einen Kernel-Space-Prozess zu einem sauberen System Halt/Poweroff auslösen?

Ich nehme an, es ist ein netter kleiner Funktionsaufruf gab, aber ich konnte es nicht so weit finden.

Mein Kernel-Code (die Datei, an der ich arbeite, ist arch/arm/mach-mx23/pm.c) kann hier gefunden werden: github.com/spairal/linux-for-lobster, obwohl meine Frage nach einem allgemeinen Linux-Kernel-Ansatz verlangt.

+0

Sie könnten eine 'strace' auf' init tun 0 'und sehen, welche syscalls ausgeführt werden. –

Antwort

9

Die allgemeine Weg wäre für Ihre Fahrer shutdown als Userspace-Helfer aufzurufen:

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

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

(Vorausgesetzt, Sie eine /sbin/shutdown binäre installiert haben). Dadurch wird der Benutzerbereich sauber heruntergefahren, Dateisysteme werden deaktiviert und der Kernel wird heruntergefahren und ausgeschaltet.

Sie können jedoch möglicherweise besser als das tun - zum Beispiel, wenn Sie garantieren können, dass keine Platten-Dateisysteme Read/Write eingehängt werden, könnten Sie einem Kernel-Thread sagen, die kernel_power_off() Funktion aufzurufen (es sollte nicht getan werden vom Unterbrechungskontext).

+0

Das funktioniert wunderbar. Ich hoffte, dass es eine Lösung geben würde, die nicht den Aufruf von Userspace beinhaltete, aber ich denke, es gibt eine Menge Userspace-Sachen, die erledigt werden müssen ... Nur ein Detail: shutdown_argv sollte const char * const * oder [] sein. – pcarranzav

+0

@pcarranzav: Ahh ja, behoben, Tippfehler, danke. – caf

+0

Ich habe kernel_halt() verwendet, um dies auf meinem eingebetteten PowerPC durchzuführen, und es scheint, als ob ich den Prozess init 0 durchlaufen habe. Denkst du, ich habe etwas verpasst? –