FreeBSD for AMD64 中函数 copyout()
的定义在哪里?
( http://www.unix.com/man-page/FreeBSD/9/copyout/ )
我唯一能找到的地方是sys/sys/systm.h
。
定义/声明是:
int copyout(const void * __restrict kaddr, void * __restrict udaddr,
size_t len) __nonnull(1) __nonnull(2);
它是声明还是定义? __nonnull(1)
和 __nonnull(2)
是什么意思?
最佳答案
这是一个函数原型(prototype),也称为声明。实现(定义,如果您选择)位于内核源代码中。你可以找到那些online ,或者(如果您选择安装源代码)在本地 FreeBSD 计算机上(位于 /usr/src/sys
下)。实际上有多个副本,具体取决于编译内核的硬件。 (顺便说一句,这些函数名称很“古老”——我在 20 世纪 80 年代中期遇到过它们,它们在当时是众所周知的)。
内核源代码包含这些函数的多种实现,具体取决于硬件平台。例如,在 FreeBSD 10 中,amd64 版本是用汇编语言编写的(例如,参见 /usr/src/sys/amd64/amd64/support.S 中的 SVN)。在同一版本中,我发现只有一个用 C 编写的实现(在 powerpc 子树下),并且在当前源代码中,该实现已被重写。因此,要知道源“在哪里”,您必须进行一些研究并找到适合您的硬件平台和 FreeBSD 版本的相应源。
__nonnull
是一个编译器指令,告诉它确保给定的参数不是明显的空指针。例如,请参阅这些邮件列表评论:
关于unix - FreeBSD 中 copyout() 的实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30661632/