/urs/src/linux-header-#version/arch/x86/include/asm/uaccess.h中的以下代码用" type"定义宏access_ok。作为一个论点。但是,此宏的定义不在任何地方使用此参数。
#define access_ok(type, addr, size) (likely(__range_not_ok(addr, size) == 0))
我错过了什么吗? "类型"应该有两个可能的值: #define VERIFY_READ 0 #define VERIFY_WRITE 1
我唯一的解释是这是为了保持一致性。 (在不同的平台上,"类型"可能会在access_ok的实现中考虑到这一点。)
答案 0 :(得分:0)
宏的此实现不使用它的事实是一个实现细节。根据所有三个参数,access_ok
逻辑所做的是答案;只是碰巧x86(和大多数其他平台)的答案实际上并不需要考虑type
。 (在某些平台上,实现不会将任何参数考虑在内,只返回1.在其他平台上,例如UML,确实使用了type
。) access_ok
是抽象API的一部分,它应该跨平台保持一致,而type
是Linux抽象模型中内存的属性,因此参数是必需的。
“一致性”是一个正确的结论,但是从错误的前提出发:API由系统的抽象可移植模型决定,模型包括type
。在这种情况下,实现的责任是遵循API,而不是API,以弯曲到实现的细节。