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)

  1. 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)
  2. Questa interfaccia è corretta o esiste un modo migliore per farlo?
È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top