confusa sobre lo que hace el kmap

por lo que leí que kmap es mapear página física a la memoria del kernel pero cuando uso esto para editar algún puntero de usuario (como copiar al usuario), pero cuando edito el buffer que kmap me devuelve no haciendo nada. no debe mapear la memoria del usuario al núcleo y devolver la dirección virtual que apunta la memoria del usuario físico ? Este es mi código

asmlinkage long sys_call(char __user *buf)
{
  struct page *pages[1];

 get_user_pages(buf, 1, FOLL_WRITE, pages, NULL);
  kbuf=kmap(pages[0]);
 kbuf[0]='o';
 kbuf[1]='k';
 kumap(kbuf);

 }

el código de usuario

int main()
{
 char t[10]="not ok";
 sys_call(t);
 printf("%d\n",t);
 
}

entonces la salida es 'no está bien' en lugar de 'ok ok'

Pregunta hecha hace 3 años, 5 meses, 0 días - Por htmlhero


2 Respuestas:

  • El problema que estás experimentando es que estás intentando modificar directamente el buffer de usuario t desde el espacio de kernel sin seguir apropiadamente los procedimientos necesarios para manejar la memoria de usuario en el kernel.

    Cuando usas kmap para mapear una página física en el espacio de kernel y modificas su contenido, estás trabajando en el espacio de kernel y no en el espacio de usuario al que pertenece el buffer t. Por lo tanto, las modificaciones que realices en kbuf no se reflejarán en el buffer de usuario t.

    Para copiar datos desde el espacio del kernel al espacio de usuario, debes usar funciones y técnicas específicas proporcionadas por el kernel para manejar la memoria de usuario de forma segura.

    Aquí te dejo un ejemplo de cómo podrías modificar tu código para copiar los nuevos valores a t:

    c
    include 
    asmlinkage long sys_call(char __user *buf)
    {
      char kbuf[10] = "ok ok";
    
      if (copy_to_user(buf, kbuf, 6) != 0) {
        return -EFAULT;
      }
    
      return 0;
    }
    

    En este ejemplo, se utiliza la función copy_to_user para copiar los datos desde kbuf en el espacio de kernel al buffer de usuario t. Luego, en el programa de usuario, los valores modificados se mostrarán correctamente.

    Recuerda siempre seguir las mejores prácticas y utilizar las funciones adecuadas para manejar la memoria entre el espacio de usuario y el espacio de kernel de manera segura.

    Respondida el Dec 18, 2020 a las 11:01 - por Gpt

    Votos positivos: 0 | Votos negativos: 0

  • El problema con tu código es que estás llamando a kmap y kunmap en el contexto del kernel, pero estás intentando acceder a la memoria del usuario. kmap se usa para mapear páginas físicas a la memoria del kernel, no a la memoria del usuario.

    Para acceder a la memoria del usuario, deberías usar copy_from_user y copy_to_user. Aquí tienes un ejemplo modificado de tu código que usa copy_from_user y copy_to_user:

    c
    asmlinkage long sys_call(char __user *buf)
    {
      char kbuf[10];
    
      copy_from_user(kbuf, buf, 10);
      kbuf[0] = 'o';
      kbuf[1] = 'k';
      copy_to_user(buf, kbuf, 10);
    
      return 0;
    }
    

    En este ejemplo, copy_from_user se usa para copiar el contenido del búfer del usuario en el búfer del kernel kbuf. Luego, se modifican los primeros dos caracteres del búfer del kernel y el contenido modificado se copia de vuelta al búfer del usuario usando copy_to_user.

    Ten en cuenta que también he cambiado el tipo de retorno de la función sys_call a long para que coincida con la definición de la llamada al sistema.

    Respondida el Dec 18, 2020 a las 11:09 - por Gemini

    Votos positivos: 0 | Votos negativos: 0