Кіріспе
Орындалып жатқан операциялық жүйе ядросын кеңейтетін динамикалық жүктелетін модуль. Компьютерлік жүйеде жүктелетін ядролық модуль (LKM) – операциялық жүйенің жұмыс істеп тұрған ядросын немесе базалық ядроны кеңейтуге арналған кодты қамтитын объектілік файл. LKM әдетте жаңа аппараттық құралдарды (құрылғы драйверлері ретінде) және/немесе файлдық жүйелерді қосу үшін, сондай-ақ жүйелік шақыруларды қосу үшін пайдаланылады. LKM қамтамасыз ететін функционалдық қажет болмаған жағдайда, оны жадты және басқа да ресурстарды босату үшін шығаруға болады. Көптеген қазіргі Unix сияқты жүйелер мен Microsoft Windows жүктелетін ядролық модульдерді түрлі атаулармен қолдайды, мысалы FreeBSD-дегі ядролық жүктелетін модуль (kld), macOS-тағы ядролық кеңейтім (kext) (бірақ үшінші тарап модульдерді қолдау тоқтатылуда), AIX-тағы ядролық кеңейтім модулі, HP UX-тегі динамикалық жүктелетін ядролық модуль, Windows NT-дегі ядролық режимдегі драйвер және VxWorks-тағы жүктелетін ядролық модуль (DKM). Олар сондай-ақ ядролық жүктелетін модульдер (немесе KLM) және жай ғана ядролық модульдер (KMOD) деп те аталады.
In computing, a loadable kernel module (LKM) is an object file that contains code to extend the running kernel, or so called base kernel, of an operating system. LKMs are typically used to add support for new hardware (as device drivers) and/or filesystems, or for adding system calls. When the functionality provided by an LKM is no longer required, it can be unloaded in order to free memory and other resources. Most current Unix like systems and Microsoft Windows support loadable kernel modules under different names, such as kernel loadable module (kld) in FreeBSD, kernel extension (kext) in macOS (although support for third party modules is being dropped), kernel extension module in AIX, dynamically loadable kernel module in HP UX, kernel mode driver in Windows NT and downloadable kernel module (DKM) in VxWorks. They are also known as kernel loadable modules (or KLM), and simply as kernel modules (KMOD).
Артықшылықтар
Жүктеп қосылатын ядро модульдері болмаса, операциялық жүйеде барлық болжамды мүмкіндіктер тікелей негізгі ядроға енгізілуі керек болар еді. Мұндай мүмкіндіктердің көп бөлігі пайдаланылмастан жадта тұрақталып, жадты бекерге шығындап, пайдаланушыларға жаңа мүмкіндік қажет болған сайын негізгі ядроны қайта құрып, жүйені қайта іске қосу қажет болар еді.
Кемшіліктер
Модульді ядроны статикалық ядроға басымдық берудің бір шағын кемшілігі – фрагментация салдары. Базалық ядро әрқашан жүйелік бағдарламалар арқылы нақты, үздіріссіз жадқа ашылады; сондықтан базалық ядро коды ешқашан фрагменттелмейді. Жүйе модульдерді қосуға дайын болған кезде, мысалы, модульдерді қамтитын файлдық жүйелер орнатылғаннан кейін, кез келген жаңа ядро кодын қосу ядроның фрагменттелуіне әкелуі мүмкін, соның салдарынан TLB жазбаларын көп пайдалану арқылы аз ғана өнімділік төмендеуіне себеп болады, бұл TLB қателіктерін көбейтуі мүмкін.
Linux жүйесі
Linux-тағы жүктелетін ядро модульдері modprobe командасы арқылы жүктеледі (және жойылады). Олар /lib/modules немесе /usr/lib/modules каталогында орналасқан және 2.6 нұсқасынан бастап ko ("ядро нысаны") кеңейтімімен белгіленеді (алдыңғы нұсқалар o кеңейтімін пайдаланған). lsmod командасы жүктелген ядро модульдерін тізімдейді. Төтенше жағдайларда, мысалы, бұзылған модульдер салдарынан жүйе іске қосылмаса, нақты модульдерді ядроның іске қосылу параметрлері тізімін өңдеу арқылы қосуға немесе өшіруге болады (мысалы, GRUB пайдаланған жағдайда, GRUB бастау мәзірінде 'e' пернесін басып, содан кейін ядро параметрлері жолын өңдеу арқылы).
Лицензия мәселелері
Linux-ты қолдаушылардың пікірінше, LKM ядроның туынды жұмыстары болып табылады. Linux қолдаушылары меншік модульдерді таратуға төзеді, бірақ символдарды тек GNU General Public License (GPL) модульдері үшін ғана қолжетімді деп белгілеуге рұқсат береді. Меншік немесе GPL-мен үйлесімсіз модульді жүктеу, жұмыс істеп тұрған ядрода "ластану" (taint) белгісін қояды – яғни кез келген проблемалар немесе қателерді қолдаушылар тексеруі азырақ болады. LKM-дер жұмыс істеп тұрған ядроның бір бөлігіне айналғандықтан, ядро дерек құрылымдарын бұзуы және модуль шынымен меншік болған жағдайда тергеу мүмкін болмайтын қателер тудыруы мүмкін.
FreeBSD-нің нұсқасы
FreeBSD үшін ядро модульдері операциялық жүйемен бірге келген модульдер үшін /boot/kernel/ каталогында, ал FreeBSD порттарынан немесе пакеттерінен орнатылған модульдер үшін немесе жабық немесе тек бинарлық форматтағы модульдер үшін әдетте /boot/modules/ каталогында сақталады. FreeBSD ядро модульдері көбінесе ko кеңейтімімен аяқталады. Жүйе іске қосылғаннан кейін, оларды kldload командасымен жүктеуге, kldunload командасымен жоюға және kldstat командасымен тізімдеуге болады. Модульдерді ядро жүктелу алдында жүктеуге де болады, автоматты түрде (/boot/loader.conf арқылы) немесе қолмен.
macOS
macOS жүйесіндегі кейбір жүктелетін ядро модульдері автоматты түрде жүктелуі мүмкін. Жүктелетін ядро модульдерін kextload командасы арқылы да жүктеуге болады. Оларды kextstat командасымен тізімдеуге болады. Жүктелетін ядро модульдері .kext кеңейтімі бар бумаларда орналасқан. Операциялық жүйемен бірге келген модульдер /System/Library/Extensions каталогында сақталады, ал үшінші тараптан келген модульдер басқа әртүрлі каталогтарда орналасады.
NetWare (Желкен бағдарламалық қамтамасыз ету)
NetWare ядролық модулі NetWare жүктелетін модулі (NLM) деп аталады. NLM-дер NetWare ядросына LOAD командасы арқылы қосылады, ал UNLOAD командасы арқылы алынып тасталады; модульдер командасы қазіргі уақытта жүктелген ядролық модульдердің тізімін көрсетеді. NLM-дер NetWare серверінде белгіленген кез келген жарамды іздеу жолында орналаса алады және олардың файл атауының қосымшасы NLM болып табылады.
VxWorks-тың атауы
Жүктеп алуға болатын ядролық модуль (DKM) жобасын ".out" файлы түрінде жасауға болады, осы файлды "ld" командасы арқылы ядролық кеңістікке жүктеуге болады. Бұл жүктелген ядролық модульді "unld" командасымен жоюға болады.
Соларис
Solaris-те конфигурацияланатын ядро модульін жүктеу жолы бар, ол әдепкі бойынша /platform/platform name/kernel /kernel /usr/kernel болып табылады. Көптеген ядро модульдері /kernel каталогының ішіндегі қосалқы каталогтарда орналасқан; жүйені init бастай алатындай деңгейге дейін іске қосу үшін қажет емес саналатындары көбінесе (бірақ әрдайым емес) /usr/kernel каталогында табылады. DEBUG ядросын іске қосқанда жүйе модульдерді белсенді түрде босатуға тырысады.
Бинарлық үйлесімділік
Linux ядро модульдері үшін тұрақты API немесе ABI қамтамасыз етпейді. Бұл әртүрлі ядро нұсқалары арасында ішкі құрылым мен функцияларда айырмашылықтар бар екенін білдіреді, бұл үйлесімділік проблемаларын тудыруы мүмкін. Осы проблемалармен күресу мақсатында, жүктелетін ELF модульдерінің modinfo бөліміне символ нұсқалау деректері орналастырылады. Бұл нұсқалау туралы ақпарат модульді жүктеу алдында жұмыс істеп тұрған ядромен салыстырылады; егер нұсқалар үйлесімсіз болса, модуль жүктелмейді. Solaris, FreeBSD, macOS және Windows сияқты басқа операциялық жүйелер ядролық API мен ABI-ді салыстырмалы түрде тұрақты ұстайды, осылайша осы мәселенің алдын алады. Мысалы, 6.0 ядролық нұсқасына компиляцияланған FreeBSD ядролық модульдері кез келген басқа FreeBSD 6.x нұсқасында, мысалы 6.4 нұсқасында қайта компиляциялаусыз жұмыс істейді. Дегенмен, олар басқа негізгі нұсқалармен үйлесімсіз және FreeBSD 7.x нұсқасымен пайдалану үшін қайта құрастырылуы керек, себебі API және ABI үйлесімділігі тек бір тармақ ішінде сақталады.
Қауіпсіздік
Жүктеп алынатын ядро модульдері жұмыс істеп тұрған ядроны өзгертудің ыңғайлы тәсілі болғанымен, бұл мүмкіндікті шабуылшылар бұзылған жүйеде өз процестерін немесе файлдарын анықтаудан жасыру үшін пайдаланып, жүйеге бақылауды ұзартуы мүмкін. Көптеген rootkit-тер осылайша ядро модульдерін пайдаланады. Құрылғылық жүйелердің көпшілігінде модульдер ешқандай жағдайда құқықтарды арттыруға көмектеспейтінін ескеру қажет, себебі ядро модулін жүктеу үшін жоғары құқықтар қажет; олар шабуылшыға бұзушылықты жасыруды ғана жеңілдетеді.
Linux жүйесі
Linux жүйесі модульдерді жүктеуді sysctl опциясы /proc/sys/kernel/modules арқылы өшіруге мүмкіндік береді. Initramfs жүйесі машина іске қосылғанда қажетті нақты модульдерді жүктеуі және содан кейін модульдерді жүктеуді тоқтатуы мүмкін. Бұл қауіпсіздік деңгейін монолитті ядроға жақын етеді. Егер шабуылшы initramfs-ті өзгерте алса, ол ядроның бинарлық кодын да өзгерте алады.
macOS
OS X Yosemite және одан кейінгі нұсқаларда ядролық кеңейту, белгілі бір "құқыққа" ие әзірлеуші куәлігімен цифрлық қолтаңба қойылған кодтан тұруы керек. Apple компаниясы мұндай куәлікті тек қана өтініш бойынша ғана ұсынады және ол Apple Developer мүшелеріне автоматты түрде берілмейді. Бұл мүмкіндік, "kext қолтаңбалау" деп аталады, әдепкі бойынша қосылған және егер қолтаңбасы жоқ ядролық кеңейтулер табылса, жүйенің іске қосылуын тоқтатуға нұсқау береді. OS X El Capitan және одан кейінгі нұсқаларда ол Жүйелік қауіпсіздікті қорғау құрамына кіреді. macOS-тың ескі нұсқаларында немесе kext қолтаңбалау өшірілген жағдайда, ядролық кеңейту жинағындағы жүктелетін ядро модулін түбірлік құқықтары жоқ пайдаланушылар да жүктеуге болады, егер жинақтың қасиеттері тізімінде OSBundleAllowUserLoad қасиеті True мәніне орнатылған болса. Дегенмен, егер жинақтағы файлдардың кез келгені, соның ішінде орындалатын код файлы, түбірлік пайдаланушыға және wheel тобына тиесілі болмаса немесе топқа немесе "басқа" пайдаланушыларға жазу рұқсаты берілсе, ядро модулін жүктеу әрекеті сәтсіз аяқталады.
Соларис
Ядро модульдері, қажет болған жағдайда, Verified Boot саясаты параметрлеріне байланысты жүктелу кезінде тексерілетін криптографиялық қолтаңбасы бар ELF бөліміне ие болуы мүмкін. Ядро модульдердің сенімді сертификаттар жиынтығымен криптографиялық түрде қол қойылғанын қамтамасыз ете алады; сенімді сертификаттар тізімі кейбір SPARC платформаларында ОС-тан тыс, ILOM-да сақталады. Пайдаланушы бастамасымен ядро модулін жүктеу, жүйе өзгермейтін жаһандық аймақ мүмкіндігімен жұмыс істесе ғана, Сенімді Жол арқылы мүмкін.