Hay dos tipos de direcciones virtuales que el núcleo Linux utiliza:
- 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.
- 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.
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
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. –