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

Вы можете добавить данные в FormData следующим образом:

formData.append('message', message);

Это не обязательно должно быть поле формы. Чтобы отладить FormData, вы должны опубликовать данные.

MDN FormData.append () Ссылка

Посмотрите здесь: FormData.append («ключ», «значение») не работает

38
задан John Boker 1 February 2009 в 03:20
поделиться

4 ответа

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

4
ответ дан Eduard - Gabriel Munteanu 23 September 2019 в 19:35
поделиться

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

2
ответ дан tvanfosson 23 September 2019 в 19:35
поделиться

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

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

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

11
ответ дан wj32 23 September 2019 в 19:35
поделиться

Взгляните на это .

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

  1. , Что такое системные вызовы?

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

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

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

    Так, для реализации механизма системного вызова, в чем мы нуждаемся,

    1) способ назвать кольцо 0 кодами от кольца 3.

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

  3. Старый добрый способ сделать его

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

  4. Новый солнечный способ сделать его

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

37
ответ дан jarvis1729 23 September 2019 в 19:35
поделиться
Другие вопросы по тегам:

Похожие вопросы: