>Скажите, лучше это сделать в области данных или в стэке?
В области данных (про bss речь?) можно выделить только фиксированную область.
Если нужны динамические структуры (нефиксированного размера), которые можно освобождать, то тут стоит использовать или стек или malloc.
У стека (локальные переменные и alloca) тот плюс, что не надо внимательно следить за освобождением памяти. С другой стороны, поскольку такая память освобождается автоматически, нужно быть осторожным с передачей указателей на эту память. Ну и про рекурсию верно сказано.
В моем примере, правда, SEGFAULT приходит не поэтому, но если собрать с -fstack-check, то будет тот же SEGFAULT и уже как раз из-за переполнения стека.
а что скажешь касательно модулей. Если не в стэке размещать массив, а в области данных ядра, будут ли проблемы при копироавнии большего массива ядром в свою область данных!
Можно ли где-нибудь почитать про то, как ядро линкут данные модулей в свою область даннх?
anonymous:
В ядре не рекомендуется на стеке размещать данные, т.к. стеки ядра - очень маленькие (одна или несколько страниц, при этом учитывай, что этот стек пользуют ядро выше модуля и могут использовать обработчики прерываний). В ядре все более-менее крупные структуры обычно выделяются динамически (alloc_pages, kmem_cache_alloc, page_cache_alloc). Данные, которые скомпонованы с модулем, подружаются modprobe (и сам код модуля) примерно так же, как это делает userspace run-time linker. Т.е. в принципе можно выделить массив в bss.
В последнем случае только есть один нюанс. Насколько я помню (а кода ядра под рукой нет) код и данные модулей всегда отображаются через vmalloc и следовательно на _все_модули_ может быть отведено порядка 128 Мб.
В ядре не рекомендуется на стеке размещать данные, т.к. стеки ядра - очень маленькие (одна или несколько страниц, при этом учитывай, что этот стек пользуют ядро выше модуля и могут использовать обработчики прерываний). В ядре все более-менее крупные структуры обычно выделяются динамически (alloc_pages, kmem_cache_alloc, page_cache_alloc). Данные, которые скомпонованы с модулем, подружаются modprobe (и сам код модуля) примерно так же, как это делает userspace run-time linker. Т.е. в принципе можно выделить массив в bss.
В последнем случае только есть один нюанс. Насколько я помню (а кода ядра под рукой нет) код и данные модулей всегда отображаются через vmalloc и следовательно на _все_модули_ может быть отведено порядка 128 Мб.
В ядре не рекомендуется на стеке размещать данные, т.к. стеки ядра - очень маленькие (одна или несколько страниц, при этом учитывай, что этот стек пользуют ядро выше модуля и могут использовать обработчики прерываний). В ядре все более-менее крупные структуры обычно выделяются динамически (alloc_pages, kmem_cache_alloc, page_cache_alloc). Данные, которые скомпонованы с модулем, подружаются modprobe (и сам код модуля) примерно так же, как это делает userspace run-time linker. Т.е. в принципе можно выделить массив в bss.
В последнем случае только есть один нюанс. Насколько я помню (а кода ядра под рукой нет) код и данные модулей всегда отображаются через vmalloc и следовательно на _все_модули_ может быть отведено порядка 128 Мб.