Кіріспе

Бағдарламалардың ядролық қызметтерге қол жеткізу жолы

Компьютерлік есепте жүйелік шақыру (көбінесе syscall деп қысқартылады) – компьютерлік бағдарламаның өзі іске қосылған операциялық жүйеден қызмет сұрауының бағдарламалық тәсілі. Бұл аппараттық құрылғыларға қатысты қызметтерді (мысалы, қатты дискіге қол жеткізу немесе құрылғының камерасын пайдалану), жаңа процестерді құру және іске қосу, сондай-ақ процестерді жоспарлау сияқты негізгі ядролық қызметтермен байланысты қызметтерді қамтуы мүмкін. Жүйелік шақырулар процесс пен операциялық жүйе арасындағы маңызды интерфейсті қамтамасыз етеді. Көптеген жүйелерде жүйелік шақырулар тек пайдаланушы кеңістігіндегі процестерден ғана жасалуы мүмкін, бірақ кейбір жүйелерде, мысалы OS/360 және оның ізбасарларында, артықшылықты жүйелік код та жүйелік шақырулар жасайды. Кіріктірілген жүйелер үшін жүйелік шақырулар әдетте процессордың артықшылық режимін өзгерте алмайды.

Арнайы артықшылықтар

Кейбір кіріктірілген жүйелерді қоспағанда, көптеген заманауи процессорлардың архитектурасы қауіпсіздік моделін қамтиды. Мысалы, сақиналар моделі бағдарламалық жасақтаманың орындалуы мүмкін бірнеше артықшылық деңгейлерін анықтайды: бағдарлама әдетте өзінің жеке адрестік кеңістігімен шектеледі, сондықтан ол басқа іске қосылған бағдарламаларға немесе операциялық жүйенің өзіне кіре алмайды немесе өзгерте алмайды, сондай-ақ аппараттық құрылғыларды (мысалы, кадрлық буфер немесе желілік құрылғылар) тікелей басқарудан тыйылады. Дегенмен, көптеген қолданбаларға осы компоненттерге қол жеткізу қажет, сондықтан операциялық жүйе мұндай операциялар үшін анықталған және қауіпсіз іске асыруды қамтамасыз ету үшін жүйелік шақыруларды ұсынады. Операциялық жүйе ең жоғары артықшылық деңгейінде орындалады және қолданбаларға жүйелік шақырулар арқылы қызметтерді сұрауға мүмкіндік береді, олар көбінесе үзілістер арқылы іске қосылады. Үзіліс автоматты түрде процессорды жоғары артықшылық деңгейіне көшіреді, содан кейін басқаруды ядроға береді, ол шақырушы бағдарламаға сұралған қызметті беруге бола ма, жоқ па, соны анықтайды. Егер қызмет рұхсат етілсе, ядро шақырушы бағдарламаның тікелей бақылауында болмайтын нақты нұсқаулар жиынтығын орындайды, артықшылық деңгейін шақырушы бағдарламаға қайтарады, содан кейін басқаруды шақырушы бағдарламаға қайтарады.

Кітапхананың аралас қызметі

