我目前正在出于学术目的对Ext4进行补丁(仅linux/fs/ext4/*,例如file.c,ioctl.c,ext4.h)。我正在QEMU虚拟机上工作,为了加快整个过程,我选择了Ext4作为内核模块进行编译。测试新更改时会出现问题,因为即使我运行make modules ARCH=x86 && make modules_install ARCH=x86并重新引导计算机(/是Ext4),它们也将不可见,除非我重新编译整个内核。有点怪异,因为我有各种各样的迹象表明Ext4已被编译为模块:

  • 配置为:
    $ grep EXT4 .config
    CONFIG_EXT4_FS=m
    
  • 它确实可以作为模块进行编译:
    $ 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
    
  • $ make modules_install ARCH=x86之后,/lib/modules/3.13.3/kernel/fs/中的文件具有正确的时间戳。
  • 最后:
    $ lsmod
    Module                  Size  Used by
    ext4                  340817  1
    (...)
    

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

    最佳答案

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

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

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

    有关的:

  • Linux initial RAM disk (initrd) overview
  • 关于linux - 修补和编译Ext4作为内核模块,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/24510849/

    10-09 00:07