memory-management linux-device-driver dma

memory management - Cómo obtener el tamaño de página del kernel de Linux mediante programación



memory-management linux-device-driver (7)

Esto es lo que finalmente hice:

  • Vuelva a trabajar mi módulo actual para tomar un nuevo parámetro de módulo llamado page_shift y lo use para calcular PAGE_SIZE (PAGE_SIZE = 1 << PAGE_SHIFT)
  • Se creó una envoltura del cargador de módulos que obtiene el sistema PAGE_SHIFT actual utilizando la API getconf de libc. Este contenedor hace que la página del sistema actual cambie y lo pase como un parámetro de módulo.

En este momento, el módulo se está cargando en diferentes arquitecturas con diferentes PAGE_SIZE sin ningún problema.

Estoy trabajando en un módulo de Linux para IA64. Mi problema actual es que el controlador usa las macros PAGE_SIZE y PAGE_SHIFT para la asignación de páginas dma. El problema que tengo es que la máquina que compila el controlador no es la que necesita para ejecutar el controlador. Entonces, si el PAGE_SIZE en la máquina compiladora es 2 ^ 14K y la máquina de destino es 2 ^ 16K, entonces el controlador falla.

No quiero convertir esta cuestión en una cuestión de "mejores prácticas" sobre la compilación de módulos en máquinas que no son las que ejecutan los módulos. Entiendo los problemas sobre eso. Lo que encontré es que la mayoría de las personas usa getpagesize () o sysconf (_SC_PAGE_SIZE). Estas dos opciones están fuera de los encabezados del kernel ia64, así que no puedo usarlos. ¿Hay alguna otra manera de que pueda obtener el tiempo de ejecución PAGE_SIZE?

Opciones que estoy viendo:

  • ¿Leyendo algún archivo en / proc?
  • syscall?
  • ¿Otra función que me permite calcular el PAGE_SIZE por inferencia (por ejemplo, ORDER, getpageshift, etc.)?
  • ¿Otro?

Intente utilizar la getconf , que le permitirá recuperar el tamaño de página fácilmente.

getconf PAGESIZE


Me temo que es imposible hacerlo, ya que el tamaño de la página es algo que se define como parte del kernel. El conocimiento del tamaño de la página es necesario en el caso de la cadena de herramientas que también utiliza para compilar el módulo kernel.

Por lo tanto, al menos con la arquitectura kernel actual, es imposible hacerlo.


Si está intentando construir un módulo kernel, necesitará tener al menos los encabezados del kernel configurados para el kernel en el que se ejecutará el módulo. Esos definirán las macros de tamaño de página que necesita. Si no tiene los encabezados configurados correctamente, el núcleo se negará a cargar su módulo.

Y no hay nada de malo en compilar un módulo en una máquina para que se ejecute en otra, incluso si se trata de una arquitectura diferente. Solo necesitas compilar contra la fuente de kernel correcta.


Simplemente podría ejecutar una prueba, simplemente mmap un archivo con diferentes desplazamientos y ver cuáles fallan. Sin embargo, podría ser molesto en un módulo kernel, pero tal vez haya alguna otra prueba como esa que pueda usar.


Un método aproximado es leer /proc/meminfo y verificar el tamaño /proc/meminfo (en el mío es 52544 kB a partir de ahora) y luego verificar nr_mapped en /proc/vmstat (en el mío es 131136 a partir de ahora). Finalmente PAGE_SIZE = Mapped/nr_mapped . A veces esto le da un valor preciso (como en el ejemplo actual que he citado) y, a veces, es aproximado, pero muy cercano. ¡Espero que esto ayude!


Una forma de encontrar el tamaño de página es obtenerlo desde smaps para un proceso.

Por ejemplo:

cd /proc/1 cat smaps | grep -i pagesize KernelPageSize: 4 kB MMUPageSize: 4 kB