0

在stackoverflow上向大家问好!

我正在尝试将 fpirntf() 添加到 XNU 内核 tcp_xxx.c 文件中,因此当 TCP 移动时,它可以将参数打印到文件中,以便更好地了解 TCP 的工作原理,但会发生如下致命错误:

$ sudo make ARCH_CONFIGS=X86_64 KERNEL_CONFIGS=DEBUG
CC tcp_output.o
/Users/wangweikai/Desktop/xnubuilder/xnu-2422.90.20/bsd/netinet/tcp_output.c:135:10: fatal error: 'stdio.h' file not found
#include <stdio.h>
         ^
1 error generated.
make[7]: *** [tcp_output.o] Error 1
make[6]: *** [build_all] Error 2
make[5]: *** [do_all] Error 2
make[4]: *** [build_all] Error 2
make[3]: *** [build_all_recurse_into_conf] Error 2
make[2]: *** [build_all_recurse_into_bsd] Error 2
make[1]: *** [build_all_bootstrap_DEBUG^X86_64^NONE] Error 2
make: *** [all] Error 2

看起来 xnu 源代码中没有 stdio.h,为了解决这个问题,我重新安装了 xcode 5.0.2(仅适用于 xnu-2422)并输出 mach_kernel 能够启动;我尝试在终端中通过“xcode-select --install”安装命令行工具,但都没有工作。顺便说一句,如果我在没有#include 的情况下添加 printf() 它不会出错,它看起来打印函数是由名称不是 stdio.h 的文件定义的。

由于我的意思是在文件中记录 TCP 参数(例如拥塞窗口大小和下一个序列号等)如何变化,所以如果有任何方法可以做到这一点,请告诉我,我对 xnu 和 C 完全陌生编程。

最好的祝福。

4

1 回答 1

3

标准 I/O(即 stdio)在内核中不可用。要从内核输出调试信息,请调用printf();它的输出将在内核日志中可见。直接从内核将数据写入文件是复杂的,并且很少被推荐。(在这种情况下,它实际上可能导致硬锁定,例如,如果要写入的文件位于网络卷上!)

如果您是 C 编程新手,这不是一个好的第一个项目。内核开发是困难的、无情的东西,尤其是对于 XNU 内核;错误通常会导致您的计算机崩溃,可能会丢失数据,并且调试服务通常不可用。但是,如果您一心想要检查操作系统内核,那么 Linux 内核会更容易使用——它可以在虚拟机中轻松启动和调试,并且文档记录要好得多。

于 2014-07-13T05:00:17.133 回答