什么是Linux __usermacros的影响?
我希望有人能够解释linux内核源码中使用的__usermacros的细微差别。
首先,macros观:
# define __user __attribute__((noderef, address_space(1)))
现在,经过一些Googlesearch,我发现这个macros允许指定一个指针属于用户地址空间,而不应该解除引用。
我可能会错过一些明显的事实,但是有人可以解释一下这个macros的含义吗? 举个例子,这个macros在哪里可以被使用,这是一个很好的例子。 再次,原谅我,如果我失去了一些明显的东西。
为了说明这一点,我在考察一些USB代码(linux / usbdevice_fs.h)的同时,把它与macros相关联。 我只是在寻找这个macros(或其他类似的)在内核中使用的一般理解。
感谢您的期待!
它允许像稀疏这样的工具告诉内核开发者他们可能使用了一个不可信的指针(或者在当前的虚拟地址映射中可能是无效的指针)。
我认为__user标记用户空间指针,并告诉开发者/系统不要信任它。 如果用户给你“无效”的指针,那么内核就会尝试引用它(注意内核可以随处引用),并且可以破坏它自己的空间。
例如在“读”(在你usbdevice_fs.h)应该为你提供一个(__user)缓冲区来写结果。 所以你必须使用copy_to_user,而不是memcopy,strcpy或类似的东西。
注意:这不是正式的定义/描述,而是我所知道的唯一部分。
__user
macros是在compiler.h头文件__force
/ __kernel
等其他一些macros来定义的。 它们实际上对传统编译器(包括GCC / ICC等)没有任何用处,但对于稀疏的内核静态分析工具(这里有更多信息:稀疏 – Linux内核新手)是有用的。 当你提到像__user
/ __kernel
/ __force
这样的macros,它对于稀疏保持特殊的含义。 在Linux内核邮件列表中,Linus Torvalds解释了如何使用它:
这一点很重要:对于gcc,稀疏注释是没有意义的。 他们仍然可以用来告诉程序员 “嘿,你得到的指针不是一个正常的指针”,但是最后,除非你使用稀疏,否则他们实际上什么都不做 。
然而。 当你使用parsing,完全是另一回事。 对于“稀疏”,这个“__ iomem”有很多含义:
# define __iomem __attribute__((noderef, address_space(2)))
即“iomem”是指两个单独的东西:这意味着稀疏应抱怨
如果指针是直接取消引用(它是一个“noderef”指针),并且它在“地址空间2”而不是正常的地址空间(0)。
现在,这意味着稀疏会抱怨,如果这样一个指针曾经传递到一个函数,需要一个正则指针(因为它不是一个正常的指针,你显然不应该做的事情,如“strcmp()”等) ,而稀疏也会抱怨,如果你试图把它转换到另一个地址空间的另一个指针。