Quali sono gli indirizzi di memoria? [chiuso]

3

Ho più o meno 0 conoscenze in argomenti di basso livello, quindi perdona la mia possibile ignoranza.

So che in linguaggi come C, i puntatori contengono "indirizzi di memoria", cioè stringhe (o dati binari?) scritti in esadecimale come 0x52A132F3 .

A giudicare dal termine "indirizzo di memoria", presumo che questo numero porti effettivamente a qualche posto in memoria. Ma sto facendo fatica a capire che cos'è un "posto nella memoria" e come un numero esadecimale può "guidarci". (Un programmatore Java qui ..)

Quindi due domande:

  1. Gli indirizzi di memoria puntano a punti della CPU stessa o in qualsiasi parte del computer?
  2. La memoria 'ordinata' nell'hardware in qualche modo ha senso riferirsi ad essa usando un numero 'ordinale', come 0x52A132F3 ? Come viene ordinata la memoria nell'hardware e come e perché ha senso accedervi utilizzando un valore numerico?
posta Aviv Cohn 04.09.2014 - 17:58
fonte

6 risposte

2

Mentre i puntatori fanno spesso riferimento agli indirizzi di memoria, il concetto stesso è separato. Mi concentrerò sul sottostante concetto di "basso livello" degli indirizzi di memoria, poiché è quello che sembra chiedere.

Do the memory addresses point to places on the CPU itself, or anywhere in the computer?

Anche se il termine memoria address può riferirsi a una parte della memoria interna della CPU, in questo caso no.

Questi indirizzi si riferiscono alla "memoria" comune del computer, che di solito è la RAM, ma nei moderni sistemi operativi, può essere sottratta alla memoria fisica o alla memoria virtuale che in realtà va altrove. Occasionalmente vedrai anche gli indirizzi di memoria che si riferiscono alla memoria spenta su una scheda video o altro hardware.

Is memory 'ordered' in hardware in some way that it makes sense to refer to it using an 'ordinal' number, such as 0x52A132F3?

Sì.

Anche se la memoria non è strettamente contigua (vedi la memoria fisica / virtuale sopra, oltre ai diversi chip della RAM), l'hardware e il sistema operativo lo astraggono in qualcosa che assomiglia a un nastro infinitamente lungo . Quella quindi è una memoria ordinata che è indirizzabile linearmente.

Ogni indirizzo avrà quindi una certa quantità di dati che può memorizzare (un byte è comune, ma non universale!). Ovviamente, diversi schemi di indirizzamento sono possibili, ma sarebbero inefficienti poiché i computer sono veramente bravi a fare calcoli matematici interi.

    
risposta data 04.09.2014 - 18:07
fonte
10

Sulla tua scheda madre, hai una CPU e una manciata di cavi (chiamati bus) che vanno nella tua RAM, che viene fornita separatamente su stick che sono relativamente facili da sostituire. Puoi pensare all'indirizzo di memoria come a 32 di questi fili. 0x52A132F3 si traduce in 01010010101000010011001011110011 in binario. Ogni 1 significa che la CPU mette una tensione (1,5 volt per DDR3) sul filo corrispondente, che indica al chip RAM quale memoria inviare alla CPU.

Questa è una semplificazione eccessiva a causa di cose come la cache e le pagine di memoria virtuale, e i sistemi potrebbero supportare più o meno di 4 GB di RAM, e quindi avere più o meno fili di indirizzo, ma è un modello utile su come pensare agli indirizzi di memoria e i sistemi embedded più semplici funzionano in questo modo.

È utilizzato l'esadecimale perché per un numero a 32 bit è sempre composto da 8 cifre, compresi eventualmente zero iniziali. È anche facile convertire in binario. Inoltre, puoi scrivere indirizzi interessanti come 0xDEADBEEF o 0xABBACAFE , che a volte sono utili per il debug. Per lo più si può pensare ad esso come un indice in una matrice molto ampia di tutta la memoria del proprio sistema.

    
risposta data 04.09.2014 - 18:51
fonte
5

