2011-12-12 29 views
7

Linux es el sistema operativo y ARM es el procesador al que se hace referencia en este contexto.Memoria del kernel (entradas de direcciones virtuales) en TLB?

¿El TLB contiene direcciones virtuales tanto del núcleo como del espacio de usuario? La memoria del núcleo comienza en 0xc000_0000 y va a 0xFFFF_FFFF donde los primeros 3 GB pertenecen al espacio de usuario. Entre el cambio de contexto entre procesos, el TLB se vacía.

¿El TLB contiene direcciones virtuales tanto del núcleo como del espacio de usuario?

La memoria del kernel (virtual) se corresponde directamente con la memoria física (simplemente compensar con 0xC000_0000 nos dará la dirección física). ¿Es necesario tener memoria kernel (virtual) en TLB (si dices que está presente en TLB)? Solo debe tener presente la dirección de espacio del usuario.

Respuesta

7

La razón principal por la que tenemos virtual para la traducción de direcciones físicas en las CPU moderna es hacer un uso más eficiente y mejor controlada de la memoria que nos permite:

  1. asigna memoria física, memoria RAM, (contiguo o no) y hacer que sea accesible en cualquier lugar del espacio de direcciones virtuales (contiguamente o no), sin desperdiciar memoria en la fragmentación.
  2. Extienda la memoria física, la RAM, con el disco u otras memorias.
  3. Asegúrese de que ciertas partes del espacio de direcciones solo sean legibles o no ejecutables o solo del kernel, etc., etc. y protéjalas de accesos no autorizados o erróneos.
  4. Aísle las memorias de las aplicaciones entre sí para mejorar aún más la protección, la seguridad y la fiabilidad.
  5. Memoria compartida. ...

Y las tablas de páginas hacen que esto sea posible.

Usted también desea poder mapear y desasignar memoria física en el espacio de direcciones virtuales en el kernel y generalmente este mecanismo de traducción funciona en todo el sistema. Por supuesto, la traducción tiene un precio ya que ahora necesita consultar y mantener las tablas de páginas y eso genera un impacto en el rendimiento. Pero no todo está perdido:

  1. Los TLB alivian este problema hasta cierto punto. Caché las traducciones
  2. Las páginas más grandes (por ejemplo, ARMv7-A's large pages y sections) ayudan más ya que necesitan menos entradas de TLB por unidad de memoria traducida. También hay cosas como global pages. Cuando cambia de una aplicación a otra y necesita eliminar el TLB actual, puede evitar la invalidación de páginas globales del TLB al ejecutar Invalidate TLB entries by ASID match con la aplicación ASID. Si marcas las páginas del kernel como globales, no invalidas sus traducciones, y el kernel mismo no sufre invalidaciones de TLB innecesarias.

Véase, por ejemplo, "Manual ARM Arquitectura de Referencia ARM®v7-A y edición ARM®v7-R" para los detalles específicos relacionados con el ARM Virtual Memory System Architecture (VMSA), tablas de páginas, TLB, etc.

5

Hay dos tipos de direcciones virtuales que el núcleo Linux utiliza:

  1. Lo que ya se ha mencionado en la línea de "memoria del núcleo (virtual) directamente corresponde a la memoria física (justo compensando con 0xC000_0000 se dar dirección física de nosotros) ". Esto se asigna a direcciones físicas contiguas.
  2. Usando vmalloc.

El primero se realiza mediante una macro:

include/asm-x86/page_32.h 

#define __pa(x) ((unsigned long)(x)-PAGE_OFFSET) 
#define __va(x) ((void *)((unsigned long)(x)+PAGE_OFFSET)) 

_PA (x) hace el virtual para traducción física. Tenga en cuenta que esta traducción se realiza en línea en tiempo de compilación. No se produce una traducción de la tabla de páginas. Esta última oración es muy importante.

Por otro lado, utilizando el segundo método puede asignar memoria que es contigua en la memoria virtual, pero puede no ser así en la memoria física. Ahora, en este caso, se requiere la traducción de la tabla de página completa cuando accede a una dirección virtual por primera vez. La pregunta es ¿quién hace esto?

En el caso de las máquinas CISC (como x86), la MMU (hardware) hace eso en el caso de una falla TLB (acceso por primera vez a la dirección virtual) y actualiza la tabla de páginas. Para las direcciones virtuales del kernel (obtenidas a través de vmalloc) se mantienen como entradas TLB. Se denominan entradas globales y cuando se produce un cambio en el contexto del proceso, en su mayoría se ignoran y no se vacían como el resto de las entradas del espacio de direcciones del proceso. Sin embargo, cuando realiza un vfree para liberar la memoria virtual asociada, esas entradas se eliminan.

En el caso de una máquina RISC (como MIPS), la traducción de la página se realiza mediante software. Después de que un TLB falla, el hardware genera una excepción. Un identificador de trampa se ejecuta en modo núcleo para realizar la traducción y actualiza el TLB utilizando instrucciones especiales. Después de regresar del controlador de trampa, se ejecuta la misma línea de código y se produce un golpe de TLB.

Por favor, se refieren a: http://pages.cs.wisc.edu/~remzi/OSFEP/vm-tlbs.pdf

La línea de fondo es que no todas las direcciones del kernel se asignan de la manera que usted describe. Para su caso, las direcciones físicas se generan en tiempo de compilación en sí. Entonces, ¿por qué agregar una entrada TLB? Para las direcciones de vmalloc, las entradas de TLB están presentes. Cuando se produce un cambio de contexto entre procesos, no es necesario eliminar todo el TLB y se pueden conservar las entradas globales realizadas por vmalloc del kernel. Cuando utiliza vfree, las entradas globales correspondientes se vacían.

+0

ARM es una máquina RISC, y creo que se hace de la misma manera que se describe para MIPS. No estoy seguro sin embargo. Sin embargo, creo que su pregunta puede ser suficientemente respondida sin tener en cuenta la arquitectura del procesador. – trans1st0r

+0

Parece que [ARM hace caminatas de página de hardware] (http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.ddi0333h/I1029222.html). Además de la ventaja obvia de una sobrecarga inferior para una falla TLB, esto permite una captación previa de TLB especulativa, lo cual no es realmente factible con el manejo del software TLB-miss. También http://stackoverflow.com/questions/28019266/arm-mmu-and-arm-linux-page-table-walk. El documento de ARM que encontré mencionó algo sobre la desactivación de un bit de paseo de página, por lo que quizás ARM pueda usar caminatas de página de software, a diferencia de x86. –

Cuestiones relacionadas