Es porque esa región de memoria no aparece como asignada por el proceso.
Básicamente vmmap
recorre una lista de regiones de memoria virtual asignadas por el proceso y las muestra en un formato legible. Como no muestra la __PAGEZERO
región - es porque no está en la lista.
Puede confirmar que no se trata de un error en vmmap
o un cambio en la forma de producir las asignaciones, enumerando las regiones con una herramienta diferente. Por ejemplo, utilice Instruments.app
desde Xcode, añada el VM Tracker
de la Biblioteca y verás que muestra la misma lista de regiones.
El objetivo de la __PAGEZERO
era que los procesos listaran una porción de memoria al principio del espacio de direcciones como "fuera de límites". Es decir, son direcciones de memoria que no pueden ser leídas ni escritas durante la ejecución del proceso. Tradicionalmente, se quería custodiar un poco de espacio de memoria alrededor del puntero NULL (dirección 0), para que los bugs que provocaban lecturas o escrituras del puntero NULL terminaran el programa en lugar de modificar el estado importante.
Más tarde, con la introducción del espacio de direcciones de 64 bits, era común tener un __PAGEZERO
bloqueando todos los accesos a las direcciones 0x0 a 0x100000000. La razón es que bloquea el acceso a todas las direcciones que un puntero de 32 bits puede expresar. A menudo los programas se escriben originalmente para un entorno de 32 bits y luego se portan a un entorno de 64 bits. Si el programador no fue cuidadoso, es posible hacer conversiones de datos en los punteros que efectivamente los restringen a 32-bits.
En un sistema de 32 bits eso es "seguro" en el sentido de que no daña nada en la práctica. Sin embargo, cuando el mismo código se ejecuta en un sistema de 64 bits, esto significa que el programa intentaría acceder a una parte de la memoria completamente diferente a la prevista. Por lo tanto, __PAGEZERO
se extendió para bloquear todos los punteros de 32 bits para evitar que errores como estos corrompan la memoria y, en su lugar, hacerlos muy visibles como fallos del programa.
Tenga en cuenta que algunos programas no tenían la gran __PAGEZERO
ya que, por ejemplo, los programas de 32 bits no funcionarían con dicha región (obviamente). Del mismo modo, para algunos programas de 64 bits, sería una opción dejarla fuera en ciertas situaciones especiales - por ejemplo un programa como Wine que esencialmente podría ejecutar aplicaciones de 32 bits dentro de un entorno de 64 bits.
Actualmente, en los sistemas MacOS más recientes, los programas de 32 bits ya no son compatibles. Por lo tanto, el kernel es libre de imponer el llamado "hard pagezero", lo que significa que este gran espacio de direcciones está siempre bloqueado para todos los programas en ejecución. No importa si el programa realmente especifica tal región o no, todos los programas obtienen la protección que viene con ella. Esto es posible desde que los programas de 32 bits ya no son soportados y no se permite su ejecución.
Como la página cero dura es ahora aplicada directamente por el núcleo para los procesos ordinarios del espacio de usuario, ya no es necesario incluirla explícitamente en las listas de regiones de memoria. Por eso ya no se imprime por una herramienta como vmmap
.