Сомнения в механизме системных вызовов в Linux - PullRequest
3 голосов
/ 11 мая 2010

Мы переходим от ring3 к ring0, используя 'int' или новую инструкцию 'syscall / sysenter'. Означает ли это, что таблицы страниц и другие элементы, которые необходимо изменить для ядра, автоматически выполняются инструкцией 'int' или обработчиком прерываний для 'int 0x80' выполнит необходимые действия и перейдет к соответствующему системному вызову.

Также при возвращении из системного вызова нам снова нужно перейти в пространство пользователя. Для этого нам нужно знать адрес инструкции в пользовательском пространстве, чтобы продолжить работу пользовательского приложения. Где хранится этот адрес. Инструкция «ret» автоматически меняет кольцо с ring3 на ring0 или где / как происходит этот механизм изменения кольца?

Затем я прочитал, что переход с ring3 на ring0 не так затратен, как с ring0 на ring3. Почему это так?

Спасибо, Bala

1 Ответ

6 голосов
/ 11 мая 2010

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

Инструкция int 0x80 обслуживается шлюзом-ловушкой, который предоставляет адрес для процессора, к которому нужно перейти в виде пары CS: EIP. Новый CS (селектор сегмента кода) включает в себя CPL (текущий уровень привилегий), равный 0, что влияет на переход к ring0.

Из-за перехода с ring3 на ring0 процессор также выбирает новые значения для SS: ESP из TSS (селектор сегмента задачи) и сохраняет старые в TSS. Это переключается со стека пользовательского режима на стек ядра.

Предыдущий CS: EIP затем помещается в стек ядра (это адрес возврата в пространстве пользователя). Все это выполняется процессором благодаря самой инструкции int 0x80.

Инструкция IRET может использоваться для возврата в пользовательское пространство - она ​​извлекает CS: EIP из стека ядра. Поскольку CS включает в себя CPL, равный 3, процессор переключается обратно на ring3, что заставляет его переключаться обратно на стек ring3.

...