Stackoverflow в модуле ядра - PullRequest
0 голосов
/ 04 ноября 2018

Я читаю книгу «Ядро Linux. Разработка. Третье издание». Роберт Лав.

Что я прочитал о размере стека в этой книге:

На x86 размер стека настраивается во время компиляции и может быть или 4 КБ или 8 КБ. Исторически, стек ядра состоит из двух страниц, которые обычно подразумевает, что это 8 КБ на 32-битных архитектурах и 16 КБ на 64-битные архитектуры - этот размер фиксированный и абсолютный

У меня есть виртуальная машина с 64-битным ядром ubuntu 16.06 4.15. Таким образом, мой размер стека должен быть 16000 байт (16 КБ)

Я пытаюсь проверить поведение stackoverflow. Я создаю массив в стеке, который использует более 16000 байтов.

#include <linux/module.h>
#include <linux/init.h>

int __init overflow_start(void)
{
        printk(KERN_INFO "Overflow Test\n");
        char array[170000] = {[0 ... 16999] =  'A'};

        printk(KERN_ERR "%c\n", array[16999]);

        return 0;
}

void __exit overflow_end(void)
{
        printk(KERN_ERR "Test success\n");
}

module_init(overflow_start);
module_exit(overflow_end);

MODULE_LICENSE("GPL");

Я думаю, что я должен увидеть панику ядра с разбиванием стека или что-то подобное, но я вижу только правильный вывод. Почему это не сломать стек?

1 Ответ

0 голосов
/ 04 ноября 2018

Вы также можете сделать массив изменчивым, и GCC не будет его оптимизировать.

volatile char array[170000] = {[0 ... 16999] =  'A'};
...