我知道所有关于为什么不应该从内核读/写文件的讨论,而是如何使用/ proc或netlink来做到这一点 . 无论如何我想读/写 . 我也读过Driving Me Nuts - Things You Never Should Do in the Kernel .
但是,问题是2.6.30不导出 sys_read()
. 相反,它包含在 SYSCALL_DEFINE3
中 . 因此,如果我在我的模块中使用它,我会收到以下警告:
WARNING: "sys_read" [xxx.ko] undefined!
WARNING: "sys_open" [xxx.ko] undefined!
显然 insmod
无法加载模块,因为链接没有正确发生 .
问题:
-
如何在2.6.22之后在内核中读/写(其中
sys_read()
/sys_open()
未导出)? -
一般来说,如何在内核中使用包含在宏
SYSCALL_DEFINEn()
中的系统调用?
1 回答
您应该知道,应尽可能避免文件I / O.主要想法是"one level deeper"并直接调用VFS level functions而不是syscall处理程序:
包括:
打开文件(类似于打开):
关闭文件(类似于关闭):
从文件中读取数据(类似于pread):
将数据写入文件(类似于pwrite):
同步更改文件(类似于fsync):
[编辑]最初,我建议使用file_fsync,它在较新的内核版本中消失了 . 感谢可怜的家伙提出改变,但他的改变被拒绝了 . 在我审核之前,编辑被拒绝了 .