首页 > 解决方案 > 在 Linux 内核中向用户空间公开一个额外的标头

问题描述

我一直在维护 Linux-4.9 内核的本地补丁以进行一项研究。该补丁添加了三个系统调用。系统调用适合上游。

到目前为止,我已经习惯make deb-pkg为我的内核生成 Debian 软件包。安装后,用户空间可以使用构建过程生成的宏syscall(2)之一来调用新的系统调用。__NR_...

我要解决的问题是:定义系统调用编号的标头位于libc-devmake deb-pkg. 安装 customlibc-dev会造成严重破坏apt-get(上次我安装 customlibc-dev时,它卸载了所有 llvm 和 gcc,并且apt-get在我不理解的一些奇怪的“持有包”场景中无法使用(尽管dpkg --get-selections没有显示持有包))。

我想做的是用内核头文件发送我自己制作的头文件,从而libc-dev完全避免可怕的包。

我的补丁krun在内核源目录的顶层添加了一个目录:

$ find krun
krun
krun/test_prog
krun/Makefile
krun/test_prog.c
krun/krun_reg.h
krun/.gitignore
krun/krun-kernel.h
krun/krun.c

从阅读Linux-4.9 Kernel Docs看来我应该能够krun-kernel.h使用header-y.

所以krun/Makefile看起来像这样:

obj-y := krun.o
header-y += krun-kernel.h

test_prog: test_prog.c
        ${CC} ${CFLAGS} ${LDFLAGS} -Wall -Wextra -o $@ $<
clean:
        rm -f test_prog

在顶级 Makefile 中,我有:

core-y          += krun/                                                        
header-y        += krun/ 

但是,如果我运行:

$ make headers_install INSTALL_HDR_PATH=./tmp_hdrs

我的标题在tmp_hdrs.

这有可能吗?谢谢。

标签: linux-kernelheader

解决方案


我将尝试回答我自己的问题。

使用 Kbuild,您似乎可以做两件事 WRT 标头:

  • 将它们暴露给用户空间并将它们打包到libc-dev.
  • 将它们安装为内核头文件,用户空间不能包含这些头文件。

所以我所要求的无法完成。

对我来说最好的解决方案是(可悲地)手动将标题复制到系统的包含目录中。


推荐阅读