linux __user宏的含义是什么?


70

我希望有人能解释Linux内核源代码中使用的__user宏的细微差别。

首先,宏:

现在,经过一番谷歌搜索后,我读到该宏允许一个人将一个指针指定为属于用户地址空间,并且不应取消引用它。

我可能会遗漏一些明显的事实,但是有人可以解释一下此类宏的含义吗?例如,该宏将在何处使用的一个好例子是什么?同样,如果我缺少明显的内容,请原谅我。

为了说明这一点,我在检查一些USB代码(linux / usbdevice_fs.h)时遇到了宏。我只是想对内核中使用的宏(或其他类似的宏)有一个一般的了解。

感谢您的光临!


3
请参见do_execve()源中的示例。查看如何在count()中使用argv。如果您只是取消引用(* argv [0])之类的东西,sparse(1)会发出警告。address_space表示并非所有指针都相等,因此需要不同的(取消引用)规则,因此不应混用。
adobriyan

我可以在哪个标头或源文件中找到@adobriyan?我不想在文件系统中使用grep来查找它。一条路就足够了
牧民

Answers:


48

它允许稀疏之类的工具告知内核开发人员,他们可能不正确地使用了不受信任的指针(或在当前虚拟地址映射中可能无效的指针)。


那么__attribute__()可以使用任意文本作为“属性”吗?它不限于对GCC本身有意义的固定集吗?
Alex D

1
@AlexD来自GCC属性语法手册An attribute specifier is of the form __attribute__ ((attribute-list)). An attribute list is a possibly empty comma-separated sequence of attributes, where each attribute is one of the following: 1. Empty. Empty attributes are ignored. **2. An attribute name (which may be an identifier such as unused, or a reserved word such as const).** (...)。似乎可以是您想要的任何标识符(使用标识符命名约定)。
Enzo Ferber

37

我认为__user标记用户空间指针,并告诉开发人员/系统不信任它。如果用户为您提供了“无效”的指针,则内核会尝试对其进行引用(请注意,内核可以在任何地方进行引用),并且它可能破坏自己的空间。

例如,在“ read”(在您的usbdevice_fs.h中)中应提供一个(__user)缓冲区以将结果写入其中。因此,您必须使用copy_to_user,而不是memcopy,strcpy或类似的东西。

注意:这不是正式的定义/描述,而是我所知道的唯一部分。


是的,这使copy_to_user有意义
2014年

11

__user宏是使用其他一些宏定义的,例如在editor.h标头文件中的__force/ __kerneletc。它们实际上对包括GCC / ICC等在内的传统编译器没有任何用处。但是,对于稀疏之类的内核静态分析工具很有用(更多信息在这里:Sparse-Linux Kernel Newbies)。当您提到像__user/ __kernel/__force等之类的宏时,它对于稀疏具有特殊的含义。在Linux内核邮件列表中,Linus Torvalds像这样解释了它的用法:

要记住这一点很重要:对于gcc,稀疏注释是没有意义的。它们仍然很有用,只是以一种相当可读的方式告诉程序员“嘿,您得到的指针不是普通的指针”,但是最后,除非您使用稀疏函数,否则它们实际上不会做任何事情。

然而。当你使用解析,那就另当别论了完全。对于“稀疏”,“ __ iomem”具有很多含义:

即“ iomem”是指两个独立的事物:它表示稀疏应该抱怨

如果该指针曾经被直接取消引用(这是一个“ noderef”指针),并且它位于“地址空间2”中,而不是普通的地址空间(0)。

现在,这意味着如果将这样的指针传递到需要常规指针的函数中,则稀疏程序将抱怨(因为它不是普通指针,并且您显然不应在其上执行“ strcmp()”等操作) ,并且如果您尝试将其强制转换为另一个地址空间中的另一个指针,sparse也会抱怨。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.