Расположение кода обработки прерываний в ядре Linux для архитектуры x86 - PullRequest
1 голос
/ 25 января 2012

Я занимаюсь этим, пытаясь найти код в ядре Linux, который реализует обработку прерываний; в частности, я пытаюсь найти код, отвечающий за обработку системного таймера.

Согласно http://www.linux -tutorial.info / modules.php? Name = MContent & pageid = 86

Ядро обрабатывает прерывания очень похоже на то, как оно обрабатывает исключения: все регистры общего назначения помещаются в системный стек и вызывается общий обработчик прерываний. > Текущий приоритет прерывания сохраняется и загружается новый приоритет. Это предотвращает прерывание ядра при более низких уровнях приоритета, пока оно обрабатывает это прерывание. Затем вызывается настоящий обработчик прерываний.

Я ищу код, который помещает все регистры общего назначения в стек, и общий код обработки прерываний.

По крайней мере, перенос регистров общего назначения в стек не зависит от архитектуры, поэтому я ищу код, связанный с архитектурой x86. В данный момент я смотрю на версию 3.0.4 исходного кода ядра, но, возможно, подойдет любая версия. Я начал искать в kernel / irq / handle.c, но я не вижу ничего похожего на сохранение регистров; похоже, что он вызывает зарегистрированный обработчик прерываний.

Ответы [ 2 ]

1 голос
/ 25 января 2012

32-битные версии в arch/i386/kernel/entry_32.S, 64-битные версии в entry_64.S.Поиск различных макросов ENTRY, отмечающих точки входа в ядро.

0 голосов
/ 25 января 2012

Я ищу код, который помещает все регистры общего назначения в стек

Аппаратное обеспечение хранит текущее состояние (включая регистры) перед выполнением обработчика прерываний. Код не участвует. И когда прерывание завершается, аппаратное обеспечение считывает состояние с того места, где оно было сохранено.

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


На x86 аппаратное обеспечение сохраняет только те регистры, которые изменяются до запуска обработчика прерываний. На большинстве встроенных архитектур аппаратное обеспечение сохраняет все регистры. Причина разницы в том, что в x86 имеется огромное количество регистров, и сохранение и восстановление любого, не модифицированного обработчиком прерывания, было бы пустой тратой. Поэтому обработчик прерываний отвечает за сохранение и восстановление любых регистров, которые он добровольно использует.

См. Архитектура Intel® 64 и IA-32 Руководство разработчика программного обеспечения , начиная со страницы 6-15.

...