Domanda

Sto tentando di leggere dalla memoria principale utilizzando assemblaggio Masm32 e per fare questo ho creato (come già suggerito in una risposta ad un'altra delle mie domande qui) una matrice che conterrà le posizioni di memoria notevolmente separati (al fine di evitare la lettura dalla cache). Sono riuscito a creare l'array e farlo essere letto, però, ho un problema. Questo array ho già fatto e testato è lavorare con i dati che ho dato (vale a dire i numeri) e tutto funziona. Ma ho bisogno di locazioni di memoria e non riesco a trovare da nessuna parte una mappa o riferimenti a quelli. Voglio dire, ho bisogno di qualcosa come:

my_arr db 5, 2, 8, 9, 1, 7, 3, 0, 4, 6

ma invece di usare i numeri dovrei usare le corrispondenti posizione di memoria parole riservate. Ma non riesco a trovarli = (o addirittura avere un'idea di che cosa cercare.


Modifica

Vorrei solo controllare se ho capito correttamente, poi mi dici che ho potuto (invece di utilizzare una matrice utilizzare le variabili con tutto lo spazio in mezzo per forzare la lettura dalla memoria principale destra?

È stato utile?

Soluzione

Questo è un array di byte (contigui), come lei ha detto:

my_arr db 5, 2, 8, 9, 1, 7, 3, 0, 4, 6

Questa è una variabile che occupa 10 MB (che è grande rispetto alla cache della CPU):

wasted_space BYTE 10485760 DUP(?)

Qui ci sono diverse variabili con un sacco di spazio sprecato in mezzo:

my_var_1 db 5
spacer_1 BYTE 10485760 DUP(?)
my_var_2 db 2
spacer_2 BYTE 10485760 DUP(?)
my_var_3 db 8
spacer_3 BYTE 10485760 DUP(?)
my_var_4 db 9
spacer_4 BYTE 10485760 DUP(?)
my_var_5 db 1
spacer_5 BYTE 10485760 DUP(?)
my_var_6 db 7
spacer_6 BYTE 10485760 DUP(?)
my_var_7 db 3
spacer_7 BYTE 10485760 DUP(?)
my_var_8 db 0
spacer_8 BYTE 10485760 DUP(?)
my_var_9 db 4
spacer_8 BYTE 10485760 DUP(?)
my_var_10 db 6

Questa (creazione di variabili nel proprio segmento di dati) è un modo per ottenere alcuni indirizzi di memoria dei dati (le variabili non contengono l'indirizzo ... piuttosto, le variabili sono a indirizzi).

Un altro modo per ottenere indirizzi di memoria è invocare API O / S, che assegnano memoria dall'heap e restituire l'indirizzo della memoria allocata, per esempio forse il HeapAlloc o VirtualAlloc API.


Non so il motivo per cui il vostro fare questo in ASM (se non per imparare il montaggio). Se si tratta di conoscere il caching, avrei pensato che si potesse fare altrettanto bene (e, più facilmente) utilizzando C.

In ogni caso, ho avuto curioso di caching: quanto spazio è sufficiente a causare una miss cache? Quante sono necessarie per cominciare a causare incidenti diverse variabili (dato che la cache è diviso e quindi può contenere diversi (ma solo alcuni) ampiamente distanziati cache di memoria)?

(caching) ha, nel corso degli anni, diventare un argomento complicato, a quanto pare. http://lwn.net/Articles/252125/ è un articolo collegato da Wikipedia. Questo articolo include alcuni grafici, ad esempio Figura 3.11:. Lettura sequenziale per diverse dimensioni

Altri suggerimenti

accesso alla memoria indiretta in Assemblea

Per trattare i byte nella matrice come indirizzi di memoria, è necessario caricare in un registro che può servire come un indirizzo di base, e quindi accedere alla memoria puntata dal registro:

MOV AX, [MY_ARR+3]  ; Element 3 in array, that is 9
MOV BX, [AX]        ; Read from that address

A proposito di cache

Si noti che la cache è probabilmente molto più grande di quanto l'arco di indirizzi di memoria coperto da questa matrice, in modo che tutti si adatterebbe nella cache.

Inoltre, si consideri che la cache è probabilmente associativa, il che significa che gli indirizzi molto distanti possono combaciare nella cache se non capita di essere sugli stessi (completo) linee di cache.

Per effettivamente eseguito la cache e la garanzia che si avrà per accedere direttamente alla memoria, si dovrebbe accedere (in un ciclo) una serie di locazioni di memoria consecutive più grande di cache. Cioè creare un array grande come la cache. Anche prendere in considerazione che probabilmente ci sono più livelli di cache (L1, L2, L3 e forse oltre), in modo da quanto grande è necessario essere dipende da quello della cache che si desidera overrun.


ho scritto un programma in C alla memoria il tempo e la cache accede così una volta, e con qualche calcolo statistico e il risarcimento per le spese generali misurazione del tempo (che è non trascurabile in questi brevi scale di tempo), ottenuto risultati davvero precisi ( che potrebbe essere fatto come precisa, se necessario eseguendo il test più a lungo e di attesa per la deviazione standard a scendere).

Il mio programma non è stato però il modo più efficace di fare questo, e anche non accennare molto circa l'associatività della cache (che avrei dovuto valutare che parte con la conoscenza del sistema di colorazione). Tuttavia entrambi sono stati fatti piuttosto efficiente in modo relativamente indipendente dall'architettura con alcuni trucchi pensiero-out nel SIGMETRICS 2005 opera di Larry McVoy e Carl Staelin .

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