为啥 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 宏的实现不使用它的所有参数?的主要内容,如果未能解决你的问题,请参考以下文章

access_ok()函数介绍

中断驱动

proc文件

字符驱动设备

ADC_驱动

早期字符设备注册