Системни разговори

Какво е системно обаждане на Linux?

Какво е системно обаждане на Linux?

Първо най-важното

Преди да се задълбочим в дефиницията на системно повикване на Linux и да проучим подробностите за неговото изпълнение, най-добре е да започнем с дефинирането на различните софтуерни слоеве на типична Linux система.

Ядрото на Linux е специализирана програма, която стартира и работи на най-ниското налично ниво на вашия хардуер. Той има за задача да организира всичко, което се изпълнява на компютъра, включително обработка на клавиатура, диск и мрежови събития, за да осигури времеви срезове за паралелно изпълнение на множество програми.

Когато ядрото изпълнява програма на ниво потребител, то виртуализира пространството на паметта, така че програмите да вярват, че те са единственият процес, който се изпълнява в паметта. Този защитен балон от хардуерна и софтуерна изолация увеличава сигурността и надеждността. Непривилегировано приложение няма достъп до паметта, принадлежаща на други програми, и ако тази програма се срине, ядрото се прекратява, така че не може да навреди на останалата част от системата.

Премахване на бариерата с системни повиквания на Linux

Този слой на изолация между непривилегировани приложения предоставя отлична граница за защита на други приложения и потребители в системата. Въпреки това, без някакъв начин за взаимодействие с останалите елементи в компютъра и външния свят, програмите не биха могли да постигнат голяма част от всичко.

За да се улесни взаимодействието, ядрото определя софтуерен портал, който позволява на изпълняващата се програма да изисква ядрото да действа от негово име. Този интерфейс е известен като системно повикване.

Тъй като Linux следва философията на UNIX за „всичко е файл“, много функции могат да бъдат изпълнени чрез отваряне и четене или запис във файл, който може да бъде устройство. Например в Windows можете да използвате функция, наречена CryptGenRandom, за достъп до произволни байтове. Но в Linux това може да стане чрез просто отваряне на „файл“ / dev / urandom и четене на байтове от него, използвайки стандартни системни повиквания за въвеждане / извеждане на файлове. Тази съществена разлика позволява по-опростен интерфейс за системно обаждане.

Вафлена тънка обвивка

В повечето приложения системните повиквания не се извършват директно към ядрото. Почти всички програми се свързват в стандартната библиотека C, която осигурява тънка, но важна обвивка около системните повиквания на Linux. Библиотеката гарантира, че аргументите на функцията се копират в правилните регистри на процесора, след което издава съответното системно повикване на Linux. Когато данните се получат от повикването, обвивката интерпретира резултатите и ги връща обратно в програмата по последователен начин.

Зад сцената

Всяка функция в програма, която взаимодейства със системата, в крайна сметка се превръща в системно повикване. За да видим това в действие, нека започнем с основен пример.

void main ()

Това е може би най-тривиалната програма C, която някога ще виждате. Той просто получава контрол чрез основната входна точка и след това излиза. Той дори не връща стойност, тъй като main е дефиниран като void. Запазете файла като ctest.c и нека го компилираме:

gcc ctest.c -o ctest

След като бъде компилиран, можем да видим размера на файла като 8664 байта. Може да варира леко в системата ви, но трябва да е около 8k. Това е много код само за влизане и излизане! Причината да е 8k е, че е включена средата на изпълнение на libc. Дори да премахнем символите, това все пак е малко над 6k.

В още по-опростен пример можем да накараме системния извикване на Linux да излезе, вместо да зависи от изпълнението на C, за да го направи вместо нас.

void _start ()
asm ("movl $ 1,% eax;"
"xorl% ebx,% ebx;"
"int $ 0x80");

Тук преместваме 1 в регистъра EAX, изчистваме регистъра EBX (който иначе би съдържал връщаната стойност), след което извикваме прекъсване на системното повикване на Linux 0x80 (или 128 в десетичен знак). Това прекъсване задейства ядрото да обработи нашето повикване.

Ако компилираме новия си пример, наречен asmtest.в и премахнете символите и изключете стандартната библиотека:

gcc -s -nostdlib asmtest.c -o asmtest

ще създадем двоичен файл под 1k (в моята система той дава 984 байта). Повечето от този код са изпълними заглавки. Сега извикваме директния системен разговор на Linux.

За всички практически цели

В почти всички случаи никога няма да се налага да правите директни системни обаждания във вашите програми на C. Ако използвате асемблерен език, обаче, може да възникне необходимост. При оптимизацията обаче най-добре би било да позволите на функциите на библиотеката C да извършват системни повиквания и в директивите за сглобяване да е вграден само вашият критичен за изпълнение код.

Как да програмирате уроци за системно обаждане

Списък на всички системни повиквания

Ако искате да видите списък с всички налични системни обаждания за Linux, можете да проверите тези справочни страници: Пълен списък на системните повиквания на Linux Подсказка.com, filippo.io / linux-syscall-table / и или syscalls.kernelgrok.com

HD Remastered Games за Linux, които никога преди не са имали издание на Linux
Много разработчици и издатели на игри излизат с HD ремастер на стари игри, за да удължат живота на франчайза, моля феновете, които искат съвместимост ...
Как да използвам AutoKey за автоматизиране на Linux игри
AutoKey е програма за автоматизация на настолни компютри за Linux и X11, програмирана в Python 3, GTK и Qt. Използвайки неговата функционалност за скр...
Как да покажа брояч на FPS в игрите на Linux
Linux игрите получиха голям тласък, когато Valve обяви поддръжка на Linux за Steam клиент и техните игри през 2012 г. Оттогава много AAA и независими ...