linux __user宏有什么含义?

Mr.*_*nce 60 c macros kernel linux-kernel

我希望有人可以解释linux内核源代码中使用的__user宏的细微差别.

首先,宏观:

# define __user         __attribute__((noderef, address_space(1)))
Run Code Online (Sandbox Code Playgroud)

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

我可能会遗漏一些明显的事实,但有人可以解释这样一个宏的含义吗?例如,这个宏的使用位置有什么好的例子?如果我错过了一些明显的东西,请再次原谅我.

为了把它放在某些环境中,我在检查一些USB代码(linux/usbdevice_fs.h)时遇到了宏.我只是在寻找对内核中使用的这个宏(或其他类似的宏)的一般理解.

谢谢你的期待!

Mic*_*urr 44

它允许像稀疏这样的工具告诉内核开发人员他们可能使用不受信任的指针(或者在当前虚拟地址映射中可能无效的指针).


Azh*_* KG 35

我认为__user标记用户空间指针并告诉开发人员/系统不要信任它.如果用户给你"无效"指针,那么内核会尝试引用它(注意内核可以在任何地方引用)并且它可以破坏它自己的空间.

例如,在"read"(在你的usbdevice_fs.h中)应该为你提供一个(__ user)缓冲区来写入结果.所以你必须使用copy_to_user,但不能使用memcopy,strcpy或类似的东西.

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

  • 等待评论,为什么我的答案被低估了. (3认同)

小智 9

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

这一点很重要:对于gcc,稀疏注释是没有意义的.它们仍然可以用来告诉程序员 "嘿,你得到的指针不是一个普通的指针",但是最后,除非你使用稀疏,否则它们实际上没有任何事情.

然而.当你使用解析,它完全是另一回事.对于"稀疏","__ iomem"有很多含义:

# define __iomem __attribute__((noderef, address_space(2)))
Run Code Online (Sandbox Code Playgroud)

即"iomem"意味着两个不同的东西:它意味着稀疏应该抱怨

如果指针被直接解除引用(它是一个"noderef"指针),并且它位于"地址空间2"而不是正常地址空间(0).

现在,这意味着稀疏会抱怨如果这样的指针传递到一个想要一个常规指针的函数(因为它不是一个普通的指针,你显然不应该像"strcmp()"等那样做)如果你试图将它转换为另一个地址空间中的另一个指针,稀疏也会抱怨.