своп изнутри кода ядра - PullRequest
       1

своп изнутри кода ядра

0 голосов
/ 22 августа 2011

новичок ядра здесь ...

Я пытаюсь сделать своп изнутри кода ядра (на устройстве подкачки в известном месте, подходящем для жесткого кодирования).Я нашел syscall sys_swapoff, который выглядит довольно прямолинейно, поэтому я попытался просто сделать:

sys_swapoff("/path/to/swap/device");

, но это не работает (возвращает ошибку № -14).Используя отладку в гетто-стиле через printk, я определил, что он выдает ошибку в этом кодовом блоке в sys_swapoff:

    pathname = getname(specialfile);
    err = PTR_ERR(pathname);
    if (IS_ERR(pathname))
            goto out;

Так что, очевидно, ему не нравится что-то в названии пути.Я подумал, что, может быть, это потому, что я передавал ему строковый литерал вместо выделенного буфера, поэтому я попытался соединить буфер, записать в него путь и передать его, но это не имело никакого значения.Что я делаю неправильно?Есть ли лучший способ сделать своп изнутри кода ядра, кроме использования системного вызова?

Ответы [ 2 ]

0 голосов
/ 23 августа 2011

Существует код в наборе патчей TuxOnIce (широко используется для поддержки гибернации в различных дистрибутивах Linux), который включает / отключает своп при необходимости, т. Е. При создании образа гибернации и / или возобновлении.

То, что делает этот код (отметьте kernel/power/tuxonice_swap.c в источниках исправлений), точно так же, как и вы - sys_swapoff(swapfilename); - и оно функционирует. Так что нет ничего плохого в вызове из пространства ядра как таковом .

Насколько вы уверены в своем пути к устройству? Вы указали sys_swapon() и sys_swapoff(), чтобы они печатали то, что фактически было передано, когда вы вручную в командной строке запускаете команды swapon / swapoff? udev & friends и / или использование initramfs иногда приводят к именам устройств, которые не являются универсально действительными.

Edit:

Поскольку вы только что заявили в комментарии, вы пытаетесь /dev/block/... - , что вполне может быть вашей причиной; путь является артефактом, сразу после загрузки эти узлы устройства существуют напрямую в /dev/ (например, /dev/mmcblk0 становится /dev/block/mmcblk0 позже). Попробуйте /dev/zram0 и посмотрите, что получится.

0 голосов
/ 22 августа 2011

Вы указываете путь к определенному пронумерованному разделу (например, sda1 vs sda) как часть вашего пути?Можете ли вы указать конкретное значение, которое вы использовали?

На самом деле, если вы пытаетесь сделать это внутри кода ядра - sys_swapoff ожидает, что передаваемый параметр должен быть из пространства пользователя, поэтому вам, вероятно, нужно разложить sys_swapoff исделайте это самостоятельно в своем коде.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...