Quale valore ha il byte puntato dal puntatore nullo?

1

So che tanto tempo fa gli informatici decisero di trattare tutti i puntatori alla cella di memoria dell'indirizzo 0 come NULL. Tuttavia, la cella di memoria a quell'indirizzo esiste dopotutto, giusto? In tal caso, quale valore viene memorizzato lì? Dal momento che è il sistema operativo che decide come allocare la memoria dovrebbe essere in grado di accedere (e modificare) il valore di tutte le celle nella RAM, incluso quello dell'indice 0, giusto?

modifica: Sì, ho già visto questa domanda. Il fatto è che in realtà non chiedo dove puntare il puntatore NULL. È più un'estensione della domanda precedente, in quanto voglio sapere qual è il valore byte di quella cella di memoria o da cosa dipende.

    
posta alagris 09.12.2016 - 20:08
fonte

3 risposte

3

L'indirizzo fisico 0 corrisponde in effetti in generale a una posizione di memoria in cui è memorizzato un valore. Il valore è tuttavia dipendente dal sistema e dall'ambiente:

  • se l'hardware associa questo indirizzo a qualche chip ROM, il valore è ovviamente fisso.
  • se è RAM, all'accensione il contenuto è imprevedibile e dovresti considerarlo casuale. Tuttavia non è davvero casuale: potrebbe contenere un valore precedentemente memorizzato. Questa proprietà viene utilizzata negli attacchi di avvio a freddo .
  • Il BIOS / UEFI / OS potrebbe cancellarlo a 0 all'avvio . Alcuni processi potrebbero memorizzare la loro variabile lì.

Ma oggigiorno, la maggior parte della CPU e dei sistemi operativi utilizzano memoria virtuale . In tale schema, ogni processo vede solo uno spazio di indirizzi virtuale. Questo spazio è organizzato in "pagine" (blocchi di memoria contigua) che sono mappate all'indirizzo fisico, non mappate e / o scambiate su spazio su disco da un gestore di pagine.

Quindi l'indirizzo N di un processo non sarà l'indirizzo N di un altro processo. In particolare, l'indirizzo virtuale 0 potrebbe non essere l'indirizzo fisico 0. Potrebbe benissimo rimanere non mappato, causando un'eccezione hardware (errore di pagina) per ogni tentativo di accesso (più spiegazioni qui ).

    
risposta data 09.12.2016 - 22:09
fonte
5

Questo dipende solo dall'hardware. L'indirizzo 0 sarà valido in un numero piuttosto elevato di processori. È un indirizzo come qualsiasi altro indirizzo. Quindi, se la tua CPU solleverà un'eccezione all'accesso all'indirizzo 0 dipende solo. Ho appena controllato con il 6502 (che è ancora usato nelle lavatrici) dove la zero-page è un banco di registro extra. Altri processori mappano questa pagina ai registri I / O.

È interessante notare che l'idea di utilizzare trappole hardware per il riconoscimento del puntatore 0 sembra essere un'idea piuttosto "nuova": vedi Carta ACM

    
risposta data 09.12.2016 - 20:44
fonte
4

I know that long time ago computer scientists decided to treat all pointers to memory cell of address 0 as NULL.

Un po ', e praticamente, si. Tuttavia, tornando al linguaggio C, nei giorni di yore, il numero letterale 0 viene considerato come il valore null in un contesto puntatore. Tuttavia, lo standard non richiede che null abbia un valore di pattern di bit di tutti gli zeri. Ad esempio, potrebbe essere una scelta di implementazione, essere invece -1 (lo schema di bit di tutti). Tuttavia, nel corso degli anni, gli implementatori hanno definito il modello di bit di tutti gli zeri per indicare null .

However, the memory cell at that address does exists after all, right? In that case, what value is stored there? Since it's OS that decides how to allocate memory it should be able to access (and modify) value of all cells in the RAM, including the one of index 0, right?

Dovresti decidere in quale contesto ti stai chiedendo: direttamente sul processore o in un processo su un sistema operativo.

Su un controller / processore embedded, potresti non avere un sistema operativo con memoria virtuale. Inoltre, è comune che i microprocessori non solo abbiano memoria a zero (e / o in highmem) che si riferisce a dispositivi I / O, o è altrimenti speciale piuttosto che vera memoria, sebbene la memoria vera sia anche comunemente trovata all'indirizzo zero . Quindi, in questo ambiente, zero esiste come indirizzo e può essere o non essere speciale per il processore in qualche modo.

Per un processo in esecuzione all'interno di un sistema operativo che offre memoria virtuale, i sistemi operativi moderni spesso scelgono di mappare un numero di pagine intorno allo zero in modo efficace a undefined, quindi semplicemente non c'è alcuna memoria reale all'indirizzo zero. Una richiesta di accesso alla memoria a zero provocherà un errore (come un errore di segmentazione).

D'altro canto, alcuni sistemi operativi forniranno pagine di zero di sola lettura e permetteranno letture a zero o intorno a zero, mentre solo errori su scritture a zero.

    
risposta data 09.12.2016 - 21:00
fonte

Leggi altre domande sui tag