So che le funzioni copy_to_user
/copy_from_user
, get_user
/put_user
sono a questo scopo.Come accedere alla memoria dello spazio utente dal kernel Linux?
La mia domanda è che, dato un indirizzo/puntatore dello spazio utente, come posso accedere ai dati indicati dall'indirizzo dal kernel in generale?
Posso immaginare che prima devo assicurarmi che la pagina contenente debba essere nella memoria fisica (invece che nel disco).
Qual è il prossimo passo? Posso usare *p
, dove p
è il puntatore che punta ad alcuni dati dello spazio utente, direttamente per fare riferimento ai dati?
Oppure devo prima richiamare kmap
per mappare il frame di pagina fisico contenente lo spazio di indirizzo virtuale del kernel? Perché?
Buon punto e la logica del codice è bella. Ma immagino ci sia una tabella hash o una struttura dati simile che, dato un indirizzo virtuale, ti aiuti a localizzare velocemente la pagina fisica. C'è un difetto: kaddr = __va (paddr); Questa linea funziona solo quando il paddr risiede nella memoria insufficiente, giusto? – Infinite
paddr significa indirizzo fisico, quindi, è sempre esistito in memoria. kaddr significa indirizzo del kernel. In Linux il kernel define è '#define __va (x) ((void *) ((unsigned long) (x) + PAGE_OFFSET))'. La mappatura della memoria di indirizzo del kernel non è complessa, solo un PAGE_OFFSET. (Dovrebbe essere 0xC0000000 in modalità x86). C'è un altro modo per ottenere l'indirizzo. L'applicazione userspace può accedere all'indirizzo del kernel con/proc//pagemap per ottenere informazioni sulla pagina. Se è possibile ottenere PFN, può anche ottenere l'indirizzo del kernel. –
richliu