Systemsamtal

Vad är ett Linux-systemanrop?

Vad är ett Linux-systemanrop?

Första saker först

Innan vi gräver in i definitionen av ett Linux-systemanrop och undersöker detaljerna för dess körning, är det bäst att börja med att definiera de olika mjukvarulagen i ett typiskt Linux-system.

Linux-kärnan är ett specialiserat program som startar och körs på den lägsta tillgängliga nivån på din hårdvara. Det har till uppgift att ordna allt som körs på datorn, inklusive hantering av tangentbord, disk och nätverkshändelser för att tillhandahålla tidsskivor för att köra flera program parallellt.

När kärnan kör ett program på användarnivå virtualiseras minnesutrymmet så att programmen tror att de är den enda processen som körs i minnet. Denna skyddande bubbla av hårdvaru- och mjukvaruisolering ökar säkerheten och tillförlitligheten. Ett okontrollerat program kan inte komma åt minne som tillhör andra program, och om det programmet kraschar avslutas kärnan så att den inte kan skada resten av systemet.

Breeching the Barrier med Linux-systemanrop

Detta lager av isolering mellan oprivierade applikationer ger en utmärkt gräns för att skydda andra applikationer och användare på systemet. Men utan något sätt att ansluta till de andra elementen i datorn och omvärlden skulle program inte kunna åstadkomma mycket av någonting.

För att underlätta interaktion utser kärnan en programvaruport som gör det möjligt för det körande programmet att begära att kärnan agerar för dess räkning. Detta gränssnitt är känt som ett systemanrop.

Eftersom Linux följer UNIX-filosofin "allt är en fil" kan många funktioner utföras genom att öppna och läsa eller skriva till en fil, vilket kan vara en enhet. I Windows kan du till exempel använda en funktion som heter CryptGenRandom för att komma åt slumpmässiga byte. Men på Linux kan detta göras genom att helt enkelt öppna "filen" / dev / urandom och läsa byte från den med standardanrops- / utmatningssystemsamtal. Denna viktiga skillnad möjliggör ett enklare systemanropsgränssnitt.

Wafer-Thin Wrapper

I de flesta applikationer görs inte systemanrop direkt till kärnan. Praktiskt taget alla program länkar i standard C-biblioteket, vilket ger en tunn men viktig omslag kring Linux-systemanrop. Biblioteket ser till att funktionsargumenten kopieras till rätt processorregister och sedan skickar motsvarande Linux-systemanrop. När data tas emot från samtalet, tolkar omslaget resultaten och returnerar det till programmet på ett konsekvent sätt.

Bakom kulisserna

Varje funktion i ett program som interagerar med systemet översätts så småningom till ett systemanrop. För att se detta i aktion, låt oss börja med ett grundläggande exempel.

ogiltigt huvud ()

Detta är förmodligen det mest triviala C-programmet du någonsin kommer att se. Det får helt enkelt kontroll via huvudingången och går sedan ut. Det returnerar inte ens ett värde eftersom huvud definieras som ogiltigt. Spara filen som ctest.c och låt oss sammanställa det:

gcc ctest.c-o ctest

När den väl har kompilerats kan vi se filstorleken som 8664 byte. Det kan variera något på ditt system, men det bör vara cirka 8k. Det är mycket kod bara för att komma in och avsluta! Anledningen till att det är 8k är att libc-körningen ingår. Även om vi tar bort symbolerna är det fortfarande en aning över 6k.

I ett ännu enklare exempel kan vi göra att Linux-systemet kräver att avsluta snarare än beroende på C-körning för att göra det för oss.

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

Här flyttar vi 1 till EAX-registret, rensar EBX-registret (som annars skulle innehålla returvärdet) och kallar sedan Linux-systemets samtalsavbrott 0x80 (eller 128 i decimal). Detta avbrott utlöser kärnan för att behandla vårt samtal.

Om vi ​​sammanställer vårt nya exempel, kallat asmtest.c och ta bort symbolerna och utesluta standardbiblioteket:

gcc -s -nostdlib asmtest.c-o asmtest

vi producerar en binär mindre än 1k (på mitt system ger den 984 byte). Det mesta av den här koden är körbara rubriker. Vi ringer nu det direkta Linux-systemanropet.

För alla praktiska ändamål

I nästan alla fall behöver du aldrig ringa direkta systemanrop i dina C-program. Om du använder monteringsspråk kan dock behovet uppstå. Vid optimering skulle det dock vara bäst att låta C-biblioteksfunktionerna göra systemanrop och endast ha din prestandakritiska kod inbäddad i monteringsdirektiven.

Hur man programmerar systemanropshandledning

Lista över alla systemanrop

Om du vill se en lista över alla tillgängliga systemanrop för Linux kan du kontrollera dessa referenssidor: Fullständig lista över systemanrop på LinuxHint.com, filippo.io / linux-syscall-tabell / och eller syscalls.kernelgrok.com

Hur man utvecklar ett spel på Linux
För ett decennium sedan skulle inte många Linux-användare förutsäga att deras favoritoperativsystem en dag skulle vara en populär spelplattform för ko...
Portar med öppen källkod för kommersiella spelmotorer
Gratis, öppen källkod och plattformsmekaniska rekreationer kan användas för att spela gamla såväl som några av de ganska senaste speltitlarna. I den h...
Bästa kommandoradsspel för Linux
Kommandoraden är inte bara din största allierade när du använder Linux, det kan också vara källan till underhållning eftersom du kan använda den för a...