Ioctl - ioctl - Wikipedia

Жылы есептеу, ioctl (аббревиатурасы кіріс / шығуды басқару) Бұл жүйелік қоңырау құрылғыға арналған кіріс шығыс жүйелік қоңыраулармен көрсетілмейтін операциялар және басқа операциялар. Ол сұраныстың кодын көрсететін параметрді алады; қоңыраудың әсері толығымен сұраныс кодына байланысты. Сұраным кодтары көбінесе құрылғыға тән. Мысалы, CD-ROM құрылғы драйвері физикалық құрылғыға дискіні шығаруға нұсқау бере алады ioctl бұл үшін кодты сұраңыз. Кейде беру үшін құрылғыдан тәуелсіз сұрау кодтары қолданылады пайдаланушылар кеңістігі тек негізгі бағдарламалық жасақтамада қолданылатын немесе әлі жетілдірілмеген ядро ​​функцияларына қол жеткізу.

The ioctl жүйелік қоңырау бірінші пайда болды 7-нұсқа туралы Unix сол атпен. Оны Unix және Unix тәрізді жүйелер, оның ішінде Linux және macOS дегенмен, сұраныстың кодтары әр жүйеде әр түрлі. Microsoft Windows ұқсас функцияны ұсынады, «DeviceIoControl«, оның ішінде Win32 API.

Фон

Кәдімгі операциялық жүйелерді екі қабатқа бөлуге болады, пайдаланушылар кеңістігі және ядро. Сияқты қолдану коды мәтіндік редактор тұрады пайдаланушылар кеңістігі, ал операциялық жүйенің базалық құралдары, мысалы желілік стек, ядрода тұрыңыз. Ядро коды сезімтал ресурстармен жұмыс істейді және қосымшалар арасындағы қауіпсіздік пен сенімділік кедергілерін жүзеге асырады; осы себепті қолданушы режиміндегі қосымшаларға операциялық жүйе ядро ​​ресурстарына тікелей қол жеткізуге жол бермейді.

Пайдаланушы кеңістігі қосымшалар әдетте ядроларға сұраныстар жасайды жүйелік қоңыраулар, оның коды ядро ​​қабатында орналасқан. Жүйелік қоңырау әдетте «жүйелік шақыру векторы» формасын алады, онда қажетті жүйелік шақыру индекс нөмірімен көрсетіледі. Мысалы, Шығу() жүйелік қоңырау нөмірі 1, және болуы мүмкін жазу () нөмір 4. Содан кейін жүйелік шақыру векторы сұранысқа қажетті ядро ​​функциясын табу үшін қолданылады. Осылайша әдеттегі операциялық жүйелер пайдаланушылар кеңістігіне бірнеше жүздеген жүйелік қоңыраулар ұсынады.

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

Бұл мәселені шешу үшін ядро ​​кеңейтілетін етіп жасалған және а деп аталатын қосымша модульді қабылдауы мүмкін құрылғы драйвері ол ядро ​​кеңістігінде жұмыс істейді және құрылғыға тікелей жүгіне алады. Ан ioctl интерфейс - бұл пайдаланушылардың кеңістігі құрылғы драйверлерімен байланыса алатын бірыңғай жүйелік шақыру. Құрылғы драйверінің сұраныстары осыған байланысты векторланған ioctl жүйелік қоңырау, әдетте құрылғының тұтқасы және сұраныс нөмірі арқылы. Осылайша, негізгі ядро ​​пайдаланушылар кеңістігіне құрылғы қолдайтын қондырғылар туралы ештеңе білместен және жүйелік қоңыраулардың басқарылмайтын үлкен жиынтығын қажет етпей, құрылғы драйверіне кіруге мүмкіндік бере алады.

Қолданады

Аппараттық құрылғының конфигурациясы

Кең таралған ioctl аппараттық құрылғыларды басқару болып табылады.

Мысалы, бойынша Win32 жүйелер, ioctl қоңыраулар байланыса алады USB флеш құрылғылар, немесе олар жинақталған құрылғылардың диск-геометриялық ақпаратын таба алады.

Қосулы OpenBSD және NetBSD, ioctl арқылы қолданылады био (4) жалған құрылғы драйвері және биоктл іске асырылатын утилита RAID ұқсас біртұтас жеткізуші-агностикалық интерфейсте дыбыс деңгейін басқару ifconfig.[1][2]

Қосулы NetBSD, ioctl арқылы қолданылады сисмон жақтау.[3]

