【问题标题】:Patching and compiling Ext4 as a kernel module修补和编译 Ext4 作为内核模块
【发布时间】:2014-07-01 12:54:43
【问题描述】:

我目前正在为学术目的修补 Ext4(仅限 linux/fs/ext4/*,如 file.c、ioctl.c、ext4.h)。我正在开发 QEMU 虚拟机,为了加快整个过程,我选择了 Ext4 编译为内核模块。在测试新更改时会出现问题,因为即使我运行make modules ARCH=x86 && make modules_install ARCH=x86 并重新启动机器(/ 是 Ext4),除非我重新编译整个内核,否则它们是不可见的。这有点奇怪,因为我有各种迹象表明 Ext4 已被编译为模块:

  1. 是这样配置的:

    $ grep EXT4 .config
    CONFIG_EXT4_FS=m
    
  2. 它确实作为一个模块编译:

    $ make modules ARCH=x86
    (...)
    CC [M]  fs/ext4/ioctl.o
    LD [M]  fs/ext4/ext4.o
    Building modules, stage 2.
    MODPOST 3 modules
    LD [M]  fs/ext4/ext4.ko
    
  3. $ make modules_install ARCH=x86 之后 /lib/modules/3.13.3/kernel/fs/ 中的文件具有正确的时间戳。

  4. 最后:

    $ lsmod
    Module                  Size  Used by
    ext4                  340817  1
    (...)
    

出于某种原因,我必须执行$ make all ARCH=x86 才能看到我的更改出现在运行时中。我错过了什么?谢谢!

【问题讨论】:

    标签: linux linux-kernel kernel-module qemu ext4


    【解决方案1】:

    大多数启动进程使用“初始 ramdisk”(initrd),其中包含内核需要加载以执行任何操作的所有内核模块 - 毕竟,要从 Ext4 文件系统读取文件,内核需要此文件系统的驱动程序,如果驱动程序在所述文件系统上,那么,...

    因此解决方案是将所有这些文件打包到存档(初始 ramdisk)中,并将硬盘块保存为引导加载程序中的数字列表。然后它可以使用原始的 IDE/SATA 驱动程序直接加载块,提取驱动程序并加载它们。

    查看您的 linux 发行版的文档以了解如何更新 initrd。在我的 Ubuntu Linux 上,它是 mkinitramfs

    相关:

    【讨论】:

    • 谢谢,这当然是答案!我本可以想到的 :)
    猜你喜欢
    • 2020-03-16
    • 1970-01-01
    • 2020-08-15
    • 2011-05-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多