使用C并在内核空间内操作,是否可以直接从inode读取i_flags数据并查看整个unsigned long值而不是仅支持的标志的值/设置?
我在Oracle的VirtualBox上使用Centos 7上的内核3.10.0。
如果这个问题没有意义,我道歉,我对此很陌生,并且正在努力教育自己如何运作。我一直在努力解决这个问题并阅读了很多不同的事情让我变得更加困惑。
简单地说,我试图将i_flags字段读入变量,然后检查各个位的状态(可能使用test_bit?),无论它们是否代表内核支持或实现的标志,或者别处。我的想法是,这些数据可能来自i_flags字段中的原始32位数据吗?
我是否应该能够从给定位置的inode读取x个字节数?还是有一种更简单的“阅读”方法,我只是没有看到?甚至可以这样做吗?
任何指针都将非常感激。
罗格
其他信息 -
这是我用来引用i_flags的代码 -
printk(KERN_INFO "inode value = %lu\n", file_inode(file)->i_flags);
我不清楚这是否等同于下面建议的格式 -
unsigned int flags = inode_pointer->i_flags
虽然“e”标志默认打开,但我的版本打印为0。不应该有一个非0的值表示“e”标志是否开启?
如果我使用chattr添加“a”和“i”标志,它现在在i_flags字段中返回12是有意义的。但是,如果我添加“d”标志,我仍然会看到12。
如果我从inode字段(i_flags)获取原始值,不应该打开“d”位导致该值发生变化?
感谢
罗格
更多信息 -
以下是我测试值的方法。
rls是/ usr / bin / ls的副本。以下命令显示将“i”和“a”添加到/ usr / bin / rls。然后,lsattr确认已设置这些标志。
sudo chattr + ia / usr / bin / rls
lsattr / usr / bin / rls ---- ia ------- e--
运行“rls”会导致上述printk语句的输出记录到/ var / log / messages。标志值为12,因为i和a都已设置。
RLS
Jun 29 14:46:15 localhost内核:open_exec inode值lu = 12
然后添加“d”标志。
sudo chattr + d / usr / bin / rls
对rls运行lsattr以查看显示“d”标志的标志已设置
lsattr / usr / bin / rls
---- iad ------ e--
再次运行“rls”,标志的值仍为12
RLS
Jun 29 14:53:21 localhost内核:open_exec inode值lu = 12
i_flag不应该与添加“d”标志不同吗?
谢谢,
罗格
答案 0 :(得分:0)
如果我理解正确,您的内存地址为struct inode
,并且您希望能够完整地读取i_flag
字段,而不是使用按位操作来针对特定标志进行测试。
如果是这种情况,那么你可以这样做:
unsigned int flags = inode_pointer->i_flags
i_flags
只是unsigned int
(至少在3.10.0中),您可以像访问任何其他unsigned int
一样访问它。由于我们将其视为标志,因此通常在其上执行诸如乘法的正常操作,但这是按照惯例并且必须由程序员强制执行。编译器不知道也不关心unsigned int
是否被用作一组标志(如i_flags
的情况,其中每个位都有一些含义或者它是否被用作一个整数,表示一个数字。
<强>更新强>
我相信(但说实话,我并非100%确定)问题是某些chattr
属性未映射到i_flag
位值。您可以找到与i_flag
here一起使用的位掩码。例如,chattr
&#39; s a
对应S_APPEND
,其值为4,与您所看到的相符,但我找不到与{{1}相对应的内容在d
位掩码列表中。