Pregunta

Mi pregunta es acerca de pasar datos del kernel a un programa de espacio de usuario. Quiero implementar una llamada al sistema '' get_data (size, char * buff, char ** meta_buf) ''. En esta llamada, el programa de espacio de usuario asigna buff y su longitud se pasa en el argumento de tamaño. Sin embargo, meta_buf es un búfer de longitud variable que se asigna (en las páginas vm del programa de espacio de usuario) y se llena por el núcleo. El programa de espacio de usuario liberará esta región.

(No puedo asignar datos en el espacio de usuario ya que el programa de espacio de usuario no conoce el tamaño del meta_buff. Además, el programa de espacio de usuario no puede asignar una cantidad fija de memoria y llamar a la llamada del sistema una y otra vez para leer todos los metadatos. meta_data debe devolverse en una sola llamada al sistema)

  1. ¿Cómo asigno memoria para un programa de espacio de usuario desde el hilo del núcleo? (Incluso agradecería si me puede señalar cualquier otra llamada al sistema que realice una operación similar: asignar en el núcleo y liberar espacio en el usuario)
  2. ¿Es correcta esta interfaz o hay una mejor manera de hacerlo?
¿Fue útil?

Solución

No intente asignar memoria para el espacio de usuario desde el kernel; esta es una gran violación de las capas de abstracción del kernel. En cambio, considere algunas otras opciones:

  • Haga que el espacio de usuario pregunte cuánto espacio necesita. El espacio de usuario asigna, luego toma la memoria del núcleo.
  • Haga que las páginas de mmap del espacio de usuario pertenecientes a su controlador directamente en su espacio de direcciones.
  • Establezca un límite superior en la cantidad de datos necesarios. Solo asigna esa cantidad.

Es difícil decir más sin saber por qué esto tiene que ser atómico. En realidad, la asignación de memoria tendrá que ser interrumpible de todos modos (o es poco probable que tenga éxito), por lo que es poco probable que salir y volver al núcleo vaya a doler mucho. De hecho, cualquier escritura en la memoria del espacio de usuario debe ser interrumpible, ya que existe la posibilidad de fallas en la página que requieren IO.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top