Терминалдар

Бір пайдалану ioctl соңғы қолданушы қосымшаларына ұшыраған кодта I / O терминалы бар.

Unix операциялық жүйелер дәстүрлі түрде көп қолданды командалық интерфейстер. Unix командалық интерфейсі кіріктірілген жалған терминалдар (ptys), мысалы, аппараттық мәтіндік терминалдарды имитациялайды VT100с. Pty құрылғысы сияқты басқарылады және конфигурацияланады ioctl қоңыраулар. Мысалы, pty терезесінің өлшемі TIOCSWINSZ қоңырау. TIOCSTI (I / O терминалын басқару, терминалды енгізуді имитациялау) ioctl функциясы символды құрылғы ағынына итермелейді.[4]

Ядро кеңейтімдері

Қосымшаларға ядроны кеңейту қажет болғанда, мысалы желіні өңдеуді жеделдету үшін, ioctl қоңыраулар көпірге ыңғайлы жолды ұсынады пайдаланушылар кеңістігі ядро кеңейтімдеріне код. Ядро кеңейтімдері атымен ашылатын файлдық жүйеде орынды ұсына алады, ол арқылы ерікті саны ioctl қоңырауларды жіберуге болады, бұл операциялық жүйеге жүйелік қоңырауларды қоспай кеңейтуді бағдарламалауға мүмкіндік береді.

sysctl баламасы

Сәйкес OpenBSD әзірлеуші, ioctl және sysctl екеуі жүйелік қоңыраулар ядроны кеңейтуге арналған sysctl мүмкін екеуінің қарапайымы болуы мүмкін.[5]

Жылы NetBSD, sysmon_envsys үшін негіз аппараттық бақылау қолданады ioctl арқылы проплиб; ал OpenBSD және DragonFly BSD орнына қолданыңыз sysctl олардың сәйкес келуі үшін хс. сенсорлар жақтау. Түпнұсқалық нұсқасы envsys NetBSD-де жүзеге асырылды ioctl бұрын проплиб қол жетімді болды және рамка экспериментальды, ал оны а деп ауыстыру керек деген хабарлама болды sysctl (8) интерфейсті дамыту керек,[6][7] таңдауды ықтимал түсіндіреді sysctl оны кейіннен енгізумен бірге OpenBSD-де хс. сенсорлар 2003 ж. Алайда, қашан envsys шеңбер 2007 жылы қайта жасалды проплиб, жүйелік қоңырау бұрынғыдай қалды ioctl, және хабарлама жойылды.[8]

Іске асыру

Unix

The ioctl жүйелік қоңырау бірінші пайда болды 7-нұсқа Unix, өзгертілген ретінде stty.[9] Ан ioctl қоңырау ретінде қабылданады параметрлері:

  1. ашық файл дескрипторы
  2. сұраныс кодының нөмірі
  3. не бүтін сан, мүмкін қол қойылмаған (драйверге баратын) немесе a көрсеткіш деректерге (немесе драйверге бару, драйверден оралу немесе екеуі де).

The ядро жалпы түрде жіберіледі ioctl тікелей құрылғы драйверіне қоңырау шалыңыз, ол сұраныс нөмірі мен деректерді кез келген тәсілмен түсіндіре алады. Әр жүргізуші құжатының авторлары сол жүргізушіге нөмірлер сұрайды және оларды сол күйінде ұсынады тұрақтылар ішінде тақырып файлы.

Кейбір Unix жүйелері, соның ішінде Linux, сұраныс нөмірі ішінде құрылғы драйверіне / құрылғыдан берілетін деректердің көлемін, деректерді беру бағытын және сұранысты жүзеге асыратын драйвердің жеке басын кодтайтын конвенцияларға ие. Мұндай шартты ұстануға қарамастан, ядро ​​мен драйвер бірыңғай қате кодын беру үшін ынтымақтастық жасайды (символдық тұрақтымен белгіленеді) ENOTTY) оны танымайтын жүргізушінің сұранысын жасайтын қосымшаға.

Мнемоникалық ENOTTY (дәстүрлі мәтіндік хабарламамен байланысты «Жазу машинкасы емес «) ан енгізілген ең алғашқы жүйелерден алынады ioctl қоңырау шалыңыз, мұнда тек телетайп (tty) құрылғы бұл қатені көтерді. Символдық мнемотехника үйлесімділік талаптарымен бекітілгенімен, кейбір заманауи жүйелер «» сияқты жалпы хабарлама береді.Құрылғыны басқарудың дұрыс емес жұмысы«(немесе а оқшаулау олардың).

