Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux 将Ext4作为内核模块进行修补和编译_Linux_Linux Kernel_Kernel Module_Qemu_Ext4 - Fatal编程技术网

Linux 将Ext4作为内核模块进行修补和编译

Linux 将Ext4作为内核模块进行修补和编译,linux,linux-kernel,kernel-module,qemu,ext4,Linux,Linux Kernel,Kernel Module,Qemu,Ext4,我目前正在为学术目的修补Ext4(仅限于linux/fs/Ext4/*,如file.c、ioctl.c、Ext4.h)。我正在开发QEMU虚拟机,为了加快整个过程,我选择了Ext4作为内核模块进行编译。在测试新更改时会出现问题,因为即使我运行makemodulesarch=x86&&makemodules\u install ARCH=x86并重新启动机器(/is Ext4),除非重新编译整个内核,否则这些更改都不可见。这有点奇怪,因为我有各种迹象表明Ext4已经编译为一个模块: $ make

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

$ 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
  • 其配置如下:

    $ 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\u install ARCH=x86
    之后,/lib/modules/3.13.3/kernel/fs/中的文件具有正确的时间戳

  • 最后:

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

  • 出于某种原因,我必须执行
    $makeall ARCH=x86
    ,以便在运行时看到我的更改。我错过了什么?谢谢

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

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

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

    相关的:


    谢谢,这当然是答案!我本可以想到的:)