Внутренние компоненты системного вызова Linux - PullRequest
29 голосов
/ 20 февраля 2010

Что происходит (подробно), когда поток выполняет системный вызов, вызывая прерывание 80? Какую работу Linux выполняет со стеком потока и другим состоянием? Какие изменения внесены в процессор, чтобы перевести его в режим ядра? После запуска обработчика прерываний, как управление восстанавливается обратно в вызывающий процесс?

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

Ответы [ 4 ]

38 голосов
/ 20 февраля 2010

Ускоренный курс в режиме ядра в одном переполнении стека ответ

Хорошие вопросы!(Вопросы для интервью?)


  • Что происходит (подробно), когда поток выполняет системный вызов, вызывая прерывание 80?

Операция int $ 80 неопределеннокак вызов функции.Процессор «берет ловушку» и перезапускается по известному адресу в режиме ядра, как правило, с другим режимом MMU.Ядро сохранит многие регистры, хотя ему не нужно сохранять регистры, которые программа не ожидает сохранения при обычном вызове функции.

  • Какую работу Linux выполняет со стеком потокаи другое состояние?

Обычно ОС сохраняет регистры, которые ABI обещает не изменять во время вызовов процедур.Стек останется прежним;ядро будет работать на стеке ядра для каждого потока, а не на стеке пользователя для каждого потока.Естественно, какое-то состояние изменится, в противном случае не будет никаких причин делать системный вызов.

  • Какие изменения внесены в процессор для перевода его в режим ядра?

Это обычно полностью автоматически.Процессор, как правило, имеет команду программного прерывания, которая немного похожа на операцию функционального вызова.Это приведет к переключению в режим ядра в контролируемых условиях.Как правило, ЦП изменяет своего рода защитный бит PSW, сохраняет старый PSW и ПК, запускается с хорошо известного адреса вектора перехвата и может также переключаться на другую схему защиты и отображения управления памятью.

  • После запуска обработчика прерываний, как управление восстанавливается обратно в вызывающий процесс?

Там будет какая-то инструкция «возврат из прерывания» или «возврат из прерывания», обычно такая, чтобудет действовать как сложная инструкция возврата функции.Некоторые процессоры RISC делали очень мало автоматически и требовали специального кода для выполнения возврата, а некоторые процессоры CISC, такие как x86, имеют (никогда не используемые) инструкции, которые выполняли бы десятки операций, документированных на страницах псевдокода руководства по архитектуре для настройки возможностей.

  • Что делать, если системный вызов не может быть выполнен быстро: например, чтение с диска.Как обработчик прерываний отказывается от управления, чтобы процессор мог выполнять другие действия во время загрузки данных и как он затем снова получает управление?

Само ядро ​​является многопоточным, как многопоточная пользовательская программа.,Он просто переключает стеки (потоки) и некоторое время работает над чужим процессом.

7 голосов
/ 20 февраля 2010

Чтобы ответить на последнюю часть вопроса - что делает ядро, если системный вызов должен спать -

После системного вызова ядро ​​все еще логически работает в контексте той же задачи, которая выполняла системный вызов - это просто в режиме ядра, а не в пользовательском режиме - это НЕ отдельный поток, и большинство системных вызовов не вызывают логика из другой задачи / потока. В результате системный вызов вызывает wait_event, wait_event_timeout или другую функцию ожидания, которая добавляет задачу в список задач, ожидающих чего-то, затем переводит задачу в спящий режим, которая меняет ее состояние, и вызывает schedule () для отмены текущий процессор.

После этого задание не может быть запущено снова, пока оно не проснется, обычно другой задачей (задачей ядра и т. Д.) Или обработчиком прерываний, вызывающим функцию wake *, которая разбудит задание (я), ожидающее это конкретное событие. , что означает, что планировщик скоро запланирует их снова.

Стоит отметить, что задачи в пользовательском пространстве (то есть потоки) представляют собой только один тип задач, и есть несколько других внутренних функций ядра, которые также могут работать - это потоки ядра и обработчики нижней части / очереди задач / очереди задач и т. Д. Работа, которая не принадлежит какому-либо конкретному процессу пользовательского пространства (например, обработка сети, например, реагирование на пинг), выполняется в них. Этим задачам разрешается переходить в спящий режим, в отличие от прерываний (которые не должны вызывать планировщик)

3 голосов
/ 20 февраля 2010
0 голосов
/ 03 ноября 2016

Это должно помочь людям, которые ищут ответы на то, что происходит при выполнении инструкции syscall, которая передает управление ядру (пользовательский режим в режим ядра).Это основано на архитектуре x86_64.

https://0xax.gitbooks.io/linux-insides/content/SysCall/syscall-2.html

...