TCSETS мысалға келтіреді ioctl қоңырау шалу сериялық порт. Тізбектелген порттағы қалыпты оқу және жазу қоңыраулары деректер байттарын қабылдайды және жібереді. Ан ioctl (fd, TCSETS, деректер) қоңырау, әдеттегі енгізу-шығару жүйесінен бөлек, арнайы өңдеу сияқты әр түрлі драйвер параметрлерін басқарады кейіпкерлер немесе порттағы шығыс сигналдары (мысалы DTR сигнал).

Win32

Win32 DeviceIoControl параметрлер ретінде қабылданады:

  1. объектінің ашық тұтқасы (файл дескрипторының Win32 баламасы)
  2. сұраныс кодының нөмірі («басқару коды»)
  3. енгізу параметрлері үшін буфер
  4. енгізу буферінің ұзындығы
  5. шығыс нәтижелері үшін буфер
  6. шығыс буферінің ұзындығы
  7. ан АЙНАЛДЫ құрылым, егер енгізу-шығару қабаттасып кетті пайдаланылуда.

Құрылғының басқару коды Win32 орындалатын жұмыс режимін ескереді.

Құрылғының драйверінің қауіпсіздігіне әсер ететін 4 жұмыс режимі бар -

  1. METHOD_IN_DIRECT: Буферлік адрес оқырман режимінің қоңырау шалушысы арқылы оқылатынын тексереді.
  2. METHOD_OUT_DIRECT: Буферлік адрес қолданушы режимін шақырушы арқылы жазылатынын тексереді.
  3. METHOD_NEITHER: Пайдаланушы режимінің виртуалды мекен-жайлары драйверге картаға немесе расталусыз беріледі.
  4. METHOD_BUFFERED: IO менеджері басқаратын ортақ буферлер деректерді пайдаланушы режиміне ауыстыру үшін қолданылады.

Балама нұсқалар

Басқа векторланған қоңырау интерфейстері

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

Unix операциялық жүйесінде шақырудың тағы екі векторлы интерфейсі танымал: fcntl («файлды басқару») жүйелік шақыру ашық файлдарды конфигурациялайды және қосу сияқты жағдайларда қолданылады блоктаусыз енгізу-шығару; және жиынтық («розетка параметрін орнату») жүйелік қоңырау конфигурациясы ашық желілік розеткалар, теңшеу үшін қолданылатын қондырғы ipfw пакет брандмауэрі қосулы BSD Unix жүйелер.

Жадты бейнелеу

Unix
Кейде құрылғының интерфейстері және енгізу / шығару мүмкіндіктері қолданылады картаға түсірілген файлдар. Құрылғылармен өзара әрекеттесетін қосымшалар файл жүйесінде құрылғыға сәйкес орынды ашады ioctl қоңырау шалыңыз, бірақ содан кейін олардың мекен-жай кеңістігінің бір бөлігін ядроға байланыстыру үшін жадты бейнелеу жүйесінің қоңырауларын қолданыңыз. Бұл интерфейс құрылғы мен а. Арасында деректердің көлемді тасымалын қамтамасыз етудің анағұрлым тиімді әдісі болып табылады пайдаланушылар кеңістігі қолдану; жеке ioctl немесе оқудың / жазудың жүйелік қоңыраулары пайдаланушылардың кеңістіктен ядроға өтуінің қайталануына байланысты қосымша шығындар тудырады, мұнда жадпен салыстырылған адрестер ауқымына қол жеткізу мұндай қосымша шығындарға ие болмайды.
Win32
Буферлік IO әдістерін немесе файлдарды бейнелеудің атаулы нысандарын пайдалануға болады; дегенмен, қарапайым құрылғы драйверлері үшін стандарт DeviceIoControl METHOD_ қол жетімділік жеткілікті.

Netlink

Netlink арналған розетка тәрізді механизм процесаралық байланыс (IPC), икемді ізбасар ретінде жасалған ioctl.

Салдары

Күрделілік

ioctl қоңыраулар ядро ​​жүйесінің шақыру интерфейсінің күрделілігін азайтады. Алайда, әзірлеушілерге ядролардың бағдарламалау интерфейстерінің биттері мен бөліктерін «сақтайтын» орын ұсынып, ioctl қоңыраулар жалпы пайдаланушыдан ядроға дейінгі API-ны қиындатады. Бірнеше жүз жүйелік қоңырауларды қамтамасыз ететін ядро ​​бірнеше мың ioctl қоңыраулармен қамтамасыз ете алады.

