2013-08-18 9 views
7

Pracuję nad zmodyfikowaną wersją jądra 2.6.35 dla Olinuxino, platformy opartej na ARM9. Próbuję zmodyfikować sterownik zarządzania energią (część specyficzna dla architektury).Linuks z zamykaniem (osadzonym) z przestrzeni

Procesor to Freescale i.MX23. Ten procesor ma "specjalny" pin, zwany PSWITCH, który wyzwala przerwanie, które jest obsługiwane przez sterownik zarządzania energią. Po naciśnięciu przełącznika system przechodzi w tryb czuwania. Odbywa się to w sterowniku, dzwoniąc pod numer pm_suspend(PM_SUSPEND_STANDBY).

Biorąc pod uwagę moją konfigurację sprzętu, chciałbym zamiast tego zamknąć system. Więc moje pytanie brzmi:

Jaki jest preferowany sposób procesu jądra do uruchomienia czystego zatrzymania/wyłączenia systemu?

Przypuszczam, że jest tam fajna funkcja, ale nie mogłem jej znaleźć.

Mój kod jądra (plik, nad którym pracuję to arch/arm/mach-mx23/pm.c) można znaleźć tutaj: github.com/spairal/linux-for-lobster, chociaż moje pytanie wymaga ogólnego podejścia do jądra systemu Linux.

+0

Możesz zrobić 'strace' na' init 0' i zobaczyć, które serwery są wykonywane. –

Odpowiedz

9

Najbardziej ogóle sposobem byłoby dla kierowca powołać shutdown jako pomocnik w przestrzeni użytkownika:

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

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

(Zakładając, że masz /sbin/shutdown binarny zainstalowany). Spowoduje to całkowite zamknięcie przestrzeni użytkownika, odmontowanie systemów plików, a następnie żądanie wyłączenia i wyłączenia jądra.

Jednak możesz być w stanie zrobić to lepiej - na przykład, jeśli możesz zagwarantować, że nie ma zamontowanych systemów plików na dysku, możesz wskazać wątek jądra, aby wywołać funkcję kernel_power_off() (nie powinno to być zrobione z kontekstu przerwań).

+0

To działa pięknie. Miałem nadzieję, że znajdzie się rozwiązanie, które nie wymagałoby wywoływania przestrzeni użytkownika, ale wydaje mi się, że jest wiele rzeczy, które należy wykonać w przestrzeni użytkownika ... Wystarczy szczegół: shutdown_argv powinien być const char * const * lub []. – pcarranzav

+0

@pcarranzav: Ahh tak, poprawiono tę literówkę, dzięki. – caf

+0

Użyłem kernel_halt(), aby wykonać to na moim osadzonym powerpc, i wydawało się, że przechodzi przez proces init 0. Myślisz, że coś przeoczyłem? –

Powiązane problemy