Allocazione della memoria per lo spazio utente dal thread del kernel
-
06-07-2019 - |
Domanda
La mia domanda riguarda il passaggio di dati dal kernel a un programma di spazio utente. Voglio implementare una chiamata di sistema " get_data (size, char * buff, char ** meta_buf) " ;. In questa chiamata, buff è allocato dal programma dello spazio utente e la sua lunghezza viene passata nell'argomento size. Tuttavia, meta_buf è un buffer di lunghezza variabile che viene allocato (nelle pagine vm del programma spazio utente) e riempito dal kernel. Il programma di spazio utente libererà questa regione.
(Non posso allocare dati nello spazio utente poiché il programma spazio utente non conosce la dimensione del meta_buff. Inoltre, il programma spazio utente non può allocare una quantità fissa di memoria e chiamare la chiamata di sistema più volte per leggere l'intero metadati. meta_data deve essere restituito in una singola chiamata di sistema)
- Come posso allocare memoria per un programma di spazio utente dal thread del kernel? (Gradirei anche se potessi indicarmi qualsiasi altra chiamata di sistema che fa un'operazione simile: allocazione nel kernel e liberazione nello spazio utente)
- Questa interfaccia è corretta o esiste un modo migliore per farlo?
Soluzione
Non tentare di allocare memoria per lo spazio utente dal kernel - questa è un'enorme violazione del livello di astrazione del kernel. Invece, considera alcune altre opzioni:
- Chiedi a userspace di chiedere quanto spazio ha bisogno. Userspace alloca, quindi prende la memoria dal kernel.
- Avere pagine mmap di userspace di proprietà del tuo driver direttamente nel suo spazio di indirizzi.
- Imposta un limite superiore per la quantità di dati necessari. Basta assegnare così tanto.
È difficile aggiungere altro senza sapere perché questo deve essere atomico. In realtà l'allocazione della memoria dovrà essere comunque interrompibile (o è improbabile che ci riesca), quindi è improbabile che uscire e rientrare nel kernel faccia molto male. In effetti, qualsiasi scrivere nella memoria dello spazio utente deve essere interrompibile, poiché esiste il potenziale per errori di pagina che richiedono IO.