Жүйелер әдеттегі бағдарламалар мен операциялық жүйе арасында кітапхана немесе API ұсынады. Unix сияқты жүйелерде, бұл API әдетте C кітапханасының (libc) іске асырылуының бөлігі болып табылады, мысалы glibc, ол жүйелік шақырулар үшін орама функцияларын ұсынады, көбінесе олар шақыратын жүйелік шақырулармен бірдей аталады. Windows NT-де бұл API кітапханадағы Native API-нің бөлігі болып табылады; бұл тұрақты Windows API-нің іске асырылуымен пайдаланылатын және Windows-тағы кейбір жүйелік бағдарламалар тікелей пайдаланатын құжатталмаған API. Кітапхананың орама функциялары жүйелік шақыруды пайдалану үшін қарапайым функция шақыру конвенциясын (ассемблералық деңгейдегі субпрограмма шақыруын) ашып көрсетеді, сондай-ақ жүйелік шақыруды модульді етеді. Мұнда ораманың негізгі функциясы – жүйелік шақыруға берілетін барлық аргументтерді тиісті процессор регистрлеріне (әлде мүмкін шақыру стегінде де) орналастыру, сонымен қатар ядроға шақыру үшін бірегей жүйелік шақыру нөмірін орнату. Осылайша операциялық жүйе мен қолданба арасында орналасқан кітапхана портативтілікті арттырады. Кітапхана функциясының шақырылуының өзі ядролық режимге ауысуды тудырмайды және әдетте қалыпты субпрограммалық шақыру болып табылады (мысалы, кейбір нұсқаулар жиынтығының архитектураларында (ISA) "CALL" құрастыру нұсқаулығын пайдалану). Нақты жүйелік шақыру басқаруды ядроға ауыстырады (және оны абстракциялайтын кітапханалық шақырудан гөрі іске асыруға және платформаға тәуелді). Мысалы, Unix сияқты жүйелерде fork және execve – бұл C кітапхана функциялары, олар өз кезегінде fork және exec жүйелік шақыруларын шақыратын нұсқауларды орындайды. Жүйелік шақыруды тікелей қолданба кодына енгізу күрделірек және енген құрастыру кодтарын қолдануды талап етуі мүмкін (C және C++), сондай-ақ жүйелік шақыру операциясы үшін төменгі деңгейдегі бинарлық интерфейсті білуді талап етеді, ол уақыт өте өзгеруі мүмкін және осылайша қолданбаның бинарлық интерфейсінің бөлігі болмауы мүмкін; кітапхана функциялары мұны алып тастау үшін арналған. Экзоядроға негізделген жүйелерде кітапхананың аралық ролі ерекше маңызға ие. Экзожернелдерде кітапханалар пайдаланушы қолданбаларын өте төмен деңгейдегі ядролық API-ден қорғайды және абстракциялар мен ресурстарды басқаруды қамтамасыз етеді. IBM-нің OS/360, DOS/360 және TSS/360 жүйелік шақырулардың көпшілігін ассемблерлік макрос кітапханасы арқылы іске асырады, бірақ шақыру байланысы бар бірнеше қызмет бар. Бұл олардың ассемблер тілінде бағдарламалау жоғары деңгейдегі тілдерді қолданудан гөрі кең тараған кезде пайда болғанын көрсетеді. Сондықтан IBM жүйелік шақырулары жоғары деңгейдегі тіл бағдарламаларымен тікелей орындалмайды, бірақ шақырылатын ассемблерлік тіл орауыш субпрограммасы қажет. Содан бері IBM z/OS және z/VSE тілдерінде жоғары деңгейдегі тілдерден шақырылатын көптеген қызметтерді қосты. MVS/SP-нің соңғы нұсқаларында және MVS-тің барлық кейінгі нұсқаларында кейбір жүйелік шақырулар макростары Бағдарламалық шақыруды (PC) тудырады.

Мысалдар мен құралдар

Unix, Unix сияқты және басқа POSIX стандартымен үйлесімді операциялық жүйелерде, танымал жүйелік шақырулар: ашу, оқу, жазу, жабу, күту, орындау, көшіру, шығу және тоқтату. Көптеген қазіргі заманғы операциялық жүйелерде жүздеген жүйелік шақырулар бар. Мысалы, Linux және OpenBSD әрқайсысында 300-ден астам әртүрлі шақырулар бар, NetBSD-де 500-ге жуық, FreeBSD-де 500-ден астам, Windows-та 2000-ға жуық, олар win32k (графикалық) және ntdll (негізгі) жүйелік шақырулары арасында бөлінген, ал Plan 9-да 51 бар. Strace, ftrace және truss сияқты құралдар процестің басталуынан орындалуын қадағалауға және процесс шақыратын барлық жүйелік шақыруларды тіркеуге мүмкіндік береді, немесе бұрыннан жұмыс істеп тұрған процесске қосылып, егер операция пайдаланушының құқықтарын бұзбаса, сол процесс жасаған кез келген жүйелік шақыруды ұстап алады. Бағдарламаның осы ерекше қабілеті әдетте ptrace немесе procfs-тағы файлдарға жүйелік шақырулар арқылы жүзеге асырылады.

Үлгілі іске асырулар

