2 votos

¿Por qué falta __PAGEZERO en la salida de vmmap en Darwin 21.2.0?

Cuando corro vmmap para un proceso las regiones comienzan con el __TEXT entrada en lugar de __PAGEZERO como en muestra de salida en la documentación

otool -l también muestra

Load command 0
      cmd LC_SEGMENT_64
  cmdsize 72
  segname __PAGEZERO
   vmaddr 0x0000000000000000
   vmsize 0x0000000100000000
  fileoff 0
 filesize 0
  maxprot 0x00000000
 initprot 0x00000000
   nsects 0
    flags 0x0

uname -mrsvp es la salida:

Darwin 21.2.0 Darwin Kernel Version 21.2.0: Sun Nov 28 20:28:54 PST 2021; root:xnu-8019.61.5~1/RELEASE_X86_64 x86_64 i386

¿Por qué es así?

2voto

Jose Chavez Puntos 645

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 .

AppleAyuda.com

AppleAyuda es una comunidad de usuarios de los productos de Apple en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X