#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).
Что касается прерывания с использованием пользовательского стека, я несколько сомневаюсь в этом, поскольку доступ к пользовательской памяти является своего рода проблемой для ядра, особенно из-за процедуры прерывания. Но я не знаю наверняка.