Жүйелік шақыруларды іске асыру пайдаланушы кеңістігінен ядро кеңістігіне басқаруды беруді қажет етеді, бұл архитектураға тән ерекшелікті қамтиды. Мұны іске асырудың әдеттегі тәсілі – бағдарламалық үзіліс немесе тұзақ. Үзіліс опералық жүйе ядросына басқаруды береді, сондықтан бағдарлама тек қана қажетті жүйелік шақыру нөмірімен бірнеше тіркелімді орнатып, бағдарламалық үзілісті орындауы керек. Бұл көптеген RISC процессорлары үшін ұсынылған жалғыз тәсіл, бірақ x86 сияқты CISC архитектуралары қосымша тәсілдерді қолдайды. Мысалы, x86 нұсқаулар жиынтығында SYSCALL/SYSRET және SYSENTER/SYSEXIT нұсқаулары бар (бұл екі механизмді AMD және Intel жеке-жеке жасады, бірақ олардың мәні бірдей). Бұл жүйелік шақыру үшін басқаруды ядроға жылдам беруге арналған «жылдам» басқаруды беру нұсқаулары. Linux 2.5 x86 архитектурасында осы мүмкіндікті пайдалана бастады, ал бұрын INT нұсқауын қолданды, онда жүйелік шақыру нөмірі EAX тіркеліміне 0x80 үзілісі орындалғанға дейін орналастырылды. Ескі механизм – қоңырау қақпасы; бастапқыда Multics жүйесінде, содан кейін мысалы, Intel x86-да қолданылды. Ол бағдарламаға операциялық жүйе алдын ала орнататын қауіпсіз басқаруды беру механизмін пайдалана отырып, ядролық функцияларды тікелей шақыруға мүмкіндік береді. Бұл тәсіл x86 архитектурасында кеңінен таралмаған, себебі x86 жад сегментациясын қолданатын алыс шақыру (қазіргі код сегментінен өзге сегментте орналасқан процедураға шақыру) және оның салдарынан туындайтын тасымалдану қиындықтары, сондай-ақ жоғарыда аталған жылдам нұсқаулардың болуы себеп болуы мүмкін. IA-64 архитектурасы үшін EPC (Enter Privileged Code) нұсқауы қолданылады. Жүйелік шақырудың алғашқы сегіз аргументі тіркелімдерге беріледі, ал қалғандары стекке беріледі. IBM System/360 мейнфреймі және оның ізбасарларында Supervisor Call нұсқауы, жүйелік шақыруды іске асырады, онда нөмір тіркелімде емес, нұсқаудың өзінде болады, IBM-нің көптеген операциялық жүйелерінде және Linux-тағы барлық жүйелік шақыруларда. MVS-тің кейінгі нұсқаларында IBM көптеген жаңа мүмкіндіктер үшін Бағдарламалық шақыру (PC) нұсқауларын қолданады. Атап айтқанда, PC шақырушы қызмет сұрату блогы (SRB) режимінде болғанда қолданылады. PDP 11 миникомпьютері , және нұсқауларын қолданды, олар IBM System/360 және x86 сияқты кодты нұсқаудың өзіне енгізеді; олар операциялық жүйеге басқаруды беру үшін белгілі бір мекенжайларға үзілістерді тудырады. PDP 11 сериясының VAX 32 биттік мұрагері , , және нұсқауларын әртүрлі деңгейдегі артықшылықты кодқа жүйелік шақырулар жасау үшін қолданды; код нұсқаудың аргументі болып табылады.

Процессор режімі мен контекстін ауыстыру

Unix- тәрізді жүйелердің көпшілігінде жүйелік шақырулар ядролық режимде өңделеді, бұл процессордың орындау режимін жоғары дәрежелі режимге ауыстыру арқылы жүзеге асырылады, бірақ процесс контекстінің ауыстырылуы қажет емес, дегенмен артықшылықты контексттік ауыстыру орын алады. Аппараттық құралдар әлемді процессордың күй тізіліміне сәйкес орындау режимі тұрғысынан қабылдайды, ал процестер – операциялық жүйемен ұсынылған абстракция болып табылады. Жүйелік шақыру әдетте басқа процесске контексттік ауысуды қажет етпейді; керісінше, ол шақырған процесс контекстінде өңделеді. Көп жіпті процесс ішінде жүйелік шақырулар бірнеше жіптен жасалуы мүмкін. Мұндай шақыруларды өңдеу операциялық жүйенің ядросының және қолданба орындалу ортасының құрылысына байланысты. Төменде операциялық жүйелер қолданатын типтік модельдер тізімі келтірілген:

Көптен бір модель: Процесстегі кез келген пайдаланушы жіпінен жасалған барлық жүйелік шақырулар ядро деңгейіндегі бір жіппен өңделеді. Бұл модельдің бірнеше кемшілігі бар: кез келген тоқтатылатын жүйелік шақыру (мысалы, пайдаланушыдан дерек күту) барлық басқа жіптерді тоқтата алады. Сонымен қатар, бір уақытта тек бір ғана жіп ядроға кіре алады, сондықтан бұл модель процессордың бірнеше өзегін пайдалана алмайды. Бірге бір модель: Әрбір пайдаланушы жіпі жүйелік шақыру кезінде жеке ядролық деңгейлі жіпке қосылады. Бұл модель тоқтатылатын жүйелік шақырулардың жоғарыда аталған мәселесін шешеді. Ол барлық негізгі Linux дистрибутивтерінде, macOS, iOS, Windows және Solaris-тің соңғы нұсқаларында қолданылады. Көптен көпке модель: Бұл модельде пайдаланушы жіптерінің жиынтығы ядро жіптерінің жиынтығына шамаланған. Пайдаланушы жіптері жиынтығынан жасалған барлық жүйелік шақырулар оларға сәйкес келетін ядро жіптері жиынтығындағы жіптермен өңделеді. Гибридтік модель: Бұл модель ядро таңдауына байланысты көптен көпке және бірге бір модельдерді іске асырады. Бұл IRIX, HP UX және Solaris-тің ескі нұсқаларында кездеседі.