C 从内核空间中的inode读取原始字节
使用C并在内核空间中操作,是否可以直接从inode读取i_标志数据,并查看整个无符号长值,而不是仅支持标志的值/设置 我在Centos 7上使用的是内核3.10.0,它位于Oracle的VirtualBox之上 如果这个问题没有意义,我很抱歉,我对这个问题还不太熟悉,我正在努力让自己了解事情是如何运作的。我已经为此挣扎了一段时间,读了太多不同的东西,我变得越来越困惑 简单地说,我试图将I_flags字段读入一个变量,然后检查各个位的状态(可能通过使用test_bit?),而不管它们是否表示内核或其他地方支持或实现的标志。我的想法是,这些数据可以从i_flags字段中的原始32位数据中获得 我应该能够从给定位置开始从inode读取x个字节吗?还是有一个更简单的“阅读”方法,我只是没有看到?这能做到吗 任何指点都将不胜感激 罗格 附加信息-C 从内核空间中的inode读取原始字节,c,linux-kernel,flags,inode,C,Linux Kernel,Flags,Inode,使用C并在内核空间中操作,是否可以直接从inode读取i_标志数据,并查看整个无符号长值,而不是仅支持标志的值/设置 我在Centos 7上使用的是内核3.10.0,它位于Oracle的VirtualBox之上 如果这个问题没有意义,我很抱歉,我对这个问题还不太熟悉,我正在努力让自己了解事情是如何运作的。我已经为此挣扎了一段时间,读了太多不同的东西,我变得越来越困惑 简单地说,我试图将I_flags字段读入一个变量,然后检查各个位的状态(可能通过使用test_bit?),而不管它们是否表示内核或
以下是我用来引用I_标志的代码-
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_标志字段中返回12,这是有意义的。然而,如果我添加“d”标志,我仍然看到12
如果我从inode字段(I_标志)获取原始值,那么打开“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_标志是否应该与添加的“d”标志有所不同
谢谢
Rog如果我理解正确,您有一个
结构索引节点的内存地址
,您希望能够完整地读取I_标志
字段,而不是使用按位操作来测试特定标志
如果是这样的话,你可以做:
unsigned int flags = inode_pointer->i_flags
i_flags
只是一个unsigned int
(至少在3.10.0中是这样),您可以像访问任何其他unsigned int
一样访问它。由于我们将它视为一个标志,通常不会对其执行乘法等常规操作,但这是按惯例执行的,必须由程序员强制执行。编译器既不知道也不关心无符号int
是否被用作一组标志(如i_标志
的情况,其中每个位都有一些含义,或者它是否被用作一个整数,其中它代表一个数)
更新
我相信(但老实说,我不是100%肯定)问题是一些
chattr
属性没有映射到i_标志
位值。您可以找到与i_标志
一起使用的位掩码。例如chattr
的a
对应于s_附加
,它的值为4,与您看到的值一致,但我找不到它的值at将对应于i\u标志
位掩码列表中的d
。是的,这就是我感到困惑的地方-这里是我用来引用i\u标志的代码-printk(KERN\u INFO“inode value=%lu\n”,file\u inode(file)->i\u标志);这会打印一个0,尽管默认情况下“e”标志处于打开状态。如果我使用chattr添加“a”和“a”标志,我现在在I_标志字段中看到12。如果我添加“d”,我仍然看到12。如果我从inode字段(I_标志)获取原始值,不应该同时打开“e”和“d”中的任何一个位导致此值发生更改?很抱歉,缺少格式设置。我正在使用“添加注释”功能。不确定这是否是正确的答复方式?请使用代码更新您的问题,以便您可以对其进行格式设置。您可以通过单击问题下方的“编辑”来执行此操作。是否可以显示与语句对应的代码如果我使用chattr添加“a”和“I”标志,它现在在I_标志字段中返回12,这是有意义的。但是如果我添加“d”标志,我仍然会看到12