Ano ang Tawag sa Sistema ng Linux?

What Is Linux System Call



Bago natin tuklasin ang kahulugan ng isang tawag sa system ng Linux at suriin ang mga detalye ng pagpapatupad nito, pinakamahusay na magsimula sa pagtukoy sa iba't ibang mga layer ng software ng isang karaniwang sistema ng Linux.

Ang Linux kernel ay isang dalubhasang programa na nagbobota at tumatakbo sa pinakamababang magagamit na antas sa iyong hardware. Mayroon itong gawain ng orkestra ng lahat ng bagay na tumatakbo sa computer, kabilang ang paghawak ng mga kaganapan sa keyboard, disk, at network upang magbigay ng mga hiwa ng oras para sa pagpapatupad ng maraming mga programa nang kahanay.







Kapag ang kernel ay nagpapatupad ng isang programa sa antas ng gumagamit, virtualize nito ang puwang ng memorya upang maniwala ang mga programa na sila lamang ang proseso na tumatakbo sa memorya. Ang proteksiyon na bubble ng hardware at paghihiwalay ng software ay nagdaragdag ng seguridad at pagiging maaasahan. Ang isang hindi sikat na application ay hindi maaaring ma-access ang memorya na kabilang sa iba pang mga programa, at kung ang program na iyon ay nag-crash, ang kernel ay natatapos upang hindi ito makapinsala sa natitirang system.



Breeching the Barrier sa Mga Tawag sa System ng Linux

Ang layer ng paghihiwalay sa pagitan ng mga hindi sikat na application ay nagbibigay ng isang mahusay na hangganan upang maprotektahan ang iba pang mga application at mga gumagamit sa system. Gayunpaman, nang walang ilang paraan upang makipag-ugnay sa iba pang mga elemento sa computer at sa labas ng mundo, ang mga programa ay hindi magagawang magawa ang anuman.



Upang mapadali ang pakikipag-ugnayan, nagtatalaga ang kernel ng isang gate ng software na nagpapahintulot sa tumatakbo na programa na humiling na ang kernel ay kumilos sa ngalan nito. Ang interface na ito ay kilala bilang isang tawag sa system.





Dahil ang Linux ay sumusunod sa pilosopiya ng UNIX ng lahat ay isang file, maraming mga pagpapaandar ang maaaring gampanan sa pamamagitan ng pagbubukas at pagbabasa o pagsulat sa isang file, na maaaring isang aparato. Halimbawa sa Windows, maaari kang gumamit ng isang pagpapaandar na tinatawag na CryptGenRandom upang ma-access ang mga random byte. Ngunit sa Linux, magagawa ito sa pamamagitan lamang ng pagbubukas ng file / dev / urandom at pagbabasa ng mga byte mula rito gamit ang karaniwang mga file file / output system na tawag. Pinapayagan ng mahalagang pagkakaiba na ito para sa isang mas simpleng interface ng tawag sa system.

Wafer-Thin Wrapper

Sa karamihan ng mga application, ang mga tawag sa system ay hindi direktang ginagawa sa kernel. Halos lahat ng mga programa ay naka-link sa karaniwang C library, na nagbibigay ng isang manipis ngunit mahalagang pambalot sa paligid ng mga tawag sa system ng Linux. Tinitiyak ng library na ang mga argumento ng pag-andar ay nakopya sa tamang pagrehistro ng processor pagkatapos ay naglalabas ng kaukulang tawag sa system ng Linux. Kapag natanggap ang data mula sa tawag, binibigyang kahulugan ng balot ng mga resulta at ibabalik ito sa programa sa isang pare-pareho na paraan.



Sa likod ng kamera

Ang bawat pag-andar sa isang programa na nakikipag-ugnay sa system ay sa huli ay isinalin sa isang tawag sa system. Upang makita ito sa pagkilos, magsimula tayo sa isang pangunahing halimbawa.

walang bisapangunahing() {
}

Marahil ito ang pinaka-walang galang na C program na iyong makikita. Ito ay nakakakuha lamang ng kontrol sa pamamagitan ng pangunahing punto ng pagpasok at pagkatapos ay paglabas. Ni hindi ito nagbabalik ng isang halaga dahil ang pangunahing ay tinukoy bilang walang bisa. I-save ang file bilang ctest.c at i-compile natin ito:

gcc ctest.c -ang pinakamaganda

Kapag naipon ito, maaari naming makita ang laki ng file bilang 8664 bytes. Maaari itong bahagyang mag-iba sa iyong system, ngunit dapat ay humigit-kumulang na 8k. Maraming code iyon upang makapasok at makalabas lamang! Ang dahilan kung bakit 8k ay ang libc runtime ay isinasama. Kahit na alisan natin ang mga simbolo, ito ay higit pa sa 6k.

Sa isang mas simpleng halimbawa, maaari nating tawagan ang system ng Linux na lumabas sa halip na depende sa C runtime upang gawin iyon para sa amin.

walang bisa_start() {
asm('Movl $ 1,% eax;'
'xorl% ebx,% ebx;'
'int $ 0x80');
}

Dito inililipat namin ang 1 sa rehistro ng EAX, i-clear ang rehistro ng EBX (na kung saan ay naglalaman ng halaga ng pagbabalik) pagkatapos ay tawagan ang tawag sa Linux system na makagambala sa 0x80 (o 128 sa decimal). Ang pagkagambala na ito ay nagpapalitaw ng kernel upang maproseso ang aming tawag.

Kung pinagsama-sama namin ang aming bagong halimbawa, tinawag na asmtest.c, at inaalis ang mga simbolo at ibinukod ang karaniwang silid aklatan:

gcc-s-nostdlib asmtest.c -o asmtest

makagawa kami ng isang binary na mas mababa sa 1k (sa aking system, magbubunga ito ng 984 bytes). Karamihan sa code na ito ay maipapatupad na mga header. Tumatawag kami ngayon ng direktang tawag sa system ng Linux.

Para sa Lahat ng Mga praktikal na Pakay

Sa halos lahat ng mga kaso, hindi ka na kailangang direktang tumawag sa system sa iyong mga programa sa C. Kung gumagamit ka ng wika ng pagpupulong, gayunpaman, maaaring lumitaw ang pangangailangan. Gayunpaman, sa pag-optimize, pinakamahusay na hayaan ang mga pagpapaandar ng C library na tumawag sa system at magkaroon lamang ng iyong kritikal na pagganap na code na naka-embed sa mga direktiba ng pagpupulong.

Paano Mag-Program ng Mga Tutorial sa Pagtawag sa System

Listahan ng Lahat ng Mga Tawag sa System

Kung nais mong makita ang isang listahan ng lahat ng magagamit na mga tawag sa system para sa Linux maaari mong suriin ang mga pahinang sanggunian na ito: Buong Listahan ng Mga Tawag sa System sa LinuxHint.com, filippo.io/linux-syscall-table/ at o syscalls.kernelgrok.com