Pregunta

Estoy intentando leer desde la memoria principal usando el montaje masm32 y con el fin de hacer esto que he creado (según lo recomendado previamente en una respuesta a otra de mis preguntas aquí) una matriz que contenga las posiciones de memoria en gran medida separadas (con el fin de evitar la lectura de la memoria caché). He conseguido crear la matriz y haga que la lectura inicial, sin embargo, tengo un problema. Esta matriz ya lo he hecho y probado es el trabajo con datos lo di (es decir, los números) y todo funciona. Pero necesito posiciones de memoria y no puedo encontrar en cualquier lugar de un mapa o referencias a ellos. Quiero decir que necesito algo como:

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

pero en lugar de utilizar números que debería usar las palabras reservadas correspondientes localizaciones de memoria. Pero no puedo encontrarlos = (o incluso tener una idea de qué otra cosa que buscar.


Editar

Me dejaron de comprobar si lo tengo correctamente, entonces me dice que podría (en lugar de utilizar una gran variedad utilizar las variables con todo el espacio en el medio para forzar la lectura de la memoria principal derecho?

¿Fue útil?

Solución

Esta es una matriz de bytes (contiguos), como usted ha dicho:

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

Esta es una variable que ocupa 10 MB (que es grande en relación con la memoria caché de CPU):

wasted_space BYTE 10485760 DUP(?)

Aquí hay varias variables con una gran cantidad de espacio desperdiciado en el medio:

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

Esto (la creación de variables en el segmento de datos) es una manera de conseguir algunas direcciones de memoria de datos (las variables no contienen la dirección ... más bien, son las variables en las direcciones).

Otra forma de obtener las direcciones de memoria es invocar O / API de S, que asignan memoria del montón y devolver la dirección de esa memoria asignada, por ejemplo tal vez el HeapAlloc o VirtualAlloc APIs.


No sé por qué estás haciendo esto en ASM (excepto para aprender ensamblador). Si se trata de aprender sobre el almacenamiento en caché, habría pensado que podría hacerlo igual de bien (y, con mayor facilidad) usando C.

De todos modos, tengo curiosidad por el almacenamiento en caché: la cantidad de espacio es suficiente para causar un fallo de caché? ¿Cuántos son necesarios para comenzar a causar fallos diferentes variables (dado que la memoria caché se divide y por lo que puede contener varios (pero sólo unos pocos) ampliamente espaciados cachés de memoria)?

(caching), a lo largo de los años, convertido en un tema complicado, por lo visto. http://lwn.net/Articles/252125/ es un artículo enlazado de Wikipedia. Este artículo incluye algunos gráficos, por ejemplo Figura 3.11:. Lectura secuencial para varios tamaños

Otros consejos

acceso a la memoria indirecta en la Asamblea

Para el tratamiento de los bytes de la matriz como direcciones de memoria, tendrá que cargar en un registro que puede servir como una dirección base, y luego acceder a la memoria apuntada por el registro:

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

Acerca de las memorias caché

Tenga en cuenta que la memoria caché es probablemente mucho más grande que el espacio de direcciones de memoria se refiere la presente matriz, por lo que todo encajaría en la memoria caché.

Además, considere que su caché asociativa es, probablemente, lo que significa que las direcciones muy distantes pueden encajar en la caché si no resultan ser en las mismas líneas de caché (completos).

Para ejecutar realmente la memoria caché y garantía de que tendrá que acceder a la memoria directamente, debe tener acceso (en un bucle) un conjunto de posiciones de memoria consecutivas más grande que su caché. Es decir. crear una matriz tan grande como la memoria caché. También tienen en cuenta que es probable que haya múltiples capas de caché (L1, L2, L3 y posiblemente más), por lo que tan grande tiene que ser depende de lo caché desea invadido.


he escrito un programa en C a la memoria el tiempo y la memoria caché accesos al igual que una vez, y con un poco de cálculo estadístico y la compensación por los gastos indirectos de medición de tiempo (que no es despreciable en tales escalas de tiempo cortos), dieron resultados muy precisos ( que podría ser hecho tan precisa como sea necesario mediante la ejecución de la prueba durante más tiempo y esperar a que la desviación estándar para ir hacia abajo).

Mi programa sin embargo, no era la forma más eficiente de hacer eso, y tampoco insinuar mucho acerca de la asociatividad de la memoria caché (que tendría que medir por separado con el conocimiento del esquema de colores). Sin embargo, ambos se hicieron con bastante eficiencia de una manera relativamente independiente de la arquitectura con algunos trucos de pensamiento de ejercicio en el Sigmetrics 2005 obra de Larry McVoy y Carl Staelin .

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top