Размеры стека Linux

#linux #linux-kernel #linux-device-driver

#linux #linux-ядро #linux-драйвер устройства

Вопрос:

Я ищу хорошее описание стеков в ядре Linux, но мне на удивление трудно найти что-либо полезное.

Я знаю, что стеки ограничены 4k для большинства систем и 8k для других. Я предполагаю, что у каждого потока ядра / нижней половины есть свой собственный стек. Я также слышал, что если прерывание прерывается, оно использует стек текущего потока, но я не могу найти никакой документации ни по одному из этого. Что я ищу, так это то, как распределены стеки, есть ли для них какие-либо хорошие процедуры отладки (я подозреваю переполнение стека для конкретной проблемы, и я хотел бы знать, возможно ли скомпилировать ядро для определения размеров стека и т.д.).

Комментарии:

1. с какой версией ядра вы работаете? итак, у нас есть лучшее представление о доступных вам параметрах конфигурации отладки ядра.

2. Кажется, я этого не понимаю. Почему для этой задачи недостаточно отладчика?

3. «нижние половины», вероятно, используют один и тот же стек. Кроме того, «нижние половинки» исчезли давным-давно, теперь остались softirqs.

4. Используйте ulimit -s команду. Результат в КБ.

5. Речь идет о пользовательской области или kthreads? Пользовательское пространство: unix.stackexchange.com/questions/145557 /…

Ответ №1:

Причина нехватки документации заключается в том, что эта область сильно зависит от архитектуры. Код действительно является лучшей документацией — например, THREAD_SIZE макрос определяет (зависящий от архитектуры) размер стека ядра для каждого потока.

Стеки распределяются в alloc_thread_stack_node() . Указатель стека в struct task_struct обновляется в dup_task_struct() , который вызывается как часть клонирования потока.

Ядро проверяет переполнение стека ядра, помещая значение canary STACK_END_MAGIC в конец стека. В обработчике ошибок страницы, если возникает ошибка в пространстве ядра, проверяется эта канарейка — см., Например, обработчик ошибок x86, который печатает сообщение Thread overran stack, or stack corrupted после сообщения Oops, если канарейка стека была заблокирована.

Конечно, это сработает не при всех переполнениях стека, а только при тех, которые приводят к переполнению стековой канарейки. Тем не менее, вы всегда должны быть в состоянии определить из выходных данных Oops, произошел ли у вас переполнение стека — это в том случае, если указатель стека находится ниже task->stack .

Ответ №2:

Вы можете определить размер стека процесса с помощью ulimit команды. Я получаю 8192 КБ в своей системе:

 $ ulimit -s
8192
  

Комментарии:

1. Ответ низкого качества, потому что вопрос касался ядра. Цитирую «стеки внутри ядра Linux» .

2. @MilesRout Виноват, я думаю, что это касалось размера стека ядра.

3. Действительно, кажется, что это неподходящее место для ответа на этот вопрос, но искренне помогите мне с поиском размера стека процесса (поскольку вопрос отвечает на него)

4. @ManoelVilela введите ulimit -s в строку cmd

Ответ №3:

Для процессов вы можете управлять размером стека процессов с помощью ulimit команды ( -s option). Для потоков размер стека по умолчанию сильно варьируется, но вы можете управлять им с помощью вызова pthread_attr_setstacksize() (при условии, что вы используете pthreads).

Что касается прерывания с использованием пользовательского стека, я несколько сомневаюсь в этом, поскольку доступ к пользовательской памяти является своего рода проблемой для ядра, особенно из-за процедуры прерывания. Но я не знаю наверняка.