-----BEGIN PGP SIGNED MESSAGE----- Hash: SHA1 El 2010-02-03 a las 13:24 +0100, Angel Alvarez escribió:
El Miércoles, 3 de Febrero de 2010 12:15:46 Camaleón escribió:
teneis razón ambos a la vez
si estás en modo kernel puedes "acceder" a mas memoria
- tocando la MMU
"x86 processor hardware architecture is augmented with additional address lines used to select the additional memory, so physical address size is increased from 32 bits to 36 bits. This, theoretically, increases maximum physical memory size from 4 GB to 64 GB. The 32-bit size of the virtual address is not changed, so regular application software continues to use instructions with 32-bit addresses and (in a flat memory model) is limited to 4 gigabytes of virtual address space. The operating system uses page tables to map this 4 GB address space into the 64 GB of physical memory. The mapping is typically applied differently for each process. In this way, the extra memory is useful even though no single regular application can access it all simultaneously."
luego cada proceso direcciona max 4GB pero el kernel puede acceder a mas memoria 46GB porque hay dos bits mas disponible.
Claro.
como puede acceder cada proceso a esa memoria extra?
pidiendole al kernel que le mapée dentro de sus espacion direccionable de 32bits
esto es AWE, o mmap
Exacto.
Tu produces una direccion de 32bits y la MMU la traduce a 32 bits
con PAE
Tu produces una direccion de 32 bits y la MMU la traduce a 36 bits.
se ve bien en los graficos de la wikipedia:
http://en.wikipedia.org/wiki/Physical_Address_Extension
Asi el proceso sigue pensando en 32bits y sigue constreñido a "direccionar" max 4 GB pero puede "acceder" a más.
Pues claro. O sea, puedes hacer un array de 4GiB (2GiB en C, en mis pruebas, por el signo del indice del array, me supongo), y nada más. Podrías, eso sí, posicionar el array más abajo o arriba de un trozo de memoria (externo al programa) de más de 4GiB, mediante alguna llamada al kernel. Son trucos, porque al fin y al cabo, el array manejable por el código tiene el tamaño limitado a 32 bits de direccion. Que es lo que llevo diciendo todo el tiempo.
Lo que yo decia que viene siendo la versión modena de EMS o XMS.
Exacto.
No hace falta programar para saber eso. Cuando yo era becario habia que lidiar con el EMM386.exe y el HIMEM.sys y por tanto saber que que iba la vaina para recolocar cosas del DOS en esas partes.
Claro. Pero si sabes programar, si has estudiado algo de arquitectura de procesadores, sabes perfectamente de lo que hablamos y de porqué, con pae o sin el, tienes unos límites, y lo que supone. Que hay unos trucos para superar los limites, pero que eso no hace que puedas aumentar el tamaño de las variables o sus indices. Es como el "pan & scan" en el cine. Bueno, si programas en cosas de muy alto nivel no lo ves :-p
¿No os acordais que QEMM-386?
Yo si. Creo que hasta lo he usado. Tuve que programar una aplicación que llamaba a otros módulos de la misma como programas independientes, volcandose en disco a si misma y llamando a otra aplicación. La mejora era volcar en memoria "superior" en vez de en disco, lo cual era mucho más rápido. O las librerías que te permitían almacenar algunos datos por encima del límite de "un mega". Tu programa sólo podía leer en el mega de abajo, pero podías traerte o mapear una variable de arriba a abajo para poder leerla. O tempora.
http://en.wikipedia.org/wiki/QEMM
Sed buenos..
- -- Saludos Carlos E. R. -----BEGIN PGP SIGNATURE----- Version: GnuPG v2.0.9 (GNU/Linux) iEYEARECAAYFAktqJjsACgkQtTMYHG2NR9XBoACfcE/JG4cD/aFRCKNKMU7WH7sU F/8An0khJ4WQuDodCetqKxNAWKLRJNTh =FiG+ -----END PGP SIGNATURE-----