Интерфейс дегенмен ioctl қоңыраулар әдеттегі жүйелік қоңыраулардан біршама өзгеше болып көрінеді, іс жүзінде an арасында үлкен айырмашылық жоқ ioctl қоңырау және жүйелік қоңырау; ан ioctl қоңырау - бұл жай диспетчерлік механизмі бар жүйелік шақыру. Сондықтан ядро ​​жүйесінің шақыру интерфейсін кеңейтуге қарсы көптеген дәлелдерді қолдануға болады ioctl интерфейстер.

Қосымша жасаушылар үшін жүйелік қоңыраулар қосымшаның ішкі бағдарламаларынан еш айырмашылығы жоқ; олар аргументтерді қабылдайтын және мәндерді қайтаратын функционалды қоңыраулар. The жұмыс уақыты ОЖ кітапханалары жүйелік қоңырауларға байланысты күрделілікті жасырады. Өкінішке орай, жұмыс уақыты кітапханалары жасай алмайды ioctl мөлдір ретінде шақырады. Табу сияқты қарапайым операциялар IP мекенжайлары машина үшін жиі шатасқан тәртіпсіздіктер қажет ioctl қоңыраулар, әрқайсысы қажет сиқырлы сандар және аргумент құрылымдары.[дәйексөз қажет ]

Libpcap және libdnet үшінші тараптың Unix кітапханаларының екі мысалын келтіруге болады, бұл күрделілігін жасыруға арналған ioctl интерфейстер, сәйкесінше пакетті түсіру және пакет енгізу-шығару үшін.

Қауіпсіздік

Негізгі операциялық жүйелердің ядроға дейін интерфейстері көбінесе шығарылғанға дейін код ақаулары мен қауіпсіздіктің осалдығына қатты тексеріледі. Бұл тексерулер әдетте құжатталған жүйелік шақыру интерфейстеріне бағытталған; мысалы, аудиторлар пайдаланушының идентификаторын өзгерту сияқты құпия қауіпсіздік қоңырауларының тек әкімшілік пайдаланушыларға қол жетімді болуын қамтамасыз етуі мүмкін.

ioctl жүйелік қоңырауларға қарағанда интерфейстер күрделі, әр түрлі және сондықтан оларды тексеру қиынырақ. Сонымен қатар, өйткені ioctl қоңырауларды үшінші тарап әзірлеушілері көбінесе негізгі операциялық жүйе шыққаннан кейін ұсына алады, ioctl қоңырауларды іске асыру аз бақылауға алынуы мүмкін және осылайша көп осалдықтарға ие болуы мүмкін. Соңында, көптеген ioctl қоңыраулар, әсіресе үшінші тараптың құрылғы драйверлері, құжатсыз.

Себебі өңдеуші ан ioctl қоңырау тікелей ядро ​​режимінде тұрады, кіріс пайдаланушылар кеңістігі мұқият тексерілуі керек. Құрылғы драйверлеріндегі осалдықтарды жергілікті пайдаланушылар жарамсыз буферді жіберу арқылы пайдалана алады ioctl қоңыраулар.

Win32 және Unix операциялық жүйелер қорғай алады пайдаланушылар кеңістігі құрылғыға белгілі бір қол жетімді басқару элементтері бар қосымшалар арқылы құрылғының атауы. Құрылғы драйверін әзірлеушілер пайдаланушылар кеңістігі қол жетімді объект.

Кейбір заманауи операциялық жүйелер ядроны қастықтан қорғайды пайдаланушылар кеңістігі код (жұқтырған қосымшалар сияқты) буферден асып кету пайдалану) пайдалану жүйелік қоңырау ораушылары. Жүйелік қоңырау ораушылары жүзеге асырылады қол жетімділікті басқару рөлі қандай қосымшалар арқылы қандай жүйелік қоңырауларды шақыруға болатындығын көрсету арқылы; орамдарды, мысалы, пошта бағдарламасының басқа бағдарламаларды шығару құқығын «жою» үшін пайдалануға болады. ioctl интерфейстер жүйелік қоңырау ораушыларын қиындатады, өйткені олардың саны көп, олардың әрқайсысы әртүрлі аргументтерді қолданады, олардың кейбіреулері қалыпты бағдарламаларға қажет болуы мүмкін.

