Чим відрізняється простір ядра від простору користувача? Чи означають простір ядра, нитки ядра, процеси ядра та стек ядра те саме? Також для чого нам потрібна ця диференціація?
Чим відрізняється простір ядра від простору користувача? Чи означають простір ядра, нитки ядра, процеси ядра та стек ядра те саме? Також для чого нам потрібна ця диференціація?
Відповіді:
Дійсно спрощений відповідь , що ядро працює в просторі ядра, і звичайні програми працюють в просторі користувача. Користувацький простір в основному є формою пісочного боксу - він обмежує користувацькі програми, щоб вони не могли возитися з пам'яттю (та іншими ресурсами), що належать іншим програмам або ядром ОС. Це обмежує (але, як правило, не повністю усуває) їхню здатність робити такі погані речі, як аварія машини.
Ядро є ядром операційної системи. Зазвичай він має повний доступ до всієї пам’яті та апаратного забезпечення машини (і всього іншого на машині). Щоб зберегти машину максимально стабільною, зазвичай потрібно, щоб у режимі ядра / просторі ядра працював лише найнадійніший і перевірений код.
Стек - це ще одна частина пам’яті, тому, природно, вона відокремлена прямо разом із рештою пам’яті.
Random Access Memory (RAM) може бути логічно розділена на два окремих регіону , а саме -. Простору ядра і простору користувача ( The Фізичні адреси ОЗУ фактично не розділені тільки віртуальні адреси , все це здійснюється MMU )
Ядро працює в правій частині пам'яті. Ця частина пам'яті не може бути доступна безпосередньо процесами звичайних користувачів, тоді як ядро може отримати доступ до всіх частин пам'яті. Щоб отримати доступ до деякої частини ядра, то призначені для користувача процеси повинні використовувати зумовлену систему викликів тобто open
, read
, і write
т.д. Крім того , C
бібліотечні функції , такі як printf
виклик системи виклику write
в черзі.
Виклики системи виконують функцію інтерфейсу між користувачами та процесами ядра. Права доступу розміщуються на просторі ядра для того, щоб перешкоджати користувачам не возитися з ядром, несвідомо.
Отже, коли відбувається системний виклик, ядро надсилається програмне переривання. ЦП може тимчасово здати елемент керування в пов'язаний з ним обробник перерв. Процес ядра, який був зупинений перериванням, поновлюється після того, як програма обробки переривання завершить свою роботу.
Простір ядра та віртуальний простір - це поняття віртуальної пам'яті .... це не означає, що Рам (ваша фактична пам'ять) поділений на ядро та простір користувача. Кожному процесу надається віртуальна пам'ять, яка поділяється на ядро та користувальницький простір.
Таким чином, кажучи: "Пам'ять з випадковим доступом (ОЗП) можна розділити на дві різні області, а саме - простір ядра та простір користувача". неправильно.
& щодо речі "Простір ядра проти простору користувача"
Коли процес створюється і його віртуальна пам'ять ділиться на простір користувача та простір ядра, де область простору користувача містить дані, код, стек, купу процесу та простір ядра містить такі речі, як таблиця сторінок для процесу , структури даних ядра та код ядра тощо. Для запуску космосу простору ядра керування має перейти до режиму ядра (використовуючи переривання програмного забезпечення 0x80 для системних викликів), а стек ядра в основному ділиться між усіма процесами, які в даний час виконуються в просторі ядра.
Кільця процесора - це найяскравіша відмінність
У захищеному режимі x86 процесор завжди знаходиться в одному з 4-х кілець. Ядро Linux використовує лише 0 і 3:
Це найскладніше та швидке визначення ядра проти користувача.
Чому Linux не використовує кільця 1 і 2: Привілейовані кільця процесора: Чому кільця 1 і 2 не використовуються?
Як визначається поточне кільце?
Поточне кільце вибирається комбінацією:
глобальна таблиця дескрипторів: таблиця пам'яті записів GDT, і кожен запис має поле, Privl
яке кодує кільце.
Інструкція LGDT встановлює адресу в поточній таблиці дескрипторів.
Дивіться також: http://wiki.osdev.org/Global_Descriptor_Table
сегмент реєструє CS, DS тощо, які вказують на індекс запису в GDT.
Наприклад, CS = 0
означає, що перший запис GDT в даний час активний для виконуючого коду.
Що може зробити кожне кільце?
Фізичний процесор фізично побудований так:
кільце 0 може робити що завгодно
кільце 3 не може виконати кілька інструкцій і записати в декілька регістрів, особливо:
не може змінити власне кільце! В іншому випадку він може встановити себе на 0 і дзвінки будуть марні.
Іншими словами, не може змінювати дескриптор поточного сегмента , який визначає поточне кільце.
не вдається змінити таблиці сторінок: Як працює підказка x86?
Іншими словами, не вдається змінити регістр CR3, а саме підкачка запобігає зміні таблиць сторінки.
Це заважає одному процесу бачити пам'ять інших процесів з безпеки / простоти програмування.
не може зареєструвати обробників переривань. Вони налаштовані записом у місця пам'яті, що також запобігається підключенням сторінки.
Обробники працюють у кільці 0 і порушують модель безпеки.
Іншими словами, не можна використовувати інструкції LGDT та LIDT.
не може зробити інструкції введення - виведення , як in
і out
, і , отже , мають довільні апаратні доступів.
В іншому випадку, наприклад, дозволи на файли були б марними, якби будь-яка програма могла безпосередньо читати з диска.
Точніше завдяки Майклу Петчу : насправді ОС може дозволити вказівки вводу-виводу на кільце 3, це фактично контролюється сегментом стану завдань .
Що неможливо, це те, щоб кільце 3 дало собі дозвіл на це, якщо б його не було в першу чергу.
Linux завжди забороняє це. Дивіться також: Чому Linux не використовує апаратний контекстний комутатор через TSS?
Як програми та операційні системи переходять між кільцями?
коли ЦП увімкнено, він починає виконувати початкову програму в кільці 0 (добре вид, але це гарне наближення). Ви можете вважати, що ця початкова програма є ядром (але зазвичай це завантажувач, який потім викликає ядро все ще в кільці 0 ).
коли процес користування користувачем хоче, щоб ядро щось зробило для нього, наприклад, записати у файл, воно використовує інструкцію, яка генерує переривання, наприклад, int 0x80
абоsyscall
сигналізує ядро. Приклад світу syscall для Linux x86-64:
.data
hello_world:
.ascii "hello world\n"
hello_world_len = . - hello_world
.text
.global _start
_start:
/* write */
mov $1, %rax
mov $1, %rdi
mov $hello_world, %rsi
mov $hello_world_len, %rdx
syscall
/* exit */
mov $60, %rax
mov $0, %rdi
syscall
компілювати та запускати:
as -o hello_world.o hello_world.S
ld -o hello_world.out hello_world.o
./hello_world.out
Коли це відбувається, процесор викликає обробник зворотного виклику переривання, який ядро зареєструвало під час завантаження. Ось конкретний бареметальний приклад, який реєструє обробник та використовує його .
Цей обробник працює в кільці 0, яке вирішує, чи дозволить ядро дозволити цю дію, зробіть дію та перезапустіть програму для користувальниць у кільці 3. x86_64
коли використовується exec
системний виклик (або коли почнеться/init
ядро ), ядро готує регістри та пам'ять нового процесу користувальницької програми, після чого переходить до точки входу та перемикає процесор на 3
Якщо програма намагається зробити щось неслухняне, як-от записати в заборонений регістр або адресу пам'яті (через підкачку), процесор також викликає деякий обробник зворотних викликів ядра в кільці 0.
Але оскільки користувальницька ділянка була неслухняною, ядро може цього разу вбити процес або надати йому попередження сигналом.
Коли ядро завантажується, воно встановлює апаратний годинник з певною фіксованою частотою, яка генерує періодично переривання.
Цей апаратний годинник генерує переривання, які виконують кільце 0, і дозволяють йому планувати, які процеси користувача пробуджуються.
Таким чином, планування може відбутися, навіть якщо процеси не здійснюють жодних системних викликів.
Який сенс мати кілька кілець?
Є дві основні переваги розділення ядра та користувальницької області:
Як з цим пограти?
Я створив голий металевий інструмент, який повинен бути хорошим способом безпосередньо керувати кільцями: https://github.com/cirosantilli/x86-bare-metal-examples
На жаль, у мене не було терпіння зробити приклад userland, але я все-таки пішов далеко до налаштування підкачки, тому поле користування повинно бути здійсненим. Я хотів би побачити прохання про тягнення.
Крім того, модулі ядра Linux запускаються в кільці 0, тому ви можете використовувати їх для випробування привілейованих операцій, наприклад, зчитувати регістри управління: Як отримати доступ до регістрів керування cr0, cr2, cr3 з програми? Помилка сегментації
Ось зручна настройка QEMU + Buildroot, щоб спробувати це, не вбиваючи хоста.
Недоліком модулів ядра є те, що інші kthreads працюють і можуть перешкоджати вашим експериментам. Але теоретично ви можете взяти на себе всі обробники переривань за допомогою модуля ядра та володіти системою, що насправді був би цікавим проектом.
Негативні кільця
Хоча на негативні дзвінки фактично не посилаються в посібнику Intel, фактично існують режими процесора, які мають додаткові можливості, ніж сам Ring 0, і тому добре підходять для імені "негативне кільце".
Одним із прикладів є режим гіпервізора, який використовується у віртуалізації.
Детальнішу інформацію див.
ARM
В ARM кільця називаються рівнями виключення, але основні ідеї залишаються тими ж.
У ARMv8 існує 4 рівні винятків, які зазвичай використовуються як:
EL0: поле користування
EL1: ядро ("супервізор" в термінології ARM).
Входить до svc
інструкції (SuperVisor Call), раніше відомої як swi
до уніфікованої збірки , що є інструкцією, що використовується для здійснення системних викликів Linux. Привіт світу ARMv8 приклад:
привіт.С
.text
.global _start
_start:
/* write */
mov x0, 1
ldr x1, =msg
ldr x2, =len
mov x8, 64
svc 0
/* exit */
mov x0, 0
mov x8, 93
svc 0
msg:
.ascii "hello syscall v8\n"
len = . - msg
Перевірте це за допомогою QEMU на Ubuntu 16.04:
sudo apt-get install qemu-user gcc-arm-linux-gnueabihf
arm-linux-gnueabihf-as -o hello.o hello.S
arm-linux-gnueabihf-ld -o hello hello.o
qemu-arm hello
Ось конкретний бареметальний приклад, який реєструє обробник SVC та виконує виклик SVC .
EL2: гіпервізори , наприклад Xen .
Введено в hvc
інструкцію (HyperVisor Call).
Гіпервізор - це ОС, що ОС - це країна користувачів.
Наприклад, Xen дозволяє одночасно запускати кілька операційних систем, таких як Linux або Windows, в одній системі, і він ізолює ОС одна від одної для безпеки та зручності налагодження, як і Linux для програм користування.
Гіпервізори є ключовою частиною сьогоднішньої хмарної інфраструктури: вони дозволяють декільком серверам працювати на одному апаратному забезпеченні, зберігаючи використання обладнання завжди близько 100% та економлячи багато грошей.
Наприклад, AWS використовував Xen до 2017 року, коли його перехід на KVM повідомив новину .
EL3: ще один рівень. Приклад TODO
Введено smc
інструкцією (захищений режим виклику)
ARMv8 Architecture Reference Model DDI 0487C.a - Глава D1 - У AArch64 рівневої системи програміст Модель - Малюнок D1-1 ілюструє це красиво:
Ситуація з ARM трохи змінилася з появою розширень хостів віртуалізації ARMv8.1 (VHE) . Це розширення дозволяє ядру ефективно працювати в EL2:
VHE був створений тому, що рішення для віртуалізації в ядрі Linux, такі як KVM, отримали перевагу над Xen (див., Наприклад, перехід AWS до KVM, згаданий вище), тому що більшість клієнтів потребують лише VM Linux, і як ви можете собі уявити, будучи все в одному Проект, KVM простіший і потенційно ефективніший, ніж Xen. Тож тепер головне ядро Linux виступає як гіпервізор у тих випадках.
Зверніть увагу, як ARM, можливо, завдяки перевазі заднього огляду, має кращу конвенцію іменування рівнів привілеїв, ніж x86, без необхідності негативних рівнів: 0 - нижчий та 3 найвищий. Вищі рівні, як правило, створюються частіше, ніж нижчі.
Поточний EL можна запитати за допомогою MRS
інструкції: який поточний режим виконання / виняток та інше?
ARM не вимагає наявності всіх рівнів винятків, щоб дозволити реалізації, які не потребують функції для збереження області чіпів. ARMv8 "Рівень винятку" говорить:
Реалізація може не включати всі рівні виключень. Усі реалізації повинні включати EL0 та EL1. EL2 та EL3 необов'язкові.
Наприклад, QEMU за замовчуванням для EL1, але EL2 та EL3 можна ввімкнути за допомогою параметрів командного рядка: qemu-system-aarch64 введення el1 при емуляції включення a53
Фрагменти коду, протестовані на Ubuntu 18.10.
Простір ядра та простір користувача - це розділення привілейованих функцій операційної системи та обмежених програм користувачів. Розмежування необхідне для того, щоб користувацькі програми не могли перекидати ваш комп'ютер. Було б погано, якби будь-яка стара програма користувача могла почати записувати випадкові дані на ваш жорсткий диск або читати пам'ять з простору пам'яті іншої користувацької програми.
Програми простору користувача не можуть отримати доступ до системних ресурсів безпосередньо, тому ядро операційної системи обробляє доступ від імені програми. Програми простору користувачів зазвичай роблять такі запити операційної системи через системні дзвінки.
Ядра нитки, процеси, стек - це не те саме. Вони є аналогічними конструкціями для простору ядра, як їх аналоги в просторі користувача.
У кожного процесу є 4 ГБ віртуальної пам'яті, яка відображається у фізичну пам'ять за допомогою таблиць сторінок. Віртуальна пам'ять здебільшого розділена на дві частини: 3 Гб для використання процесу та 1 ГБ для використання ядра. Більшість створених змінних лежать у першій частині адресного простору. Ця частина називається простором користувача. Остання частина - це місце, де знаходиться ядро і є загальним для всіх процесів. Це називається простором ядра, і більша частина цього простору відображається у вихідні місця фізичної пам'яті, де зображення ядра завантажується під час завантаження.
Максимальний розмір адресного простору залежить від довжини регістру адреси в процесорі.
У системах з 32-бітовими реєстрами адрес максимальний розмір адресного простору становить 2 32 байти, або 4 ГБ. Аналогічно, у 64-бітових системах можуть бути адресовані 2 64 байти.
Такий адресний простір називається віртуальною пам'яттю або віртуальним адресним простором . Насправді це не пов’язано з фізичним розміром оперативної пам’яті.
На платформах Linux віртуальний адресний простір поділяється на простір ядра та простір користувача.
Константа, орієнтована на архітектуру, яка називається обмеженням розміру завдання , або TASK_SIZE
позначає позицію, де відбувається розкол:
діапазон адрес від 0 до TASK_SIZE
-1 відводиться користувальницькому простору;
решта від TASK_SIZE
до 2 32 -1 (або 2 64 -1) відводиться простору ядра.
Наприклад, у певній 32-бітній системі, 3 ГБ може бути зайнято для користувальницького простору та 1 ГБ для простору ядра.
Кожна програма / програма в подібній операційній системі Unix - це процес; кожен з них має унікальний ідентифікатор під назвою Process Identifier (або просто ідентифікатор процесу , тобто PID). Linux надає два механізми створення процесу: 1. fork()
системний виклик, або 2. exec()
виклик.
Нитка ядра - це легкий процес, а також програма, що виконується. Один процес може складатися з декількох потоків, що обмінюються одними і тими ж даними та ресурсами, але мають різні шляхи через програмний код. Linux забезпечує clone()
системний виклик для генерації потоків.
Прикладом використання потоків ядра є: синхронізація даних оперативної пам’яті, що допомагає планувальнику розподіляти процеси між процесорами тощо.
Коротко: ядро працює в просторі ядра, простір ядра має повний доступ до всієї пам'яті та ресурсів, ви можете сказати, поділ пам’яті на дві частини, частина для ядра, а частина для власного процесу користувача, (простір користувача) запускає звичайні програми, користувач простір не може отримати доступ безпосередньо до простору ядра, тому він вимагає від ядра використовувати ресурси. за допомогою syscall (попередньо визначений системний виклик у glibc)
є твердження, що спрощує різні " Користувацький простір - просто тестове навантаження для ядра " ...
Щоб бути дуже зрозумілим: архітектура процесора дозволяє процесору працювати в двох режимах, режимі ядра та користувальницькому режимі , інструкція по апаратному забезпеченню дозволяє переходити з одного режиму в інший.
пам'ять може бути позначена як частина простору користувача або простору ядра.
Коли ЦП працює в режимі користувача, ЦП може отримати доступ лише до пам'яті, яка знаходиться в просторі користувача, тоді як процесор намагається отримати доступ до пам'яті в просторі ядра, результат є "апаратним винятком", коли ЦП працює в режимі ядра, ЦП може отримати доступ безпосередньо до простору ядра та простору користувача ...
Простір ядра означає, що простір пам'яті може торкатися лише ядра. У 32-бітовому Linux це 1G (від 0xC0000000 до 0xffffffff як адреса віртуальної пам'яті). Кожен процес, створений ядром, також є ниткою ядра, тому для одного процесу є два стеки: один стек у користувальницькому просторі для цього процесу та інший у ядрі простір для потоку ядра.
стек ядра, що займає 2 сторінки (8 к у 32-бітовому Linux), включає task_struct (близько 1k) та реальний стек (близько 7k). Останній використовується для зберігання деяких автоматичних змінних або парам викликів функцій або адреси функції у функціях ядра. Ось код (Processor.h (linux \ include \ asm-i386)):
#define THREAD_SIZE (2*PAGE_SIZE)
#define alloc_task_struct() ((struct task_struct *) __get_free_pages(GFP_KERNEL,1))
#define free_task_struct(p) free_pages((unsigned long) (p), 1)
__get_free_pages (GFP_KERNEL, 1)) означає розподілити пам'ять як 2 ^ 1 = 2 сторінки.
Але стек процесів - інша річ, його адреса - лише нижче 0xC0000000 (32-бітний Linux), розмір якого може бути набагато більшим, використовуваний для викликів функції простору користувача.
Отож ось питання щодо системного виклику, він працює в просторі ядра, але викликається процесом у просторі користувача, як це працює? Чи поставить Linux свої параметри та адресу функції в стек ядра чи стек процесів? Рішення Linux: всі системні виклики ініціюються перериванням програмного забезпечення INT 0x80. Визначено у entry.S (linux \ arch \ i386 \ kernel), ось кілька рядків, наприклад:
ENTRY(sys_call_table)
.long SYMBOL_NAME(sys_ni_syscall) /* 0 - old "setup()" system call*/
.long SYMBOL_NAME(sys_exit)
.long SYMBOL_NAME(sys_fork)
.long SYMBOL_NAME(sys_read)
.long SYMBOL_NAME(sys_write)
.long SYMBOL_NAME(sys_open) /* 5 */
.long SYMBOL_NAME(sys_close)
Автор Суніл Ядав, Quora:
Ядро Linux посилається на все, що працює в режимі ядра і складається з декількох різних шарів. На найнижчому шарі ядро взаємодіє з обладнанням через HAL. На середньому рівні ядро UNIX розділено на 4 окремі області. Перша з чотирьох областей обробляє символьні пристрої, сирі та приготовлені TTY та керування терміналами. Друга область обробляє мережеві драйвери пристроїв, протоколи маршрутизації та сокети. Третя область обробляє драйвери дискових пристроїв, кеші сторінок і буферів, файлову систему, віртуальну пам'ять, іменування файлів та відображення. Четверта і остання область обробляє процес диспетчеризації, планування, створення та припинення, а також обробку сигналів. Над усім цим ми маємо верхній шар ядра, який включає системні виклики, переривання та пастки. Цей рівень служить інтерфейсом для кожної з функцій нижчого рівня. Програміст використовує різні системні виклики та переривання для взаємодії з особливостями операційної системи.
IN короткий простір ядра - це частина пам’яті, де працює ядро Linux, (віртуальний простір 1 Гб у випадку Linux), а простір користувача - це частина пам’яті, де працює програма користувача (нижня 3 ГБ віртуальної пам’яті у випадку Linux. Якщо ви Хочете дізнатися більше дивіться посилання, подане нижче :)
http://learnlinuxconcepts.blogspot.in/2014/02/kernel-space-and-user-space.html
Намагаються дати дуже спрощене пояснення
Віртуальна пам'ять поділяється на простір ядра та простір користувача. Простір ядра - це область віртуальної пам'яті, де будуть працювати процеси ядра, а простір користувача - це область віртуальної пам’яті, де працюватимуть користувацькі процеси.
Цей розділ необхідний для захисту доступу до пам'яті.
Кожен раз, коли завантажувач запускає ядро після завантаження його до місця в оперативній пам'яті, (як правило, на основі контролера ARM), він повинен переконатися, що контролер знаходиться в режимі супервізора з вимкненими FIQ та IRQ.
Простір ядра та простір користувачів - це логічні простори.
Більшість сучасних процесорів розроблені для роботи в різних привілейованих режимах. Машини x86 можуть працювати в 4 різних привілейованих режимах.
І певна інструкція на машині може бути виконана, коли в / над конкретним привілейованим режимом.
Завдяки такій конструкції ви надаєте захист системи або обробку піском для виконання.
Ядро - це фрагмент коду, який керує вашим обладнанням і забезпечує абстракцію системи. Таким чином, він повинен мати доступ до всіх інструкцій з машини. І це найбільш надійний фрагмент програмного забезпечення. Тому я повинен бути виконаний з найвищою привілеєю. І рівень дзвінка 0 - це найбільш привілейований режим. Тож рівень кільця 0 також називають режимом ядра .
Користувацькі програми - це програмне забезпечення, яке надходить від будь-якого сторонніх постачальників, і ви не можете повністю їм довіряти. Хтось із шкідливим наміром може написати код для збоїв у вашій системі, якщо він мав повний доступ до всіх інструкцій на машині. Таким чином, програма повинна мати доступ до обмеженого набору інструкцій. І рівень дзвінка 3 - найменш пільговий режим. Отже, всі ваші програми працюють у такому режимі. Отже, рівень 3 дзвінка також називають режимом користувача .
Примітка: я не отримую рівня кільця 1 і 2. Вони в основному є режимами з проміжними привілеями. Тому може бути, що код драйвера пристрою виконується з цим привілеєм. AFAIK, linux використовує тільки кільцеві рівні 0 і 3 для виконання коду ядра та додатку користувача відповідно.
Отже, будь-яка операція, що відбувається в режимі ядра, може розглядатися як простір ядра. І будь-яка операція, що відбувається в режимі користувача, може розглядатися як простір користувача.
Правильна відповідь: Не існує такого поняття, як простір ядра та простір користувача. Набір інструкцій процесора має спеціальні дозволи для встановлення руйнівних речей, таких як корінь таблиці таблиці сторінок, або доступу до пам'яті апаратних пристроїв тощо.
Код ядра має привілеї найвищого рівня, а код користувача - найнижчий. Це запобігає збиткові коду користувача, зміні інших програм тощо.
Як правило, код ядра зберігається під іншою картою пам'яті, ніж код користувача (так само, як користувацькі простори зберігаються в інших картах пам'яті, ніж один). Звідси походять терміни «простір ядра» та «простір користувачів». Але це не важке і швидке правило. Наприклад, оскільки x86 опосередковано вимагає, щоб його обробники переривань / пасток постійно відображалися, частина (або всі ОС) ядра повинна бути відображена в просторі користувача. Знову ж таки, це не означає, що такий код має привілеї користувача.
Чому необхідне розділення ядра / користувача? Деякі дизайнери не згодні з тим, що це, власне, і потрібно. Архітектура Microkernel заснована на ідеї, що найвищі привілейовані розділи коду повинні бути якомога меншими, при цьому всі значні операції виконуються у привілейованому користувачем коді. Вам слід вивчити, чому це може бути хорошою ідеєю, це не проста концепція (і славиться як своїми перевагами, так і недоліками).
Пам'ять ділиться на дві чіткі області:
Процеси, що працюють в просторі користувача, мають доступ лише до обмеженої частини пам'яті, тоді як ядро має доступ до всієї пам'яті. Процеси, що працюють в просторі користувача, також не мають доступу до простору ядра. Процеси користувальницького простору можуть отримати доступ лише до невеликої частини ядра через інтерфейс, що піддається ядру - система викликає. Якщо процес виконує системний виклик, ядро надсилається програмне переривання, яке потім відправляє відповідний обробник переривання і продовжує його робота після закінчення обробника.
У Linux є два простору: 1 - це простір користувача, а інший - простір ядра. користувальницький простір складається лише з користувацького додатку, який ви хочете запустити. оскільки служба ядра є управління процесами, управління файлами, обробка сигналів, управління пам’яттю, управління потоками і так багато служб. якщо ви запускаєте додаток з користувальницького простору, додатки взаємодіють лише з сервісом ядра. і ця служба взаємодіє з драйвером пристрою, який присутній між апаратним забезпеченням та ядром. Основна перевага простору ядра та розділення простору користувача полягає в тому, що ми можемо забезпечити захист вірусом.bcaz всіх програм користувача, що знаходяться в просторі користувача, а сервіс присутній у просторі ядра. ось чому Linux не впливає на вірус.