используйте | труба например
ifconfig -a | more
этот список будет отображаться до тех пор, пока экран не заполнится, а затем можно прокручивать дальше, нажимая клавишу возврата/ввода.
Давайте рассмотрим в качестве примера :простую программу 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
), адрес сообщения и длину сообщения Аналогичная последовательность действий для выхода :установить в регистрах номер системного вызова и код выхода и выполнить системный вызов.
Какие регистры устанавливать для каких значений определяется соглашением о вызовах системного вызова .
После того, как ядро запускает обработчик системного вызова, этот обработчик считывает значения регистров из контекста приложения и интерпретирует их в соответствии с соглашением о вызовах. В частности, когда он видит, что системным вызовом является sys_write
, он берет длину и адрес сообщения и использует их для чтения из пользовательской памяти. Затем эти данные (вместе с файловым дескриптором )передаются драйверам, которые будут выполнять фактическую работу.
the user process cannot read nor write to the Kernel addresses
Нет, но ядро может читать и записывать адреса пользователей, если/когда захочет. Системные вызовы Linux передают номер системного вызова и аргументы в регистры ЦП. (Найдите что-нибудь вроде "Соглашение о вызовах системных вызовов Linux".)
Некоторые из этих аргументов могут быть указателями, и в этом случае ядро знает, что нужно искать данные в указанном -местоположении в адресном пространстве пользователя. Насколько я понял,ядро фактически копирует данные в пространство ядра перед их использованием. (иначе другой пользовательский -пространственный поток может изменить данные во время системного вызова. )Но расположение данных может быть где угодно в адресном пространстве пользователя, как того требует программа.