In primo luogo, che un puntatore contiene un indirizzo di memoria è un dettaglio di implementazione. Questo non è il modo in cui è definito nello standard. Lo standard funziona molto, molto per essere vago per quanto riguarda l'hardware in modo che C possa funzionare sulle architetture più strane e più esotiche in circolazione. Ad esempio, non puoi assumere che due puntatori di tipi diversi abbiano la stessa rappresentazione (eccetto per char* e void* ), o che i puntatori agli oggetti abbiano la stessa rappresentazione dei puntatori alle funzioni.

Per rispondere alla tua domanda attuale:

  1. Gli indirizzi di memoria puntano ai posti in memoria. La memoria è esterna alla CPU. *
  2. Un processo considera la memoria come una sequenza continua di unità indirizzabili (in genere byte da 8 bit). Quindi, sì, puoi confrontare gli indirizzi di memoria. Come nota a margine, a meno che non stiate correndo su bare metal, il fatto che un processo abbia un segmento di memoria continuo con cui lavorare è solo un'illusione fornita dal sistema operativo. In realtà, la memoria che un processo vede è mappata a diversi intervalli di memoria hardware e potenzialmente spazio su disco. In altre parole, l'indirizzo di memoria 1 per un processo non si associa necessariamente all'indirizzo hardware 1. Non è necessario preoccuparsi di questo a meno che non si voglia sapere come funzionano i sistemi operativi.

In breve, basti pensare alla memoria come a una matrice di byte ea un indirizzo di memoria come indice in quella matrice.

* Sì, so che le CPU hanno cache.

    
risposta data 04.09.2014 - 18:04
fonte
1

Vorrei mettere questo in analogia più semplice. Se mandi una lettera, metti un indirizzo in busta e lo metti nella casella postale. Ma come va effettivamente nello specifico indirizzo? Il PostMan (o il fattorino) in realtà sa quale posizione fisica si rivolge a quelle poche righe sopra la busta (supponendo che tu non abbia visitato personalmente la posizione)

La CPU funziona allo stesso modo e utilizza l'indirizzo di memoria per inserire i dati che deve elaborare. Qui la memoria si riferisce alla RAM (la CPU di memoria si riferisce all'elaborazione dei dati). La CPU ha anche la memoria in sé chiamata Registri che utilizza per l'elaborazione. E sì, l'indirizzo di memoria è ordinato e questo è il motivo per cui la CPU può accedervi in modo casuale usando l'indirizzo di memoria e non scorrere o andare uno alla volta per ottenere un oggetto in memoria.

    
risposta data 04.09.2014 - 18:16
fonte
1

1. Do the memory addresses point to places on the CPU itself, or anywhere in the computer?

No. Su tutti i sistemi operativi moderni, vengono utilizzati spazi di indirizzi virtuali . Ogni programma ha il proprio spazio di indirizzamento. I valori del puntatore sono indirizzi in questo spazio indirizzo. Gli indirizzi in questo spazio indirizzo sono mappati alla memoria fisica dal gestore della memoria OS.

Questa mappatura è sparsa: solo gli indirizzi necessari sono mappati. Inoltre, alcuni indirizzi non possono essere associati alla memoria fisica (si pensi all'errore di segmentazione o all'errore di protezione generale).

Questa mappatura è volatile: lo stesso indirizzo può puntare a diverse parti della memoria fisica in momenti diversi.

2. Is memory 'ordered' in hardware in some way that it makes sense to refer to it using an 'ordinal' number, such as 0x52A132F3?

Non in un modo su cui un programma può fare affidamento. Il gestore della memoria può mappare questi indirizzi nel modo che ritiene opportuno (vedi: Memoria virtuale ).

How is memory ordered in hardware,

Diversi computer configureranno la memoria fisica in modi diversi. L'installazione deve solo avere senso per il gestore della memoria.

and how and why does it make sense to access it using a numerical value?

