2010-05-27 13 views
8

Tengo una gran cantidad de código en una biblioteca compartida ELF que solo se utiliza durante la inicialización de la biblioteca (se llama desde inicializadores estáticos). Si coloco este código en su propia sección (o tal vez puede ir en la sección .init), lo que puedo hacer usando __attribute__((section(".mysection"))), ¿hay alguna manera de forzar esta página a ser paginada después de que la biblioteca se haya cargado?Sección Flush ELF de la RAM después de la inicialización de la biblioteca

This question está relacionado, pero se llegó a la conclusión de que el kernel desplegará páginas no utilizadas cuando no tenga suficiente memoria, por lo que no es necesario hacerlo explícitamente. Sin embargo, estoy trabajando en un entorno integrado donde la memoria es escasa y el costo de paginación en el código del disco (una unidad flash USB lenta) es alto. Por lo tanto, prefiero enjuagar este código de forma explícita, que sé que nunca volverá a usarse, en lugar de que el kernel decida enjuagar algún otro código que eventualmente necesite ser devuelto.

Estoy Seguro que recuerdo haber leído sobre un syscall para pedirle al núcleo que entre o salga de ciertas regiones de la memoria, aunque no puedo encontrar ninguna referencia a esto en ninguna parte, así que tal vez lo imaginé. ¿Existe tal cosa?

+0

El syscall 'madvise', en particular con el parámetro MADV_WILLNEED/MADV_DONTNEED, es en lo que estaba pensando. Sin embargo, todavía estoy interesado en saber si hay una manera fácil de forzar el desplazamiento de una sección ELF en particular. – jchl

Respuesta

2

Busque documentación sobre superposiciones de duendes. Organice su código para que tenga una superposición para la inicialización y otra para el procesamiento. Es posible que también desee ver una superposición para el apagado. El código en las superposiciones debe reemplazarse cuando se llame a la siguiente superposición.

+2

Curiosamente, esta página es ahora el principal resultado de búsqueda de Google para "superposiciones de elfos". – jchl

+0

No encuentro mucha información sobre superposiciones ELF. Lo mejor que pude encontrar fue http://sourceware.org/binutils/docs-2.20/ld/Overlay-Description.html, que no es particularmente útil fuera de contexto. ¿Podría elaborar o proporcionar algunos enlaces a la documentación relevante, en particular en relación con el uso de superposiciones con bibliotecas compartidas? Además, no estoy seguro de que las superposiciones funcionen para mí, ya que el código de inicialización necesita acceso a todos los demás códigos de la biblioteca. – jchl

+0

En el peor de los casos, ¿podría tener una micro superposición para el primer código post-init? –

Cuestiones relacionadas