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

What Is Linux System Call



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

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







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



Преодоляване на бариерата със системни обаждания на Linux

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



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





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

Wafer-Thin Wrapper

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



Зад сцената

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

невалиденглавен() {
}

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

gcc ctest.° С -ctest

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

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

невалиден_старт() {
асм('movl $ 1,%eax;'
'xorl %ebx, %ebx;'
'int $ 0x80');
}

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

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

gcc-с-nostdlib asmtest.° С -o asmtest

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

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

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

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

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

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