Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/57.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 从内核空间中的inode读取原始字节_C_Linux Kernel_Flags_Inode - Fatal编程技术网

C 从内核空间中的inode读取原始字节

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?),而不管它们是否表示内核或

使用C并在内核空间中操作,是否可以直接从inode读取i_标志数据,并查看整个无符号长值,而不是仅支持标志的值/设置

我在Centos 7上使用的是内核3.10.0,它位于Oracle的VirtualBox之上

如果这个问题没有意义,我很抱歉,我对这个问题还不太熟悉,我正在努力让自己了解事情是如何运作的。我已经为此挣扎了一段时间,读了太多不同的东西,我变得越来越困惑

简单地说,我试图将I_flags字段读入一个变量,然后检查各个位的状态(可能通过使用test_bit?),而不管它们是否表示内核或其他地方支持或实现的标志。我的想法是,这些数据可以从i_flags字段中的原始32位数据中获得

我应该能够从给定位置开始从inode读取x个字节吗?还是有一个更简单的“阅读”方法,我只是没有看到?这能做到吗

任何指点都将不胜感激

罗格

附加信息-


以下是我用来引用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