为啥 uaccess.h 中的 access_ok 宏的实现不使用它的所有参数?
Posted
技术标签:
【中文标题】为啥 uaccess.h 中的 access_ok 宏的实现不使用它的所有参数?【英文标题】:Why is the implementation of access_ok macro from uaccess.h not using all of its arguments?为什么 uaccess.h 中的 access_ok 宏的实现不使用它的所有参数? 【发布时间】:2014-04-07 18:07:18 【问题描述】:/urs/src/linux-header-#version/arch/x86/include/asm/uaccess.h 中的以下代码定义了宏 access_ok,其中“type”作为参数。然而,这个宏的定义并没有在任何地方使用这个参数。
#define access_ok(type, addr, size) (likely(__range_not_ok(addr, size) == 0))
我错过了什么吗? “类型”应该有 2 个可能的值: #define VERIFY_READ 0 #define VERIFY_WRITE 1
我唯一的解释是这是为了保持一致性。 (在不同的平台上,access_ok的实现可能会考虑到“类型”)。
【问题讨论】:
【参考方案1】:this 宏的实现不使用它的事实是一个实现细节。 access_ok
逻辑上所做的事情是根据所有三个参数给出答案;只是碰巧x86(和大多数其他平台)的答案实际上不需要考虑type
。 (在某些平台上,实现不考虑 任何 参数,只返回 1。在其他平台上,例如 UML、type
确实使用。)access_ok
是抽象API的一部分,应该跨平台保持一致,而type
是Linux抽象模型中内存的一个属性,所以参数是必要的。
“一致性”是一个正确的结论,但前提是错误的:API 是由系统的抽象、可移植模型决定的,该模型包括type
。在这种情况下,遵循 API 是实现的责任,而不是 API 的责任要屈从于实现的细节。
【讨论】:
以上是关于为啥 uaccess.h 中的 access_ok 宏的实现不使用它的所有参数?的主要内容,如果未能解决你的问题,请参考以下文章