Как обрабатывать память, полученную с помощью module_param при написании модуля ядра Linux?

При написании модуля ядра для Linux module_param и его варианты могут принимать строку в качестве параметра модуля, а пространство памяти, необходимое для этой строки, выделяется за кулисами без необходимости делать что-либо явно. Мой вопрос в том, как вы должны обращаться с этим фрагментом памяти? Нужно ли вам явно освобождать его, если он вам больше не нужен? Что делать, если вы хотите изменить строку внутри модуля?


person Sora Minazuki    schedule 26.03.2016    source источник


Ответы (1)


Память, выделенная module_param для аргумента строки (тип charp), поддерживается обратными вызовами для типа этого параметра, см. функции param_set_charp, param_get_charp и param_free_charp, определенные в kernel/params.c.

  1. Самый простой способ работы с таким параметром — объявить его как Только для чтения и обращаться к нему из модуля только для чтения. В этом случае не нужно беспокоиться о блокировке доступа или освобождении значения параметра.

  2. Если вы хотите записать из модуля в параметр Только для чтения, вам необходимо:

    1) Освободить старое значение параметра через param_free_charp.

    2) Назначьте новое значение параметра. Если это значение выделено, вам необходимо вручную освободить его в module_exit или при следующей записи в параметр.

    Оба эти действия должны выполняться внутри одной критической секции kernel_param_lock(THIS_MODULE)/kernel_param_unlock(THIS_MODULE), поэтому возможное чтение значения параметра из пространства пользователя будет считать его значение полностью инициализированным.

  3. Если вы объявляете параметр как доступный для записи, то для его чтения внутри модуля требуется критический раздел kernel_param_lock(THIS_MODULE)/kernel_param_unlock(THIS_MODULE).

  4. Запись в параметр доступный для записи разрешена только тогда, когда новое значение хранится где-то еще, поэтому, если параметр будет перезаписан из пользовательского пространства, его предыдущее значение могут быть найдены и освобождены в случае необходимости.

    Запись и чтение такого параметра внутри модуля должны соответствовать тем же требованиям, что и случаи 2 и 3 соответственно.

person Tsyvarev    schedule 27.03.2016