GNU/Linux >> Linux Esercitazione >  >> Linux

Esecuzione di una funzione dello spazio utente dallo spazio del kernel

Sei sfortunato con l'invocazione delle funzioni dello spazio utente dal kernel poiché il kernel non lo fa e non dovrebbe conoscere le funzioni e la logica delle singole applicazioni dello spazio utente, per non parlare del fatto che ogni applicazione dello spazio utente ha la propria memoria layout, che nessun altro processo né il kernel possono invadere in quel modo (gli oggetti condivisi sono l'eccezione qui, ma non puoi comunque attingere a quello dallo spazio del kernel). Per quanto riguarda il modello di sicurezza, non dovresti eseguire il codice dello spazio utente (che è automaticamente considerato codice non sicuro nel contesto del kernel) nel contesto del kernel in primo luogo poiché ciò interromperà il modello di sicurezza di un kernel proprio lì in quell'istante. Ora, considerando tutto quanto sopra menzionato, oltre a molti altri motivi, potresti voler riconsiderare il tuo approccio e concentrarti su Kernel <-> IPC e interfacce dello spazio utente del kernel, il file system o l'API helper in modalità utente (leggi sotto).

Tuttavia, puoi richiamare le app dello spazio utente dal kernel, utilizzando l'API usermode-helper. Il seguente articolo di IBM DeveloperWorks dovrebbe iniziare a utilizzare l'API del kernel Linux usermode-helper:

API del kernel, parte 1:richiamo di applicazioni in spazio utente dal kernel


Penso che il modo più semplice sia registrare un dispositivo a caratteri che diventa pronto quando il dispositivo ha dei dati.

Qualsiasi processo che tenta di leggere da questo dispositivo viene quindi messo in sospensione finché il dispositivo non è pronto, quindi riattivato, a quel punto può fare la cosa appropriata.

Se vuoi solo segnalare la disponibilità, un lettore potrebbe semplicemente leggere un singolo byte nullo.

Il programma in spazio utente dovrebbe quindi solo eseguire una chiamata di blocco read() e verrebbe bloccato in modo appropriato fino a quando non lo riattivi.

Dovrai conoscere il meccanismo della coda di attesa dello scheduler del kernel per usarlo.


Sembra che la tua linea di interruzione sia già disponibile per lo spazio utente tramite gpiolib? (/sys/class/gpio/...)

Hai verificato se gpio edge triggering e poll() sono abbastanza veloci per te? In questo modo non è necessario eseguire il polling dello stato dall'applicazione dello spazio utente, ma l'edge triggering lo riporterà tramite poll(). Vedi Documentation/gpio.txt nei sorgenti del kernel.

Se l'edge triggering tramite sysfs non è abbastanza buono, allora il modo corretto è sviluppare un driver del kernel che si occupi della parte critica in termini di tempo ed esporti i risultati nello spazio utente tramite un'API (sysfs, device node, ecc.).


Linux
  1. Il ciclo di vita dei test del kernel Linux

  2. La funzione di root del gruppo utente??

  3. Dovrei aggiornare il kernel da 3.16 a 4.**??

  4. Nozioni di base sulla riga di comando di Linux:esecuzione di comandi dalla riga di comando

  5. Come modificare il kernel predefinito (avvio dal vecchio kernel) in CentOS/RHEL 8

Come installare il kernel 5.13 in Ubuntu 18.04 dal repository 20.04

Cosa è successo allo spazio libero?

Come accedere (se possibile) allo spazio del kernel dallo spazio utente?

Chiama una funzione dello spazio utente dall'interno di un modulo del kernel Linux

Compilando il kernel Linux, quanta dimensione è necessaria?

Come posso riservare un blocco di memoria dal kernel Linux?