es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

En x64, ¿cómo accede el kernel de Linux al segmento de datos? ¿Utiliza -mcmodel=large durante la compilación?

Estoy escribiendo un núcleo mínimo x86-64 desde cero y tengo algunos problemas de diseño.

A partir de los comentarios y el enlace proporcionado por stark, decidí reformular mi pregunta. Quiero tomar como ejemplo el núcleo de Linux para diseñar mi propio núcleo y me gustaría recibir algunos consejos.

Sé que cuando se compila código C++, utilizará por defecto la dirección relativa al RIP para acceder al segmento de datos del ejecutable (para todas las variables globales/estáticas). La dirección relativa al RIP está limitada a un desplazamiento de 32 bits, lo que deja un máximo de 2 GB de desplazamiento desde el segmento de código.

También sé (según el comentario de stark) que el núcleo de Linux comienza su segmento de código en 0xffffffff80000000 (https://www.kernel.org/doc/html/latest/x86/x8664/mm.html):

ffffffff80000000 | -2 GB | ffffffff9fffffff | 512 MB | mapeo de código del núcleo, mapeado a la dirección física 0

Si el segmento de código del núcleo de Linux está a más de 2 GB de distancia de la mayoría de su segmento de datos, ¿cómo accede a él de otra manera que no sea mediante la dirección relativa al RIP?

Creo que el modelo de código -mcmodel=kernel puede extender una dirección absoluta de 32 bits a 64 bits, lo que permite que el ejecutable acceda a los 2 GB superiores del espacio de dirección virtual sin usar -mcmodel=large. Eso no ayuda, ya que el segmento de datos del núcleo no se encuentra en esa región. Mientras tanto, el -mcmodel=large hace que el ejecutable acceda al segmento de datos con una dirección absoluta de 64 bits, lo que ralentiza el núcleo y lo hace mucho más grande.

¿Cómo accede el núcleo de Linux al segmento de datos y utiliza un modelo de código grande para acceder a la región 0xffff80000000_0000 del espacio de dirección virtual?

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Como experto en tecnología de la información especializado en Linux, gestión de memoria, núcleo de Linux y desarrollo de sistemas operativos, puedo proporcionar una visión sobre el diseño de un núcleo mínimo x86-64.

    Para responder a la pregunta, el núcleo de Linux utiliza una combinación de técnicas para acceder a su segmento de datos, el cual puede estar ubicado más allá del límite de 2 GB de direccionamiento relativo a RIP. Una de esas técnicas es utilizar un modelo de código amplio, que permite el direccionamiento absoluto de 64 bits de segmentos de datos, pero como se menciona en la pregunta original, esto puede ralentizar el núcleo y aumentar su tamaño.

    Otra técnica utilizada por el núcleo de Linux es mapear el segmento de datos en una región del espacio de direcciones que se puede acceder mediante direccionamiento relativo a RIP. Esta técnica implica configurar tablas de páginas y mapear el segmento de datos en una región del espacio de direcciones lo suficientemente cercana al segmento de código como para poder acceder mediante direccionamiento relativo a RIP.

    En general, el diseño de un núcleo mínimo x86-64 dependerá de los requisitos y limitaciones específicas del proyecto. Puede ser necesario utilizar una combinación de técnicas para acceder a segmentos de datos más allá del límite de 2 GB de direccionamiento relativo a RIP, al mismo tiempo que se minimiza el tamaño y el impacto en el rendimiento del núcleo.

Comments are closed.