Che cosa implica l'uso del puntatore nel kernel di Linux?

1

Finora ero sotto la prospettiva che mentre lavoravo nel codice del kernel, lavorare con la memoria implica lavorare con long integers e non con puntatori perché i puntatori di dereferenziazione non dovrebbero essere fatti nel codice del kernel:

Una citazione sull'argomento da LDD3 :

Although, conceptually, addresses are pointers, memory administration is often better accomplished by using an unsigned integer type; the kernel treats physical memory like a huge array, and a memory address is just an indexinto the array. Furthermore, a pointer is easily dereferenced; when dealing directly with memory addresses, you almost never want to dereference them in this manner. Using an integer type prevents this dereferencing, thus avoiding bugs. Therefore, generic memory addresses in the kernel are usually unsigned long , exploiting the fact that pointers and long integers are always the same size, at least on all the platforms currently supported by Linux.

Tuttavia, vedo che ci sono dei puntatori ( fonte )

char *hwbuf = runtime->dma_area + frames_to_bytes(runtime, hwoff);

E ho successo nel dereferenziarli e ottenere risultati attesi:

printk(KERN_INFO "%s:%i  %x \n", __FILE__, __LINE__,*hwbuf);

Domande:

  1. Quale indirizzo di memoria viene assegnato quando char *hwbuf s viene eseguito il kernel? Quando dico "che memoria" intendo se l'indirizzo è un vero indirizzo fisico nella RAM o qualcos'altro?
  2. È ragionevole che diverse parti del kernel agiscano in modo diverso sulla dereferenziazione del puntatore data la relazione che il codice ha sull'inizializzazione della MMU? Con questo voglio dire che il codice del kernel precedente riguarda gli indirizzi fisici, il codice del driver tratta qualche forma di indirizzo virtuale?
  3. Quali sono le basi per i puntatori non dereferenziati nel codice del kernel?
posta TheMeaningfulEngineer 24.07.2015 - 09:04
fonte

1 risposta

6

C'è una differenza fondamentale tra la gestione della memoria come risorsa (quando non ti interessa cosa c'è dentro e non dovresti nemmeno guardare), e usare la memoria per fare qualcos'altro (quando il contenuto è l'intero punto).

... memory administration is often better accomplished ...

La citazione sta parlando della gestione degli indirizzi e delle mappe della memoria, dove stai trattando la memoria come una risorsa opaca da gestire .

Il codice che hai postato non sta gestendo la memoria come risorsa, sta usando della memoria per fare cose non relative alla gestione della memoria (in particolare DMA a un dispositivo audio).

    
risposta data 24.07.2015 - 12:39
fonte

Leggi altre domande sui tag