NuG*_*uGy 3 c filesystems file-io kernel linux-kernel
我正在开发一个项目,我必须打开一个目录并读取内核级别的文件/目录.我基本上试图找出如何ls在内核级别实现.
现在我已经弄清楚如何使用sys_open()和获取目录的文件描述符O_DIRECTORY flag,但我不知道如何读取我收到的fd.如果有人有任何提示或其他建议,我会很感激.(请记住,这必须在内核级别完成).
编辑:长话短说,对于学校项目,我正在实现文件/目录属性.我在storring属性的位置是具有给定属性的文件的同一级别的隐藏文件夹.(因此Desktop/MyFolder中的文件有一个名为Desktop/MyFolder/.filename_attr的属性文件夹).相信我,我不在乎内核中的混蛋.但我需要在内核级别读取目录的原因是因为它是项目规范的一部分.
要添加到caf的答案提及vfs_readdir(),读取和写入内核中的文件被认为是不安全的(除了/proc,它充当内核中内部数据结构的接口.)
原因在这篇linuxjournal文章中有详细描述,尽管它们也提供了访问文件的黑客攻击.我不认为他们的方法可以很容易地修改为目录工作.更正确的方法是访问内核的文件系统inode条目,这是做什么的vfs_readdir.
Inode是文件系统对象,例如常规文件,目录,FIFO和其他动物.它们存在于光盘(用于块设备文件系统)或存储器(用于伪文件系统)中.
请注意,vfs_readdir()需要一个file *参数.要从file用户空间文件描述符获取结构指针,您应该使用内核的文件描述符表.
在kernel.org文件文档上说这样做安全如下:
要在给定fd的情况下查找文件结构,读者必须使用其中一个
fcheck()或fcheck_files()API.由于无锁查找,这些需要处理屏障要求.一个例子 :
rcu_read_lock();
file = fcheck_files(files, fd);
if (file) {
// Handling of the file structures is special.
// Since the look-up of the fd (fget() / fget_light())
// are lock-free, it is possible that look-up may race with
// the last put() operation on the file structure.
// This is avoided using atomic_long_inc_not_zero() on ->f_count
if (atomic_long_inc_not_zero(&file->f_count))
*fput_needed = 1;
else
/* Didn't get the reference, someone's freed */
file = NULL;
}
rcu_read_unlock();
....
return file;
Run Code Online (Sandbox Code Playgroud)
atomic_long_inc_not_zero()refcounts在增量期间检测是否已经为零或变为零.如果是,我们失败fget()/fget_light().
最后,看看filldir_t第二个参数类型.