从内核代码中交换掉

时间:2011-08-21 23:42:05

标签: linux-kernel

内核新手在这里......

我正在尝试从内核代码中进行交换(在已知位置的交换设备上,适合硬编码)。我找到了syscall sys_swapoff,它看起来相当直接,所以我试着这样做:

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

但是这不起作用(它返回错误号-14)。通过printk使用ghetto风格的调试,我已经确定它在sys_swapoff中的这个代码块上出错:

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

显然,它不喜欢我给它的路径名。我想也许是因为我传递了一个字符串文字而不是分配的缓冲区,所以我尝试了kmallocing一个缓冲区,strcpying路径进入它,并传递它,但这没有任何区别。我究竟做错了什么?除了使用系统调用之外,还有更好的方法可以从内核代码中进行交换吗?

2 个答案:

答案 0 :(得分:0)

您是否指定了特定编号分区的路径(例如sda1 vs sda)作为路径的一部分?您能提供您使用的具体价值吗?

实际上,如果您尝试在内核代码中执行此操作 - sys_swapoff期望传入的参数来自用户空间,因此您可能需要分解sys_swapoff并在代码中自行完成其中一些工作。

答案 1 :(得分:0)

TuxOnIce补丁集中的现有代码(广泛用于各种Linux发行版中的休眠支持)在需要时启用/禁用交换,即在创建休眠图像和/或恢复时。

此代码的作用(在补丁源中检查kernel/power/tuxonice_swap.c)与您完全相同 - sys_swapoff(swapfilename); - 并且它的功能正常。因此,从内核空间调用没有任何问题。

您对设备路径名的确定性如何?您是否已对sys_swapon()sys_swapoff()进行了检测,以便在手动执行命令行问题swapon / swapoff命令时打印实际传递的内容? udev&朋友和/或initramfs的使用有时会导致设备路径名无法普遍有效。

编辑:

由于您刚刚在评论中说明了您正在尝试/dev/block/... - 可能是您的理由;该路径是一个工件,刚启动后,这些设备节点在/dev/中直接存在 (如/dev/mmcblk0后变为/dev/block/mmcblk0)。试试/dev/zram0,看看会发生什么。