如何为 X86 上的 ARM 创建内核头文件?

如何为 X86 上的 ARM 创建内核头文件?

我有一个基于 ARM 的板,我将其与工厂内核 (5.10.110) 一起使用。

要手动构建内核模块,我需要内核头包。要安装此软件包,请参阅文档:

sudo dpkg -i /opt/linux-headers-*.deb

这创建了以下结构:

/lib/modules/5.10.110$ ls -la
total 1584
drwxr-xr-x 1 root root   4096 Apr 29 15:13 .
drwxr-xr-x 1 root root   4096 Jul 10 21:36 ..
lrwxrwxrwx 1 root root     31 Feb 20 07:05 build -> /usr/src/linux-headers-5.10.110
drwxr-xr-x 2 root root   4096 Feb 20 13:29 extra
drwxr-xr-x 1 root root   4096 Feb 20 13:29 kernel
-rw-r--r-- 1 root root 327270 Apr 29 15:13 modules.alias
-rw-r--r-- 1 root root 346627 Apr 29 15:13 modules.alias.bin
-rw-r--r-- 1 root root  28645 Feb 20 13:29 modules.builtin
-rw-r--r-- 1 root root      0 Apr 29 15:13 modules.builtin.alias.bin
-rw-r--r-- 1 root root  30656 Apr 29 15:13 modules.builtin.bin
-rw-r--r-- 1 root root 164216 Feb 20 13:29 modules.builtin.modinfo
-rw-r--r-- 1 root root  95077 Apr 29 15:13 modules.dep
-rw-r--r-- 1 root root 153551 Apr 29 15:13 modules.dep.bin
-rw-r--r-- 1 root root    140 Apr 29 15:13 modules.devname
-rw-r--r-- 1 root root  51432 Feb 20 13:29 modules.order
-rw-r--r-- 1 root root    468 Apr 29 15:13 modules.softdep
-rw-r--r-- 1 root root 163120 Apr 29 15:13 modules.symbols
-rw-r--r-- 1 root root 206275 Apr 29 15:13 modules.symbols.bin

现在我必须重新编译整个内核,版本从 5.10.110 增加到5.10.160

所以现在,当我尝试编译内核模块时,它找不到所需的标头。

5.10.110 中的 Build 文件夹包含以下文件:

/lib/modules/5.10.110/build$ ls -la
total 1364
drwxr-xr-x  5 root root    4096 Apr 29 15:03 .
drwxr-xr-x  1 root root    4096 Jul 10 22:35 ..
-rw-r--r--  1 root root  220133 Feb 20 07:05 .config
-rw-r--r--  1 root root   68886 Dec  1  2022 Makefile
-rw-r--r--  1 root root 1075160 Feb 20 07:02 Module.symvers
drwxr-xr-x  3 root root    4096 Apr 29 15:03 arch
drwxr-xr-x 31 root root    4096 Apr 29 15:03 include
drwxr-xr-x 17 root root   12288 Apr 29 15:03 scripts

如何重新创建这些标头以针对版本 5.10.160 的新内核构建自定义内核模块?

我做了各种尝试:从交叉编译内核的计算机中复制这些文件夹:不起作用,因为“scripts”文件夹包含不在 aarch64 上执行的机器代码(x86_64)。

然后我从 5.10.110 复制了“scripts”文件夹,但我不确定它是否可以,或者是否会造成伤害或不需要的结果。

那么如何交叉编译环境来构建自定义内核模块呢?

答案1

我有一个基于 ARM 的板,我将其与工厂内核 (5.10.110) 一起使用。

要手动构建内核模块,我需要内核头包。

您有一个基于 ARM 的板,但您可能使用基于 Intel 的 PC 主机通过交叉编译器/工具链执行此模块构建。您的dpkg命令获取并安装了为您的 PC 主机安装的 Linux 发行版的标头。但是您需要基于 ARM 的主板所使用的内核版本的标头。


首先您需要下载特定内核版本的 tarball,即 5.10.110。您忽略了这是否是 Linux 内核的主线版本,或者是由芯片或板制造商修改的版本。

Linux 内核主线版本的源代码可从Linux 内核档案。主线版本 5.10.110 的 tarball 是这里(gzip 压缩)

无论如何,获取/下载适当的源代码。
解压并安装此源代码树,与您的 PC 发行版安装完全分开。建议您使用下面的开发目录/家用于您的交叉编译任务。


一旦子目录中有所需版本的内核源代码,您就可以使用make headers_installshell 中的命令导出该内核的头文件。
参考本指南:

Exporting kernel headers for use by userspace
=============================================

The "make headers_install" command exports the kernel's header files in a
form suitable for use by userspace programs.
...

The "make headers_install" command can be run in the top level directory of the
kernel source code (or using a standard out-of-tree build).  It takes two
optional arguments:

  make headers_install ARCH=i386 INSTALL_HDR_PATH=/usr 

再次,我建议您安装这些与您的主机系统无关的标头,用于在更本地的地方进行交叉编译,例如下面的开发目录/家(即不要盲目使用上面的例子)。

相关内容