Кіріспе

Компьютерлік жүйелер бағдарламалау арнайы блок коды

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

Тоқтату белгілері

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

Орындау контексі

Қазіргі операциялық жүйеде аппараттық үзіліс басқарушысының орындалу контексіне кіргенде, бұл өте күрделі. Орындалу жылдамдығын арттыру мақсатында, басқарушы әдетте жұмыс істеп жатқан процестің жады және орындалу контекстінде басталады, оған ешқандай арнайы байланысы жоқ (үзіліс, негізінен, жұмыс істеп жатқан контексті басып алады – процестің уақытын есепке алу жүйесі үзілісті өңдеуге кеткен уақытты үзілген процеске қосады). Дегенмен, үзілген процестен өзгеше, үзіліс әдетте аппараттық ресурстарға тікелей қол жеткізуге жеткілікті жоғары құқық деңгейіне, аппараттық құралдармен қамтамасыз етілген механизм арқылы көтеріледі.

Қорытындылау

Төмен деңгейдегі микробасқарушыда чипте қорғаныс режимдері болмауы мүмкін және жад басқару бірлігі (MMU) болмауы да мүмкін. Мұндай чиптерде үзіліс иесінің орындалу контексі үзіліске ұшыраған бағдарламамен шамалас болады, ол әдетте кішкентай, белгілі бір мөлшердегі стекте жұмыс істейді (жад ресурстары дәстүрлі түрде төменгі деңгейде өте шектеулі болған). Көбінесе тігілген үзілістер қолданылады, бұл стек пайдалануды күшейтеді. Бұл бағдарламалау жұмысында үзіліс иесінің басты шектеуі – ең жаман жағдайда қол жетімді стекке аспау, бұл бағдарламалаушыдан әрбір іске асырылған үзіліс иесі мен қолданба тапсырмасының стекке қажетті кеңістігі туралы толыққанды ойлануды талап етеді. Бөлінген стек кеңістігінің шегінен асып кеткен жағдайда (стек ағыны деп аталатын жағдай), мұндай чиптерде аппараттық деңгейде анықтау мүмкін емес. Егер стек басқа жазуға болатын жад аймағына асып өтіп кетсе, иесі әдетте күтілгендей жұмыс істейді, бірақ қолданба кейінірек (кейде өте кейінірек) иенің жанама әсерінен туындаған жадтың бұзылуына байланысты сәтсіздікке ұшырайды. Егер стек жазуға рұқсат етілмейтін (немесе қорғалған) жад аймағына асып өтіп кетсе, қате әдетте иенің өзінде пайда болады (әдетте кейін түзету оңай). Жазуға болатын жағдайда, жүйе дұрыс жұмыс істесе, оның мәні жазылмайтын, заңды стек соңынан кейінгі тұрақты мәнді сақтайтын стек күзетшісін іске асыруға болады. Күзетшінің сыбайлас жемқорлыққа ұшырауын үнемі бақылау үшін бақылаушы механизмдерді пайдалану жиі кездеседі. Бұл көптеген стек ағыны жағдайларын осы мәселені тудырған операцияға жақын уақытта анықтайды. Көп тапсырмалы жүйеде әр орындалу тізбегінің өз стегі болады. Егер үзілістер үшін арнайы жүйелік стек қарастырылмаса, үзілістер үзіліске ұшыраған тізбектің стек кеңістігін пайдаланады. Мұндай жобаларда әдетте MMU болады, ал пайдаланушы стектері стектің ағыны MMU арқылы ұсталып қалады, яғни жүйелік қате ретінде (түзету үшін) немесе жадты кеңейту үшін жадты қайта карталау арқылы. Микробасқарушының осы деңгейіндегі жад ресурстары әдетте айтарлықтай шектеулі емес, сондықтан стектерге кең қауіпсіздік жиегімен жад бөлуге болады. Көп тізбекті жүйелерде аппараттық үзіліс механизмі стекті арнайы жүйелік стекке ауыстырған абзал, сонда ешбір тізбек стегі ең жаман жағдайда тігілген үзілістерді пайдалануды ескеруге қажеттілік туындамайды. 1978 жылғы 8 биттік Motorola 6809 сияқты кішкентай процессорлар жеке жүйелік және пайдаланушы стектеріне сілтемелерді ұсынды.

Уақыт пен бір мезгілделік шектеулері

