Сомнения в механизме системных вызовов в Linux

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

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

Затем я прочитал, что переход с кольца 3 на кольцо 0 не так дорого, как переход с кольца 0 на кольцо 3. Почему это так ??

Спасибо, Бала


person bala1486    schedule 11.05.2010    source источник
comment
Эта статья: Механизм системного вызова на основе Sysenter в Linux 2.6 должна ответить на большинство ваших вопросов.   -  person WhirlWind    schedule 11.05.2010


Ответы (1)


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

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

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

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

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

person caf    schedule 11.05.2010