Сохранение данных из модуля ядра в пользовательское пространство

Несколько вариантов:

POSIX:

$ printf 'a b\tc \n' | sed -n l
a b\tc $

$ printf 'a b\tc \n' | od -A n -t cx1
   a       b  \t   c      \n
  61  20  62  09  63  20  0a

довольно переносимый:

$ printf 'a b\tc \n' | cat -vte
a b^Ic $

(некоторые реализации cat имеют -A как псевдоним для -vte ). Используйте только -vt или -T с GNU cat , если вас интересуют только символы табуляции, а не конечные пробелы. Обратите внимание, что список символов, которые преобразует cat , зависит от реализации.

В представлении vi или введите : установить список , чтобы вкладки и конец строк стали видимыми.

4
14.04.2019, 10:50
1 ответ

Para el programa de recopilación de datos del espacio de usuario, ¿qué tiene de malo un bucle infinito? Siempre que esté utilizando la llamada al sistema poll, debería ser eficiente:https://stackoverflow.com/questions/30035776/how-to-add-poll-function-to-the-kernel-module-code/44645336#44645336?

Almacenamiento de datos permanente

No estoy seguro de cuál es la mejor manera de hacerlo, ¿por qué no escribes en un archivo desde el espacio del usuario en la encuesta? Supongo que su preocupación es que si llegan demasiados datos, los datos se perderán, ¿es así?

Pero dudo que el factor limitante sea la comunicación entre el kernel y el usuario en ese caso, sino más bien la lentitud del dispositivo de almacenamiento permanente, por lo que creo que hacerlo en el usuario no supondrá ninguna diferencia. En todo caso,la solución de solo kernel tiene una pregunta de alto perfil en:https://stackoverflow.com/questions/1184274/how-to-read-write-files-within-a-linux-kernel-moduley no creo que obtenga una mejor solución aquí.

Deshabilitar interrupciones

¿Está seguro de que supondría alguna diferencia, especialmente teniendo en cuenta que es probable que se produzca el cuello de botella? Esperaría que si su dispositivo realmente está produciendo una gran cantidad de interrupciones, entonces dominarían cualquier otra interrupción en cualquier caso. ¿Vale la pena arriesgarse a estropear el estado de otro hardware? ¿Las especificaciones de su dispositivo de hardware sugieren que físicamente podría proporcionar un ancho de banda de datos mucho mayor que el que tiene actualmente?

No sé cómo hacerlo yo mismo, pero si desea una respuesta, lo mejor que puede hacer es hacer una pregunta separada con el título "¿Cómo deshabilitar todas las interrupciones de un módulo del kernel de Linux?". LDD2 menciona la función cli()http://www.xml.com/ldd/chapter/book/ch09.htmlpero parece que quedó en desuso:https://notes.shichao.io/lkd/ch7/#no-more-global-cliEse texto luego sugiere local_irq_disabley local_irq_save.

También intentaría piratearlo con cualquier método que encuentre para deshabilitar las interrupciones, y ver si se vuelve más eficiente antes de seguir buscando si existe un buen método.

En un emulador, un rápido:

static int myinit(void)
{
    pr_info("hello init\n");
    unsigned long flags;
    local_irq_save(flags);
    return 0;
}

falla con:

returned with disabled interrupts

aparentemente proviene de v4.16 do_one_initcall, ¡así que hay un manejo de errores especializado para eso!

Luego intenté hacerlo ingenuamente desde un subproceso de trabajo:

static int work_func(void *data)
{
    unsigned long flags;
    local_irq_save(flags);
    return 0;
}

static int myinit(void)
{
    kthread = kthread_create(work_func, NULL, "mykthread");
    wake_up_process(kthread);
    return 0;
}

pero aún así no puedo observar ningún efecto, por lo que las interrupciones deben estar siendo habilitadas por otra cosa, como se puede inferir de:

watch -n 1 grep i8042 /proc/interrupts

que sigue actualizando tty o muse/interrupciones de teclado.

Lo mismo ocurre con otros puntos de entrada, como petimetres, o si pruebo un asm("cli")sin procesar. Necesitaremos un enfoque más educado.

2
27.01.2020, 20:59

Теги

Похожие вопросы