【发布时间】:2015-04-03 03:36:02
【问题描述】:
如何在内核中静态编译syscall(或相应的库。不确定是哪一个)。我见过https://wiki.freebsd.org/AddingSyscalls。但它没有说明如何将我自己的源文件添加到 FreeBSD 自己的进行编译。
【问题讨论】:
如何在内核中静态编译syscall(或相应的库。不确定是哪一个)。我见过https://wiki.freebsd.org/AddingSyscalls。但它没有说明如何将我自己的源文件添加到 FreeBSD 自己的进行编译。
【问题讨论】:
如果你能够构建一个内核模块来添加你的系统调用(正如你在标题中通过“kldload”暗示的那样),你只需要做一个额外的步骤来让你的内核模块被静态编译到内核中 -使用“设备”调用在内核配置文件中列出它。
例如,查看我的/usr/src/sys/amd64/conf/GENERIC 内核配置文件,我看到cpufreq 的设备条目:
# CPU frequency control
device cpufreq
在/usr/src/sys/modules/cpufreq目录中,我看到了如下的Makefile:
hostname(/usr/src/sys/modules/cpufreq) # cat Makefile
.PATH: ${.CURDIR}/../../dev/cpufreq \
${.CURDIR}/../../${MACHINE_CPUARCH}/cpufreq
KMOD= cpufreq
SRCS= ichss.c
SRCS+= bus_if.h cpufreq_if.h device_if.h pci_if.h
.if ${MACHINE} == "i386" || ${MACHINE} == "amd64"
.PATH: ${.CURDIR}/../../x86/cpufreq
SRCS+= acpi_if.h opt_acpi.h
SRCS+= est.c hwpstate.c p4tcc.c powernow.c
.endif
.if ${MACHINE} == "i386"
SRCS+= smist.c
.endif
.if ${MACHINE} == "powerpc"
.PATH: ${.CURDIR}/../../powerpc/cpufreq
SRCS+= dfs.c
.endif
.include <bsd.kmod.mk>
解决 ${.CURDIR}/../../x86/cpufreq 后我们会转到 /usr/src/sys/x86/cpufreq,我们终于可以在其中找到该模块的源文件:
hostname(/usr/src/sys/x86/cpufreq) # ll
total 106
-rw-r--r-- 1 root wheel 43K Jan 21 2014 est.c
-rw-r--r-- 1 root wheel 13K Jan 21 2014 hwpstate.c
-rw-r--r-- 1 root wheel 9.1K Jan 21 2014 p4tcc.c
-rw-r--r-- 1 root wheel 23K Jun 11 2013 powernow.c
-rw-r--r-- 1 root wheel 12K Jun 11 2013 smist.c
由于我的内核配置中有一个device cpufreq 条目,我得到没有kldload 的cpufreq 模块
【讨论】:
device条目映射到一个目录/usr/src/sys/modules,即maked ?
KMOD 定义的 Makefile,如你在上面的 cpufreq Makefile 中看到了。