内核新手在这里......
我正在尝试从内核代码中进行交换(在已知位置的交换设备上,适合硬编码)。我找到了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路径进入它,并传递它,但这没有任何区别。我究竟做错了什么?除了使用系统调用之外,还有更好的方法可以从内核代码中进行交换吗?
答案 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
,看看会发生什么。