Әрі қарай оқу

  • Ричард Стивенс, UNIX ортасында кеңейтілген бағдарламалау (Аддисон-Уэсли, 1992, ISBN  0-201-56317-7), 3.14 бөлім.
  • Жалпы енгізу-шығару операциялары арналған онлайн нұсқаулықта GNU C кітапханасы
  • ioctl (2) – 7-нұсқа Unix Бағдарламашы Қолмен
  • ioctl (2) – Linux Бағдарламашы Қолмен - Жүйелік қоңыраулар
  • ioctl (2) – FreeBSD Жүйелік қоңыраулар Қолмен
  • ioctl (2) – OpenBSD Жүйелік қоңыраулар Қолмен
  • ioctl (2) – Solaris 10 Жүйелік қоңыраулар туралы анықтама Қолмен
  • «DeviceIoControl құжаттамасы кезінде Microsoft Developer Network

Әдебиеттер тізімі

  1. ^ Никлас Халлквист (2002); Марко Пиребум (2006). «bio (4) - блок I / O иоктл туннелін жалған құрылғы». BSD анықтамалығы. OpenBSD. Түйіндеме.
  2. ^ Марко Пиребум (2005). «bioctl (8) - RAID басқару интерфейсі». BSD анықтамалығы. OpenBSD. Түйіндеме.
  3. ^ «sysmon (4) - жүйенің мониторингі және қуатты басқару интерфейсі». NetBSD. / Dev / sysmon арқылы қол жетімді ioctl (2) интерфейсі.
  4. ^ Кристиансен, Том; Торкингтон, Натан (1998). «12: бумалар, кітапханалар және модульдер». Perl аспаздық кітабы: шешімдер және Perl бағдарламашыларына арналған мысалдар (2 басылым). Себастополь, Калифорния: O'Reilly Media, Inc. (2003 жылы шыққан). б. 482. ISBN  9780596554965. Алынған 2016-11-15. [...] TIOCSTI [...] «терминал енгізу / шығару бақылауы, терминал кірісін имитациялау» дегенді білдіреді. Бұл функцияны іске асыратын жүйелерде ол бір таңбаны сіздің құрылғыңыздың ағынына итермелейді, сондықтан келесі жолы кез-келген процесс осы құрылғыдан оқыған кезде, сіз сол жерде орналастырған таңбаны алады.
  5. ^ Федерико Бианкузи (2004-10-28). «OpenBSD 3.6 Live». ONLAM. O'Reilly Media. Алынған 2019-03-20. Ядроға функционалдылықты қосуға болатын екі жүйелік шақыру бар (тағы бір жүйелік шақыруды қоспай): ioctl (2) және sysctl (3). Соңғысы жаңа мүмкіндікті жүзеге асыру өте қарапайым болғандықтан таңдалды.
  6. ^ Тим Рейннур; Билл Сквьеер (2007-12-19). «envsys - экологиялық жүйелер API». NetBSD 4.0. Бұл API эксперименттік болып табылады және кез-келген уақытта қолданыстан шығарылуы мүмкін ... Осы API-ді sysctl (8) интерфейсімен немесе ядро ​​оқиғалары механизмімен ауыстыру керек, оны жасау керек.
  7. ^ Константин А.Муренин (2007-04-17). «3.5. NetBSD сисмоны (4)». Микропроцессорлық жүйенің аппараттық мониторларымен интерфейстің жалпылануы. 2007 ж. 15-17 сәуір аралығында IEEE желілік байланыс, сезіну және басқару жөніндегі халықаралық конференция материалдары. Лондон, Ұлыбритания: IEEE. 901–906 бет. дои:10.1109 / ICNSC.2007.372901. ISBN  978-1-4244-1076-7. IEEE ICNSC 2007, 901—906 бет.
  8. ^ Константин А.Муренин (2010-05-21). «6.1. Framework timeline; 7.1. NetBSD envsys / sysmon». OpenBSD аппараттық сенсорлары - қоршаған ортаны бақылау және желдеткішті басқару (MMath тезис). Ватерлоо университеті: UWSpace. hdl:10012/5234. Құжат идентификаторы: ab71498b6b1a60 ff817 b29d56997a418.
  9. ^ McIlroy, M. D. (1987). Unix оқырманы: бағдарламашының нұсқаулығынан түсіндірмелі үзінділер, 1971–1986 жж (PDF) (Техникалық есеп). CSTR. Bell Labs. 139.