2016-03-16 2 views
1

Я использую ядро ​​3.16 и пытаюсь использовать LZ4 для сжатия данных в памяти. Я проверил дерево исходного кода ядра, нашел сжатия исходного файла /lib/lz4.c и я использовал следующую функцию:Как использовать функции сжатия LZ4 в модулях ядра?

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 ffffffffcae ffffffffc010d13a 00000000fb25afb4 
[ 31.657730] Call Trace: 
[ 31.657966] [<ffffffff81762590>] dump_stack+0x45/0x56 
[ 31.658424] [<ffffffff8175aa62>] panic+0xc8/0x1fc 
[ 31.658850] [<ffffffffcae>] ? 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

Размер стека ядра по умолчанию составляет 2 страницы. Таким образом, вы инициировали переполнение стека. Если вам нужен пример использования lz4 - посмотрите в zram, у него есть компрессия сжатия lz4. Стеклянные канарейки - это специальный механизм защиты от переполнения буфера (если вас интересует)

+0

Спасибо! Я проверяю коды zram недавно, я думаю, что они то, что мне нужно. И о переполнении стека я думаю, что вы правы. У меня были эти проблемы раньше, я проверю свои коды и посмотрю результаты, спасибо! – user3457702

+0

Я изменил свои коды, теперь они полностью работают. Благодаря! Это проблема с переполнением стека, я просто изменил ее на kmalloc. И функции lz4_compress & lz4_decompress могут корректно работать с сжатием. – user3457702

Смежные вопросы