I valori numerici usati dagli indirizzi rendono le cose più facili. Pensa agli array, usando un indirizzo numerico, è facile cercare il valore in un particolare indice semplicemente aggiungendo l'indirizzo di base e l'indice (che è il motivo per cui la maggior parte delle lingue ha matrici che iniziano a 0).

Questo indirizzo base più il calcolo dell'indice è chiamato compensazione. La compensazione è utilizzata per estrarre i campi da una struttura, ottenere i valori dei parametri delle funzioni, il looping, la ramificazione e molto altro ancora. Ho difficoltà a immaginare come si farebbe il calcolo senza indirizzi numerici.

    
risposta data 04.09.2014 - 21:21
fonte
1

spedire una lettera è di gran lunga il modo migliore per descriverlo, hai un nome, un numero, una strada, una città, un codice postale, forse un numero di suite o altro a seconda di dove vivi.

La lettera lascia la tua casa con tutte queste informazioni su di esso e gli uffici postali selezionano questi articoli prima di lasciare la tua casa, poi qualche ispezione di primo livello per capire che sta lasciando questo ufficio postale, sta lasciando questa città, ecc. . una serie di decisioni e ordinamenti lungo la strada per arrivare alla persona postale per quella strada / area e lo ordinano per casa poi consegnarlo.

Il processore e il programmatore (indirettamente ma con una notevole quantità di aiuto dal sistema operativo) sei a casa tua, hai del materiale di riferimento (la tua rubrica) di indirizzi alle cose (beh, diciamo il sistema operativo non necessariamente te) alcune di queste cose sono solo alcune delle periferiche o dei registri di controllo e di stato, ecc. c'è qualche limite nel processore o all'esterno dove questo spazio di indirizzamento flatish vive, quel confine è il tuo cortile tra casa tua e la tua casella di posta sul marciapiede. l'indirizzo viene gettato su questo bus e poi il postino prende il sopravvento, gli strati di logica selezionano l'indirizzo per determinare dove è necessario tornare nel chip o nelle periferiche o nella memoria sulla scheda.

Quindi in generale un indirizzo si può indicare cose nella CPU e cose al di fuori della CPU. I progettisti di hardware generalmente non amano rendere il lavoro eccessivamente difficile, quindi di solito uno o più blocchi consecutivi nell'indirizzo vengono utilizzati per instradare la transazione. alcuni bit alti potrebbero determinare su chip o off per esempio e poi alcuni bit successivi potrebbero determinare il ram dalle periferiche, e poi, una volta instradato a un periperhal, alcuni bit in più potrebbero determinare dove si trova nella periferica. ci sono anche lacune in genere su un lspci e guardiamo gli intervalli di indirizzi, solo perché una periferica vuole 32 MB non significa che abbia 32 MB di cose singole con cui parlare, è solo una buona potenza di 2 per la logica prendere decisioni su una volta a le periferiche possono essere sprecate se scelgono con quei bit di accedere a un piccolo numero di cose o efficienti.

di nuovo il sistema operativo, stratificato a sua volta, ha direttamente o indirettamente la conoscenza di quella scheda e processore e generalmente lo nasconde da te, normalmente non fai semplicemente un registro uart, ma chiama una funzione a livello dell'applicazione che chiama il kernel funzioni che poi arrivano a quei registri che fanno muovere i segnali sull'interfaccia o su qualsiasi interfaccia. mmus se hai un indirizzo di virtualizzazione in modo che la tua applicazione o ogni applicazione possa sembrare che inizi su un indirizzo come 0x0000 e abbia da 0x000 a N byte di memoria in modo tale che tutti i programmi possano essere compilati nello stesso modo ma una traduzione in hardware e il software (sistema operativo) converte il tuo indirizzo 0x1234 in un altro indirizzo prima che raggiunga quel limite magico dove lascia la casa e colpisce la casella di posta nel dominio dell'ufficio postale dove seguono semplicemente le regole per la consegna allo stesso modo ogni volta (hardware).

    
risposta data 05.09.2014 - 06:15
fonte

Leggi altre domande sui tag