【问题标题】:updating a kernel without recompiling the whole kernel更新内核而不重新编译整个内核
【发布时间】:2014-09-26 18:11:55
【问题描述】:

我正在从事 Linux 内核中的协议修改项目。

每次我在源代码中编辑一个字,我都需要制作、编译和加载所有模块并重新启动系统检查修改,这需要10多分钟。

有没有什么方法可以在不重新编译整个内核和/或不重新启动的情况下将修改后的代码添加到特定的内核模块?

我用来重新编译整个内核的代码是

make
make modules_install
make install
reboot

更新:@askb 的回答

我尝试了@askb 的回答并得到以下错误。

[@ 3.16.1]# make scripts && make prepare
  CHK     include/config/kernel.release
  CHK     include/generated/uapi/linux/version.h
  CHK     include/generated/utsrelease.h
  CALL    scripts/checksyscalls.sh
[@ 3.16.1]# make ./net/sctp/
  CHK     include/config/kernel.release
  CHK     include/generated/uapi/linux/version.h
  CHK     include/generated/utsrelease.h
  CALL    scripts/checksyscalls.sh
  CC [M]  net/sctp/output.o
  LD [M]  net/sctp/sctp.o
  LD [M]  net/sctp/sctp_probe.o
[@ 3.16.1]# cd ./net/sctp/
[@ sctp]# insmod sctp
insmod: ERROR: could not load module sctp: No such file or directory

【问题讨论】:

  • 如果您的代码是可加载模块的一部分,则无需编译内核,只需使用“make modules_install”和“insmod”来测试内核中的唯一功能。另请注意,如果您修改了部分静态内核源代码,则需要按照上述步骤进行操作
  • 如果您正在开发的模块是现有内核代码库的一部分或您正在编码的新内容,最好在您的描述中添加。
  • @askb 它是现有内核代码库的一部分。
  • @RatDon 那么提供的步骤应该会有所帮助,要检查您的模块是否已加载模块,请检查 .ko(内核对象)文件的目录。它更容易使用make menuconfig。按 包括将模块代码包含为内核的一部分, 排除, 模块化,即创建一个单独的 .ko。
  • @Ratdon,是的 - 这取决于您是要将功能构建为内核映像 (vmlinux) 的一部分还是可加载模块,一旦内核启动就可以加载该模块。跨度>

标签: linux-kernel kernel kernel-module


【解决方案1】:

首先,你不需要重建完整的内核代码库,如果它只是一个需要修改的模块。您只需准备一次内核 kconfig 和 makefile 脚本,构建内核模块并加载和卸载它,步骤如下。

make menuconfig
make scripts && make prepare
make ./path/to/module/dir
cd ./path/to/module/dir
insmod <module name>
rmmod <module name>

或者,如果您正在寻找在不重新启动的情况下测试、重新启动和/或升级修改后的内核的方法,请尝试使用 kexecksplice

【讨论】:

  • 我试过这个但没有成功。相应地更新了问题。
  • @Ratdon - 从更新的输出来看,sctp 似乎未启用编译为 .config 文件中的内核模块(应为 M)。尝试将其更改为使用 make menuconfig 编译为模块。
  • 我做到了。之后只有它显示上述错误。我猜想make 没有为 SCTP 创建内核对象文件。
  • 你可能在更改.config后跳过make scripts &amp;&amp; make prepare直接运行make &lt;path/to/dir&gt;
  • 不,我没有跳过。您可以在问题中查看我的代码。我正在浏览 SCTP 的 makefile,并且没有创建内核对象文件的规则。所以我正在尝试为此添加一些规则。
【解决方案2】:

您可以使用一些 IDE,例如 Eclipse。因此,您不必每次都构建整个项目并根据需要修改 make 文件。

因此,您只需重新启动物理/虚拟机的开销。

【讨论】:

  • 将尝试通知状态。
猜你喜欢
  • 2015-07-19
  • 2021-02-03
  • 1970-01-01
  • 2021-04-11
  • 2015-11-02
  • 2018-01-23
  • 1970-01-01
  • 2012-02-03
  • 2019-07-27
相关资源
最近更新 更多