Системные вызовы :Как пользователь обрабатывает передачу/получение данных в/из ядра?

используйте | труба например

ifconfig -a | more

этот список будет отображаться до тех пор, пока экран не заполнится, а затем можно прокручивать дальше, нажимая клавишу возврата/ввода.

0
07.07.2020, 23:08
2 ответа

Давайте рассмотрим в качестве примера :простую программу x86 Hello World для Linux, которая выводит сообщение на stdoutи завершает работу. Ему нужно передать пару элементов данных ядру:

  • Текстовая строка для вывода,
  • Код выхода.

Вот ассемблерный код (для компиляции с помощью FASM):

format ELF executable
segment readable executable

; system call numbers
SYS_EXIT=1
SYS_WRITE=4
; file descriptors
STDOUT=1

entry $
start:
    mov eax, SYS_WRITE
    mov ebx, STDOUT
    mov ecx, message
    mov edx, messageLength
    int 0x80

    mov eax, SYS_EXIT
    xor ebx, ebx ; exit code 0
    int 0x80

message:
    db "Hello, world!",0xa
messageLength=$-message

Все, что эта программа делает для достижения своей основной цели (вывод сообщения )это

  • Задайте в соответствующих регистрах ЦП значения, представляющие номер системного вызова (для sys_write, системный вызов ), дескриптор файла (stdout), адрес сообщения и длину сообщения
  • .
  • Выполнить системный вызов, в данном примере с помощью программного прерывания 0x80

Аналогичная последовательность действий для выхода :установить в регистрах номер системного вызова и код выхода и выполнить системный вызов.

Какие регистры устанавливать для каких значений определяется соглашением о вызовах системного вызова .

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

2
18.03.2021, 23:21

the user process cannot read nor write to the Kernel addresses

Нет, но ядро ​​может читать и записывать адреса пользователей, если/когда захочет. Системные вызовы Linux передают номер системного вызова и аргументы в регистры ЦП. (Найдите что-нибудь вроде "Соглашение о вызовах системных вызовов Linux".)

Некоторые из этих аргументов могут быть указателями, и в этом случае ядро ​​знает, что нужно искать данные в указанном -местоположении в адресном пространстве пользователя. Насколько я понял,ядро фактически копирует данные в пространство ядра перед их использованием. (иначе другой пользовательский -пространственный поток может изменить данные во время системного вызова. )Но расположение данных может быть где угодно в адресном пространстве пользователя, как того требует программа.

2
18.03.2021, 23:21

Теги

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