当前位置: 首页 > 知识库问答 >
问题:

如何在内核模块中使用LZ4压缩函数?

岳俊晖
2023-03-14

我正在使用内核3.16并尝试使用LZ4压缩内存中的数据。我检查了内核源代码树,找到了压缩源文件/lib/lz4。c和我使用了以下函数:

int lz4_compress(const unsigned char *src, size_t src_len,
            unsigned char *dst, size_t *dst_len, void *wrkmem)

但我得到了以下错误:

 31.652635] Kernel panic - not syncing: stack-protector: Kernel stack is corrupted in: ffffffffc010d13a
[   31.652635] 
[   31.653595] CPU: 0 PID: 1856 Comm: insmod Tainted: P           OE 3.16.0-30-generic #40~14.04.1-Ubuntu
[   31.654408] Hardware name: Parallels Software International Inc. Parallels Virtual Platform/Parallels Virtual Platform, BIOS 11.1.3 (32521) 02/16/2016
[   31.655579]  ffff8800aa33e080 ffff8801483d1c90 ffffffff81762590 ffffffff81a75d20
[   31.656295]  ffff8801483d1d08 ffffffff8175aa62 ffff880000000010 ffff8801483d1d18
[   31.657011]  ffff8801483d1cb8 ffffffffc01230ae ffffffffc010d13a 00000000fb25afb4
[   31.657730] Call Trace:
[   31.657966]  [<ffffffff81762590>] dump_stack+0x45/0x56
[   31.658424]  [<ffffffff8175aa62>] panic+0xc8/0x1fc
[   31.658850]  [<ffffffffc01230ae>] ? lz4_compress+0xae/0x1000 [lz4_compress]
[   31.659463]  [<ffffffffc010d13a>] ? hello_init+0x13a/0x140 [test]
[   31.660008]  [<ffffffffc010d000>] ? 0xffffffffc010cfff
[   31.660468]  [<ffffffff8106db2b>] __stack_chk_fail+0x1b/0x20
[   31.660970]  [<ffffffffc010d13a>] hello_init+0x13a/0x140 [test]
[   31.661626] Kernel Offset: 0x0 from 0xffffffff81000000 (relocation range: 0xffffffff80000000-0xffffffffbfffffff)
[   31.662512] ---[ end Kernel panic - not syncing: stack-protector: Kernel stack is corrupted in: ffffffffc010d13a
[   31.662512] 

我的源代码:

#include<linux/module.h>
#include<linux/slab.h>
#include<linux/kernel.h>
#include<linux/lz4.h>

static int hello_init(void){
    unsigned char buf[PAGE_SIZE];
    unsigned char data[PAGE_SIZE];
    int i;
    size_t comp_size;
    unsigned char *dst;
    dst=(unsigned char*)kmalloc(PAGE_SIZE, GFP_KERNEL);
    memset(dst,0,PAGE_SIZE);
    for(i=0;i<PAGE_SIZE;i++)
        data[i]=i;
    lz4_compress(data, PAGE_SIZE, dst, &comp_size, buf);
    return 0;
}

static void hello_exit(void){
    printk("clean up\n");
}

module_init(hello_init);
module_exit(hello_exit);

我试图找到一些关于LZ4如何在内核模块中工作的示例,但什么也没有找到。我不知道是否有人有在内核模块中进行压缩的经验。

谢啦!

共有1个答案

家志学
2023-03-14

默认情况下内核堆栈大小为2页。所以您启动了堆栈溢出。如果您需要使用-查看zram的lz4示例,它具有lz4压缩后端。堆栈金丝雀是一种防止缓冲区溢出攻击的特殊机制(如果您有兴趣)

 类似资料:
  • LZ4算法Linux3.11内核 我可以用这个算法压缩文件而不安装额外的软件包吗?

  • 我正在使用lz4压缩并将数据写入hive表,该表有20个文件,每个文件在HDFS上都是15G,并且该表的每个文件名都以lz4结尾,例如,。 当我从这个表中运行select count(1)时,它只启动了20个映射器,这意味着lz4 splittable不能生效。 据说lz4支持针对文本文件的可拆分性,所以我想问一下我应该做什么或其他步骤来实现这一点。

  • 问题内容: 因此,我试图编写一个使用linux / timer.h文件的内核模块。我让它只能在模块中工作,现在我正尝试从用户程序中使它工作。 这是我的内核模块: 更具体地说,我希望我的用户程序调用TimerSetup()函数。我知道我需要使用ioctl(),但是我不确定如何在我的模块文件中指定TimerSetup()应该可以通过ioctl()调用。 另外,我的第二个问题是:我可以使用正确的主编号将

  • 问题内容: 我正在从事学术项目,该项目修改了一些代码并包含了新代码。 我正在使用QEMU加载修改后的内核并进行测试。 但是,我发现某些操作系统需要完整的操作系统才能进行调试。 没有它可能吗? 或者,这是可以与Kernel 2.6一起用于系统的发行版。除了运行程序的功能(包括网络支持)以外,发行版不需要具有任何功能。 问题答案: 我认为最简单的方法是使用buildroot http://buildr

  • 内核模块 对于模块而言,引导选项只能用于直接编译到核心中的模块,格式是"模块名.选项=值",比如"usbcore.blinkenlights=1"。 动态加载的模块则可以在 modprobe 命令行上指定相应的选项值,比如"modprobe usbcore blinkenlights=1"。 可以使用"modinfo -p ${modulename}"命令显示可加载模块的所有可用选项。已经加载到内

  • 问题内容: 我想捕获某些NIC收到的帧。从中提取一些信息(当前我需要捕获源MAC和源IP地址);将这些信息保存在一些公共数据结构中;并让框架向上移动到TCP / IP堆栈。 我以前使用过Netfilter,但显然它不提供Link层挂钩。 有什么办法可以做到吗? 我将其编写为内核模块;运行Linux内核2.6.32 问题答案: 实际上,Netfilter应该可以正常工作,因为它接收了整个数据包(内部