V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
sbldehanhan
V2EX  ›  Ubuntu

可以单独编译内核中已有的模块吗?

  •  
  •   sbldehanhan · 204 天前 · 1522 次点击
    这是一个创建于 204 天前的主题,其中的信息可能已经有所发展或是发生改变。

    例如 mac80211 这个模块,我修改之后不想替换原来系统中的整个内核,只想可以单独编译出 mac80211.ko ,然后用 insmod 插入或者放到系统中。但是我在 mac80211 目录中用 make -C /usr/src/linux-headers-x.y.z M=pwd modules 编译时报错。怎么操作才能像自己写的模块那样单独编译?

    9 条回复    2024-04-23 16:38:45 +08:00
    yolee599
        1
    yolee599  
       204 天前
    1. 可以单独编译,但是如果你内核中的 mac80211 是配置成 y 是不能再 insmod ;
    2. 报错是报什么错?
    FranzKafka95
        2
    FranzKafka95  
       204 天前 via Android
    说实话还真没有试过,如果原来分内核配置为 y 而非 m ,打包到 Image 了,是有可能无法再 insmod 该模块的
    wniming
        3
    wniming  
       204 天前
    可以单独编译模块,配置好 config 后只需要 2 步:

    1, make modules_prepare
    2, make KBUILD_MODPOST_WARN=1 -j32 M=net/mac8021

    注意要在源码树的根目录下执行。
    Donaldo
        4
    Donaldo  
       204 天前
    @yolee599 #1 那可以先 rmmod 然后再 insmod 新的么?
    sbldehanhan
        5
    sbldehanhan  
    OP
       204 天前
    @wniming #3 试了一下,这样的确可以做到单独编译 mac80211 ,但是编译出来的 ko 插不到系统中,因为这个 ko 编译用的头文件是源码的头文件,不是系统的文件。有什么办法能让它用系统的头文件吗?
    wniming
        6
    wniming  
       204 天前
    @sbldehanhan #5 如果你用的是 redhat 系列可以参考如下步骤,我用 fedora39 作为演示:

    1, dnf download --source kernel-core
    2, rpm -ivh kernel-6.5.6-300.fc39.src.rpm
    3, rpmbuild -bp ~/rpmbuild/SPECS/kernel.spec
    4, cd ~/rpmbuild/BUILD/kernel-6.5.6/linux-6.5.6-300.fc39.x86_64
    5, cp /usr/src/kernels/6.5.6-300.fc39.x86_64/Makefile . # 需要安装 kernel-devel 包
    6, cp /usr/src/kernels/6.5.6-300.fc39.x86_64/.config . # 需要安装 kernel-devel 包

    然后执行我 #3 楼给出的步骤。

    如果是 debian 系列你自行研究,方法类似,就是包的名称不一样。
    GavinXSF
        7
    GavinXSF  
       204 天前
    应该先需要 `apt install linux-headers-$(uname -r)` 安装一下构建的 kernel headers

    然后参考:
    https://docs.kernel.org/kbuild/modules.html
    `make -C /lib/modules/`uname -r`/build M=$PWD`
    用已安装的本机内核树去构建

    编译模块的 magic number 必须和正在运行的 kernel 对的上,才能正常插入,不然不被允许插入
    wniming
        8
    wniming  
       204 天前
    @GavinXSF #7 你这种方式比我 #6 楼给出的方式更简单,不需要第 5 和第 6 步,只需要 cd 到 mac80211 的目录,直接命令行执行:

    make -j32 -C /lib/modules/`uname -r`/build M=$PWD

    就可以了。
    sbldehanhan
        9
    sbldehanhan  
    OP
       200 天前
    @wniming #8 这种方式编译成功了,一开始可能是因为用的内核源码和系统头文件不匹配,编译时会报某些操作的数据类型不匹配。用系统提供的源码就成功了。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1040 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 21ms · UTC 23:11 · PVG 07:11 · LAX 15:11 · JFK 18:11
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.