Кіріспе
Linux ядросының API және ABI-нің шолу және салыстыруы. Linux өзегі пайдаланушы кеңістігіне және әр түрлі мақсаттар үшін қолданылатын және дизайны бойынша әр түрлі қасиеттерге ие өзек режимінің кодына бірнеше интерфейстерді ұсынады. Linux ядросында екі түрлі қолданбалы бағдарламалау интерфейсі бар: "kerneluser space" API; және "kernel internal" API.
the "kernel–user space" API; and
the "kernel internal" API.
Linux API-і
Linux API-ге Linux ядросының жүйелік ресурстары мен қызметтеріне қол жеткізуге мүмкіндік беретін пайдаланушы кеңістігіндегі кодты қамтитын ядролық пайдаланушы кеңістігі API-сі кіреді. Ол Linux ядросының жүйелік шақыру интерфейсінен және C стандартты кітапханасындағы субпрограммалардан тұрады. Linux API-ін әзірлеудің басты мақсаты POSIX-те анықталған ерекшеліктердің қолдануға болатын мүмкіндіктерін POSIX-те анықталмаған қосымша пайдалы мүмкіндіктерді ұсынуға, POSIX-те анықталмаған қосымша пайдалы мүмкіндіктерді ұсынуға, POSIX API-ді іске асыратын басқа жүйелердің ядролық пайдаланушы кеңістігі API-лері POSIX-те анықталмаған қосымша мүмкіндіктерді қамтамасыз етуге бағытталған. Linux API, өз қалауы бойынша, онжылдықтар бойы өзгеріс енгізу саясаты арқылы тұрақты сақталды; бұл тұрақтылық бастапқы кодтың тасымалдануына кепілдік береді. Сонымен қатар, Linux ядросының әзірлеушілері жаңа жүйелік шақыруларды енгізуде дәстүрлі түрде консервативті және мұқият болды. Көптеген тегін және ашық бастапқы кодты бағдарламалық жасақтама POSIX API үшін жазылған. Linux ядросына басқа POSIX-ке сәйкес келетін ядро мен C стандартты кітапханасының үйлесімдеріне қарағанда әлдеқайда көп даму ағыны кіргендіктен, Linux ядросы мен оның API қосымша мүмкіндіктермен толықтырылды. POSIX API-ден гөрі Linux API-ге толық бағдарламалау, бұл қосымша мүмкіндіктер пайдалы болған жағдайларда артықшылықтар беруі мүмкін. Қазіргі кездегі белгілі мысалдар - udev, systemd және Weston. Леннарт Поетринг сияқты адамдар Linux API-ді POSIX API-ге қарағанда артық көруді ашық қолдайды, бұл артықшылықтар береді. FOSDEM 2016 конференциясында Майкл Керриск Linux ядросының пайдаланушы кеңістігі API-мен байланысты кейбір проблемаларды түсіндірді, ол кеңейтілмейтін, сақталмайтын, тым күрделі, мақсаты шектеулі, стандарттарды бұзатын және сәйкес келмейтін бірнеше дизайн қателерін қамтиды деп сипаттады. Бұл қателердің көпшілігін түзетуге болмайды, өйткені бұл ядроның пайдаланушы кеңістігіне ұсынатын ABI-ді бұзады.
Linux өзегінің жүйелік шақыру интерфейсі
Жүйелік шақыру интерфейсі - ядродағы барлық іске асырылған және қол жетімді жүйелік шақырулардың жиынтығы. Linux ядросында әр түрлі ішкі жүйелер, мысалы Direct Rendering Manager (DRM), өздерінің жүйелік шақыруларын анықтайды, олардың барлығы жүйелік шақыру интерфейсінің бөлігі болып табылады. Linux ядросының жүйелік шақыруларын ұйымдастыруға қатысты әртүрлі мәселелер көпшілік арасында талқылануда. Бұл мәселелерді Энди Лутомирски, Майкл Керриск және басқалар атап өтті.
Linux ABI-нің негізгі нұсқасы
Linux ABI термині ядроның пайдаланушы кеңістігіндегі ABI-ге қатысты. Қолданбаның бинарлық интерфейсі машиналық кодта компиляцияланған бинарлық файлдарды білдіреді. Сондықтан кез келген ABI нұсқаулар жиынтығына байланысты. Пайдалы ABI-ді анықтау және оны тұрақты ұстау Linux ядросының әзірлеушілерінің немесе GNU C кітапханасының әзірлеушілерінің жауапкершілігі емес, Linux дистрибутивтері мен тәуелсіз бағдарламалық қамтамасыз етушілердің (ISV) Linux-тың бірнеше Linux ABI-ін қолдаудан гөрі, олардың меншік бағдарламалық жасақтамасын тек осындай бір Linux ABI-ге арналған екілік ретінде сату және қолдауды қамтамасыз ету. ABI әр нұсқаулар жиынтығы үшін анықталуы керек, мысалы x86, x86 64, MIPS, ARMv7 A (32 бит), ARMv8 A (64 бит) және т.б. егер екеуі де қолдау тапса. Ол бағдарламалық жасақтаманы әртүрлі компиляторлармен ABI-де көрсетілген анықтамалар бойынша құрастыра алады және толық екілік үйлесімділікке қол жеткізеді. Ашық бастапқы кодты бағдарламалық жасақтама болып табылатын компиляторлар, мысалы, GNU Compiler Collection, LLVM/Clang.
Негізгі API-лер
Көптеген ішкі API бар, олар ядролық жүйелерді бір-бірімен байланыстыруға мүмкіндік береді. Олар тұрақты сақталады, бірақ тұрақтылығына кепілдік жоқ. Жаңа зерттеулер немесе түсініктер осындай қажеттілікті көрсеткенде ядролық ішкі API өзгертілуі мүмкін; барлық қажетті өзгерістер мен сынақтарды автор жасау керек. Linux ядросы монолитті ядро болып табылады, сондықтан құрылғы драйверлері ядро компоненттері болып табылады. Компаниялардың негізгі өзек ағашынан тыс жерде (жеке меншік) құрылғы драйверлерін сақтау ауыртпалығын жеңілдету үшін құрылғы драйверлері үшін тұрақты API-лер бірнеше рет сұралды. Linux ядросының әзірлеушілері құрылғы драйверлері үшін ядролық API-де тұрақтылықты кепілдендіруді бірнеше рет жоққа шығарды. Бұған кепілдік беру Linux ядросының дамуына бұрын кедергі келтірмек және болашақта да солай болады және еркін және ашық бастапқы кодты бағдарламалық жасақтаманың табиғатына байланысты қажет емес. Сондықтан Linux ядросының таңдауы бойынша ядролық API-де тұрақтылығы жоқ.
Негізгі АБИ
Ядролық API-де тұрақтылар болмағандықтан, ядролық ABI-де тұрақтылар бола алмайды.
Абстракция API-лері
Көптеген пайдалану жағдайларында Linux API-сі тым төмен деңгейде деп саналады, сондықтан жоғары абстракциялы API-лерді пайдалану керек. Жоғары деңгейдегі API-лер төмен деңгейдегі API-лердің үстінде іске асырылуы тиіс. Мысалдар: OpenGL және Vulkan спецификацияларын Linux графикалық драйверлерінде және Mesa-да еркін және ашық бастапқы кодты іске асыру. OpenAL спецификациясын іске асыру. Simple DirectMedia Layer: кіріс / дыбыс / т.б. үшін абстракция API. көптеген операциялық жүйелер үшін қол жетімді. Қарапайым және жылдам мультимедиялық кітапхана: жоғарыда көрсетілгендей.
Implementation of the OpenGL and Vulkan specifications in proprietary Linux graphics drivers and the free and open source implementation in Mesa. Implementation of the OpenAL specification. Simple DirectMedia Layer: abstraction API for input/sound/etc. available for many operating systems. Simple and Fast Multimedia Library: like above.