unix - FreeBSD 中 copyout() 的实现

标签 unix freebsd bsd netbsd

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/

相关文章:

freebsd - VOP_WRITE_APV()的源代码在哪里?

C random() 和 setstate 函数未按预期运行

c - C语言中如何区分以下两种情况

r - 从 R 内部设置 LD_LIBRARY_PATH

c++ - 满足退出条件时程序不退出?

c - 父进程如何找到导致其子进程死亡的进程的pid?

c++ - 在 FreeBSD 下用 c/c++ 复制大文件会卡住系统

c++ - 获取进程的 argc 和 argv 的替代方法

macos - 为什么我不能在不同的 fork 进程中使用 cocoa 框架?

linux - 如何检测系统是否在 UNIX shell 脚本中启用了 IPv6?