Kernel 奇怪的返回类型uu get_free_页面

Kernel 奇怪的返回类型uu get_free_页面,kernel,Kernel,为什么返回未签名的long?为什么不使用void*或char* unsigned long __get_free_pages(unsigned int gfp_mask, unsigned int order) 我猜它会返回一个地址,或者我完全误解了这个函数了吗?如果您更正,它会返回分配的第一页的第一个字节的内存地址。有趣的是,\u get\u free\u pages()内部使用的page\u address()实际上返回了void* 这样做的原因可以在以下内容中找到: 尽管在混合不同的数据

为什么返回未签名的long?为什么不使用void*或char*

unsigned long __get_free_pages(unsigned int gfp_mask, unsigned int order)

我猜它会返回一个地址,或者我完全误解了这个函数了吗?

如果您更正,它会返回分配的第一页的第一个字节的内存地址。有趣的是,
\u get\u free\u pages()
内部使用的
page\u address()
实际上返回了
void*

这样做的原因可以在以下内容中找到:

尽管在混合不同的数据类型时必须小心,但有时有很好的理由这样做。其中一种情况是内存地址,就内核而言,内存地址是特殊的。虽然从概念上讲,地址是指针,但使用无符号整数类型通常可以更好地完成内存管理;内核将物理内存视为一个巨大的数组,而内存地址只是数组的索引。此外,指针很容易被取消引用;当直接处理内存地址时,您几乎不想在内存中取消对它们的引用 这样。使用整数类型可以防止这种取消引用,从而避免错误。因此,内核中的通用内存地址通常是无符号长的,这利用了指针和长整数总是相同大小的事实,至少在Linux当前支持的所有平台上是如此

“从内存管理的角度来看,系统的RAM可以看作是一个页面的线性数组,因此将地址视为整数类型(本质上是数组的索引)是有一定意义的。整数也可以用于任意算术;C中的指针也可以这样使用,但人们很快就会进入”未定义的行为“一个过于热情的编译器可能会觉得有权制造各种混乱的领域。因此,unsigned long被确定为get_free_page()的返回类型,通常是指一个可能出现在内存中任何位置的地址。”--from--请阅读这篇关于无符号long vs.void*的有趣故事:-)