Көптеген себептерге байланысты, үзіліс жолдамасының мүмкіндігінше жылдам орындалуы өте қажет, ал аппараттық үзілістің тоқтатуға болатын жүйелік шақыруларды шақыруына жол берілмейді (немесе қатаң тыйым салынған). Бірнеше өңдеу ядросы бар жүйеде қайта кіру мүмкіндігін ескеру де аса маңызды. Егер жүйе аппараттық DMA-ны қолдаса, бір ғана CPU ядросы болған жағдайда да бір уақытта орындалу мәселелері туындауы мүмкін. (Орта деңгейдегі микроконтроллерде қорғау деңгейлері мен MMU болмауы, бірақ көптеген арналары бар DMA қозғалтқышының болуы сирек емес; мұндай жағдайда көптеген үзілістер DMA қозғалтқышымен туындайды, ал тиісті үзіліс жолдамасының абайсызда әрекет етуі күтіледі.) Қазіргі заманғы тәжірибе аппараттық үзіліс жолдамаларын алдыңғы және артқы бөліктерге бөлуге қарайды. Алдыңғы бөлік (немесе бірінші деңгей) жұмыс істеп жатқан процесс аясында бастапқы үзілісті қабылдайды, аппараттық құралды жедел емес жағдайға келтіру үшін ең аз жұмыс атқарады (мысалы, толық қабылдау буферін босату) және содан кейін артқы бөлікті (немесе екінші деңгейді) жақын арада, тиісті кезектілік бойынша орындалу үшін белгілейді; іске қосылғаннан кейін артқы бөлік өз процесінің контекстінде, азырақ шектеулермен жұмыс істейді және жолдаманың логикалық операциясын аяқтайды (мысалы, жаңа алынған деректерді операциялық жүйенің дерек кезегіне жіберу).

Қазіргі операциялық жүйелердегі бөлінген өңдеушілер

Бірнеше операциялық жүйелерде – Linux, Unix, macOS, Microsoft Windows, z/OS, DESQview және басқа да бұрын қолданылған операциялық жүйелерде – үзіліс басқарушылары екі бөлікке бөлінеді: Бірінші деңгейлі үзіліс басқарушы (FLIH) және Екінші деңгейлі үзіліс басқарушылар (SLIH). FLIH-тар «қатты үзіліс басқарушысы» немесе «жылдам үзіліс басқарушысы» деп те аталады, ал SLIH-тар «баяу/жұмсақ үзіліс басқарушысы» немесе Windows жүйесіндегі «Кейінге қалдырылған процедура шақыруы» деп те аталады. FLIH платформаға тән үзіліс процедураларын жүзеге асырады, бұл үзіліс ретімен тікелей орындалады. Үзіліске жауап ретінде контексттік ауыстыру жүзеге асырылады, үзіліс коды жүктеліп, орындалады. FLIH-тің міндеті – үзіліске жылдам қызмет көрсету немесе үзіліс кезінде ғана қолжетімді болатын платформаға тән маңызды ақпаратты сақтау, сондай-ақ SLIH-тің одан әрі ұзақ үзіліс өңдеуін жоспарлау. FLIH процестерді орындауда кешігуге себеп болады. FLIH-тар сонымен қатар үзілістерді маскилейді. Кешігуді азайту нақты уақыт операциялық жүйелері үшін маңызды, себебі олар белгілі бір кодтың орындалуы келісілген уақыт ішінде аяқталуын қамтамасыз етуі керек. Кешігуді азайту және маскиленген үзілістерден деректерді жоғалту мүмкіндігін азайту үшін бағдарламашылар FLIH-тің орындалу уақытын барынша азайтуға тырысады, мүмкіндігінше көп функцияларды SLIH-ке көшіреді. Қазіргі заманғы компьютерлердің жылдамдығын ескере отырып, FLIH барлық құрылғыға және платформаға тәуелді өңдеуді жүзеге асыруы мүмкін, ал SLIH платформадан тәуелсіз ұзақ үзіліс өңдеуі үшін қолданылады. Аппараттық құралдарға қызмет көрсететін FLIH әдетте өзінің орындалуы аяқталғанға дейін байланысты үзілісін маскилейді (немесе жасырып ұстайды). Өзінің байланысты үзілісін аяқтамай тұрып ашатын (сирек кездесетін) FLIH «қайта кіретін үзіліс басқарушысы» деп аталады. Қайта кіретін үзіліс басқарушылары бір үзіліс векторының бірнеше рет шақырылуынан стек асуына әкелуі мүмкін, сондықтан олардан әдетте аулақ тұрады. Басымдықпен үзіліс жүйесінде FLIH басқа да бірдей немесе төмен басымдықты үзілістерді (құысқа уақытқа) маскилейді. SLIH ұзақ үзіліс өңдеу тапсырмаларын процеске ұқсас түрде орындайды. SLIH әрбір басқарушыға арналған арнайы ядролық жіп немесе ядролық жұмысшы жіптерінің пулы арқылы орындалады. Бұл жіптер операциялық жүйедегі орындалу кезегінде процессор уақыты үзіліс өңдеуі үшін қолжетімді болғанға дейін күтеді. SLIH ұзақ уақыт орындалуы мүмкін, сондықтан олар әдетте жіптер мен процестерге ұқсас жоспарланады. Linux жүйесінде FLIH «жоғарғы жартысы», ал SLIH «төменгі жартысы» немесе «төменгі бөлігі» деп аталады. Бұл басқа Unix сияқты жүйелерде қолданылатын атаудан өзгеше, онда екеуі де төменгі бөліктің құрамы болып табылады.