Сколько памяти используется моим модулем ядра?

lsmod,/proc/modules и slabinfo,/proc/meminfo НЕ дает, сколько памяти использует мой модуль ядра

Есть ли способ узнать это?

btw, я написал небольшую тестовую программу в основном, драйвер устройства, который принимает вызов ioctl для распределения 1 МБ, и каждую секунду я отправляю это сообщение ioctl из моего приложения, так что мой диск делает kmalloc каждую секунду. Я не смог увидеть увеличение "cat/proc/meminfo | grep Slab"

- snip ---

int device_ioctl(
         struct file *file,
         unsigned int ioctl_num, 
         unsigned long ioctl_param)
{
    /* 
     * Switch according to the ioctl called 
     */
    printk ( "<l> inside ioctl %d IOCTL_ALLOC_MSG = %d\n", ioctl_num,IOCTL_ALLOC_MSG );
    switch (ioctl_num) {
    case IOCTL_ALLOC_MSG:
        allocfunc(); // kmalloc 1MB // printk in this function is OK
        break;
    case IOCTL_DEALLOC_MSG:
        deallocfunc();
        break;
    }

    return 0;
}

Приложение/пользовательское пространство

 while ( !stop )
        {
            ret_val = ioctl(memfile, IOCTL_ALLOC_MSG);

            if (ret_val < 0) {
                printf("ioctl failed. Return code: %d, meaning: %s\n", ret_val, strerror(errno));
                return -1;
            }
            sleep ( 10 );

        }

Я не вижу роста памяти в slabinfo. Я знаю, что linux использует cache- > slabs- > pages- > объекты, но для определения размера памяти для конкретного модуля ядра должен быть какой-то способ на земле пользователя.

Спасибо,

Ответ 1

Я не уверен, что это будет нормально для вас, но вы можете получить объем памяти, который модуль взял с помощью "cat/proc/modules", второй столбец - это размер в байтах, который модуль в используется первый столбец.

Пример вывода, показывающий, сколько памяти используют модули drm, используя:

cat/proc/modules | grep ^ drm | awk '{print $1 "" $2}'

drm_kms_helper 49394 drm 286028

Надеюсь, что это поможет.

Ответ 2

Предполагая, что нет прямого способа сделать это напрямую (что может быть, насколько я знаю)....

Вы можете использовать LTTng для отслеживания событий ядра. Если там нет удобного события, вы должны создать новый трафик даже каждый раз, когда ваш модуль выделяет память.

Затем вы можете проанализировать трассировку и нарисовать график того, как ваше использование памяти растет и со временем сокращается.