Подтвердить что ты не робот

Как осуществляется системный вызов в Linux?

Когда я вызываю системный вызов в пользовательском режиме, как вызов обрабатывался в ОС?

Вызывает ли он какую-то исполняемую двоичную или некоторую стандартную библиотеку?

Если да, для чего нужно завершить вызов?

4b9b3361

Ответ 1

Посмотрите этот.

Начиная с версии 2.5, linux Ядро ввел новый системный вызов входной механизм на Pentium II + процессоры. Из-за проблем с производительностью на процессорах Pentium IV с существующими программного прерывания, альтернативная запись системного вызова механизм был реализован с использованием Инструкции SYSENTER/SYSEXIT доступный на процессорах Pentium II+. В этой статье рассматривается это новое механизм. Обсуждение ограничено архитектура x86 и весь исходный код списки основаны на ядре linux 2.6.15.6.

  • Что такое системные вызовы?

    Системные вызовы предоставляют пользовательскую область обрабатывает способ запроса услуг из ядра. Какого рода Сервисы? Услуги, которые управляются с помощью операционной системы, такой как хранилище, память, сеть, управление процессами и т.д. Например, если пользовательский процесс хочет прочитать файл, ему придется делать "открытые" и "читать" системные вызовы. Обычно системные вызовы не вызываются непосредственно процессами. C библиотека обеспечивает интерфейс для всей системы вызовы.

  • Что происходит при системном вызове?

    Фрагмент кода ядра запускается запрос пользовательского процесса. Этот код работает в кольце 0 (с текущей привилегией уровень -CPL-0), который является самым высоким уровень привилегий в x86 архитектура. Все пользовательские процессы выполняются в кольце 3 (CPL 3).

    Итак, чтобы реализовать механизм системного вызова, нам нужно

    1) способ вызова кольца 0 из кольца 3.

    2) некоторый код ядра для обслуживания запроса.

  • Хороший старый способ сделать это

    До тех пор, пока некоторое время назад Linux не использовался осуществлять системные вызовы на всех x86 платформы, использующие программные прерывания. Чтобы выполнить системный вызов, пользовательский процесс скопирует желаемый номер системного вызова до% eax и выполнит 'int 0x80'. Это вызовет прерывание 0x80 и процедура обслуживания прерывания будет называется. Для прерывания 0x80 это подпрограмма - это "все системные вызовы" обработки ". Эта процедура будет выполнить в кольце 0. Эта процедура, как определенный в файле /usr/src/linux/arch/i 386/kernel/entry.S, сохранит текущее состояние и вызовет соответствующий обработчик системных вызовов на значение в% eax.

  • Новый блестящий способ сделать это

    Было обнаружено, что это программное обеспечение метод прерывания был намного медленнее Процессоры Pentium IV. Чтобы решить эту проблему выпуск, Linus внедрил альтернативный механизм системного вызова использовать SYSENTER/SYSEXIT инструкции, предоставленные всем Pentium II+. Прежде чем идти дальше с этим новым способом сделать это, давайте ознакомьтесь с эти инструкции.

Ответ 2

Это зависит от того, что вы подразумеваете под системным вызовом. Вы имеете в виду вызов библиотеки C (через glibc) или фактический системный вызов? Вызов библиотеки C всегда заканчивается использованием системных вызовов в конце.

Старый способ выполнения системных вызовов заключался в программном прерывании, т.е. в инструкции int. Windows имела int 0x2e, а Linux - int 0x80. ОС устанавливает обработчик прерываний для 0x2e или 0x80 в таблице дескрипторов прерываний (IDT). Затем этот обработчик выполняет системный вызов. Он копирует аргументы из режима пользователя в режим ядра (это контролируется соглашением по ОС). В Linux аргументы передаются с использованием ebx, ecx, edx, esi и edi. В Windows аргументы копируются из стека. Затем обработчик выполняет какой-то поиск (чтобы найти адрес функции) и выполняет системный вызов. После завершения системного вызова команда iret вернется в пользовательский режим.

Новый способ - sysenter и sysexit. Эти две инструкции в основном делают для вас всю работу регистра. ОС задает инструкции через специализированные регистры модели (MSR). После этого он практически совпадает с использованием int.

Ответ 3

Он проходит через glibc, который выдает прерывание 0x80 после заполнения регистров параметрами. Обработчик прерываний ядра затем просматривает syscall в таблице syscall и вызывает соответствующую функцию sys _ *().

Ответ 4

Очень упрощенно, но случается, что прерывание возникает, когда вы пытаетесь получить доступ к зарезервированному адресу памяти. Прерывание переключает контекст в режим ядра и выполняет код ядра (фактический системный вызов) от имени пользователя. По завершении вызова управление возвращается в код пользователя.

Ответ 5

int X в ассемблере преобразуется в номер системного вызова n.
Ех, прочитанный syscall, может быть присвоен номер 4.
При запуске системы ОС строит таблицу указателей, называемую таблицей дескриптора прерываний (IDT), которая имеет список адресов для системных вызовов с привилегией, необходимой для их выполнения.
Текущий уровень привилегий (CPL) сохраняется в одном из битов регистра CS (технически 2 бит на x86).
Это шаги, за которыми следует инструкция int:
• Получить n-й дескриптор из IDT, где n - аргумент int.
• Убедитесь, что CPL в% cs равен <= DPL, где DPL является уровнем привилегий в дескрипторе.
• Если нет, то у пользователя не было достаточных привилегий для выполнения этого и приведет к выполнению команды int 13 (общая ошибка защиты) (у пользователя не было достаточно привилегий)
• Если да, то для этого системного вызова у пользователя есть достаточно привилегий, текущий контекст выполнения сохраняется (регистры и т.д.), Потому что теперь мы переключаемся в режим ядра.
Информация включает регистры, флаги, поскольку, когда системный вызов финиширован, мы хотим продолжить выполнение с того места, где мы ушли. • Параметры для системного вызова сохраняются в стеке ядра, поскольку системный вызов выполняется в режиме ядра.

VSYSCALL (БЫСТРАЯ СИСТЕМНАЯ ВЫЗОВ)
Каждый раз, когда системный вызов выполняется пользователем, Os сохраняет текущее состояние машины (например, регистр, указатель стека и т.д.) И переключается в режим ядра для выполнения. Для некоторого системного вызова нет необходимости сохранять весь регистр. Ex gettime дневного системного вызова считывает текущее время и возвращается системный вызов. Таким образом, некоторые системные вызовы реализуются через так называемые vsyscalls. Здесь, когда выполняется системный вызов, он выполняется в пользовательском пространстве, не переходя в ядро. Так что время спасено. Подробнее см. Здесь vsyscall http://www.trilithium.com/johan/2005/08/linux-gate/
и здесь Кто-нибудь может понять, как работает gettimeofday?

Ответ 6

Syscall состоит из специальной команды ловушки, номера системного вызова и аргументов.

  • Специальная команда ловушки используется для переключения с пользовательского режима на режим ядра, который имеет неограниченные привилегии.
  • Номера и аргументы syscall передаются по регистру.