Чим відрізняється простір ядра від простору користувача?


143

Чим відрізняється простір ядра від простору користувача? Чи означають простір ядра, нитки ядра, процеси ядра та стек ядра те саме? Також для чого нам потрібна ця диференціація?



Відповіді:


117

Дійсно спрощений відповідь , що ядро працює в просторі ядра, і звичайні програми працюють в просторі користувача. Користувацький простір в основному є формою пісочного боксу - він обмежує користувацькі програми, щоб вони не могли возитися з пам'яттю (та іншими ресурсами), що належать іншим програмам або ядром ОС. Це обмежує (але, як правило, не повністю усуває) їхню здатність робити такі погані речі, як аварія машини.

Ядро є ядром операційної системи. Зазвичай він має повний доступ до всієї пам’яті та апаратного забезпечення машини (і всього іншого на машині). Щоб зберегти машину максимально стабільною, зазвичай потрібно, щоб у режимі ядра / просторі ядра працював лише найнадійніший і перевірений код.

Стек - це ще одна частина пам’яті, тому, природно, вона відокремлена прямо разом із рештою пам’яті.


4
Так скажіть, якщо у мене в системі як 10 процесів. Це те, що кожен процес має свій стек, який розділений на стек користувача та стек ядра АБО всі процеси поділяють один стек ядра?
kc3

10
@ kc3: це принаймні частково залежить від ОС, але я вважаю, що у більшості є стек в режимі ядра для кожного процесу, який використовується, коли ядро ​​виконує дії від імені процесу (наприклад, вводу / виводу) і принаймні ще одного стек ядра, призначений виключно для внутрішнього використання ядра (наприклад, для планування).
Джеррі Труну

2
Чи існують процеси ядра та яка взаємозв'язок або відмінності з процесами в просторі користувачів, як це було задано?
Віктор Чой

Отже, щоби запустити процес користувальницького простору , він повинен бути відображений у просторі ядра ?
roottraveller

@roottraveller: Я не впевнений, що дало тобі цю ідею, але ні, зовсім не. У той же час процес користувальницького простору , як правило, матиме деяку (більш-менш приховану) пам’ять простору ядра, тому (наприклад) ваш процес матиме стек простору користувача та стек простору ядра, який використовується, коли ви робити дзвінки в ОС, які потрібно запускати в режимі ядра.
Джеррі Труну

64

Random Access Memory (RAM) може бути логічно розділена на два окремих регіону , а саме -. Простору ядра і простору користувача ( The Фізичні адреси ОЗУ фактично не розділені тільки віртуальні адреси , все це здійснюється MMU )

Ядро працює в правій частині пам'яті. Ця частина пам'яті не може бути доступна безпосередньо процесами звичайних користувачів, тоді як ядро ​​може отримати доступ до всіх частин пам'яті. Щоб отримати доступ до деякої частини ядра, то призначені для користувача процеси повинні використовувати зумовлену систему викликів тобто open, read, і writeт.д. Крім того , Cбібліотечні функції , такі як printfвиклик системи виклику writeв черзі.

Виклики системи виконують функцію інтерфейсу між користувачами та процесами ядра. Права доступу розміщуються на просторі ядра для того, щоб перешкоджати користувачам не возитися з ядром, несвідомо.

Отже, коли відбувається системний виклик, ядро ​​надсилається програмне переривання. ЦП може тимчасово здати елемент керування в пов'язаний з ним обробник перерв. Процес ядра, який був зупинений перериванням, поновлюється після того, як програма обробки переривання завершить свою роботу.


2
Перша частина цієї відповіді неправильна. Оперативна пам’ять не розділена на ядро ​​та користувальницький простір. Віртуальна пам'ять є. Я спробував редагувати відповідь, але черга редагування наповнена днями. Виправте, будь ласка. Подивіться відповідь Варуна нижче для отримання додаткової інформації.
MeLikeyCode

1
@MeLikeyCode Хіба це не виправдане спрощення в контексті спроби дати широко зрозумілу відповідь?
problemofficer

2
@problemofficer, я думаю, що велике спрощення може дати неправильне базове розуміння. Кожен повинен визначити, що фізична пам'ять не поділяється на простір користувача та простір ядра, але ядро ​​забезпечує абстракцію віртуальної пам'яті, яка поділяється на ядро ​​та простір користувача, а пізніше відображається на фізичну пам'ять.
dshil

22

Простір ядра та віртуальний простір - це поняття віртуальної пам'яті .... це не означає, що Рам (ваша фактична пам'ять) поділений на ядро ​​та простір користувача. Кожному процесу надається віртуальна пам'ять, яка поділяється на ядро ​​та користувальницький простір.

Таким чином, кажучи: "Пам'ять з випадковим доступом (ОЗП) можна розділити на дві різні області, а саме - простір ядра та простір користувача". неправильно.

& щодо речі "Простір ядра проти простору користувача"

Коли процес створюється і його віртуальна пам'ять ділиться на простір користувача та простір ядра, де область простору користувача містить дані, код, стек, купу процесу та простір ядра містить такі речі, як таблиця сторінок для процесу , структури даних ядра та код ядра тощо. Для запуску космосу простору ядра керування має перейти до режиму ядра (використовуючи переривання програмного забезпечення 0x80 для системних викликів), а стек ядра в основному ділиться між усіма процесами, які в даний час виконуються в просторі ядра.


1
Загальний процес має власний простір ядра та простір користувача?
Віктор Чой

@VictorChoy, процес виконується у двох режимах: користувачеві та ядра. Пам'ять, яку бачить процес, унікальна для нього. Але для кожного процесу, що працює в режимі ядра (виконання коду ядра), існує лише один простір - простір ядра.
dshil

Також зауважте, що коли створюється процес, його віртуальна пам'ять ділиться на 2 частини (користувач і ядро), де частина віртуальної адреси зарезервована для режиму користувача, а інша для режиму ядра.
dshil

19

Кільця процесора - це найяскравіша відмінність

У захищеному режимі x86 процесор завжди знаходиться в одному з 4-х кілець. Ядро Linux використовує лише 0 і 3:

  • 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
    

    GitHub вище за течією .

    Коли це відбувається, процесор викликає обробник зворотного виклику переривання, який ядро ​​зареєструвало під час завантаження. Ось конкретний бареметальний приклад, який реєструє обробник та використовує його .

    Цей обробник працює в кільці 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
    

    GitHub вище за течією .

    Перевірте це за допомогою 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.


11

Простір ядра та простір користувача - це розділення привілейованих функцій операційної системи та обмежених програм користувачів. Розмежування необхідне для того, щоб користувацькі програми не могли перекидати ваш комп'ютер. Було б погано, якби будь-яка стара програма користувача могла почати записувати випадкові дані на ваш жорсткий диск або читати пам'ять з простору пам'яті іншої користувацької програми.

Програми простору користувача не можуть отримати доступ до системних ресурсів безпосередньо, тому ядро ​​операційної системи обробляє доступ від імені програми. Програми простору користувачів зазвичай роблять такі запити операційної системи через системні дзвінки.

Ядра нитки, процеси, стек - це не те саме. Вони є аналогічними конструкціями для простору ядра, як їх аналоги в просторі користувача.


8

У кожного процесу є 4 ГБ віртуальної пам'яті, яка відображається у фізичну пам'ять за допомогою таблиць сторінок. Віртуальна пам'ять здебільшого розділена на дві частини: 3 Гб для використання процесу та 1 ГБ для використання ядра. Більшість створених змінних лежать у першій частині адресного простору. Ця частина називається простором користувача. Остання частина - це місце, де знаходиться ядро ​​і є загальним для всіх процесів. Це називається простором ядра, і більша частина цього простору відображається у вихідні місця фізичної пам'яті, де зображення ядра завантажується під час завантаження.


1
Ваша відповідь характерна для Windows; ви повинні уточнити це.
Матвій

1
Ви говорите, що для кожного процесу, що має віртуальну пам'ять 4 ГБ, 1 ГБ - це простір ядра, який однаковий для кожного процесу і просто містить карти. Я не можу зрозуміти чому !!
VISHAL DAGA

5

Максимальний розмір адресного простору залежить від довжини регістру адреси в процесорі.

У системах з 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()системний виклик для генерації потоків.

Прикладом використання потоків ядра є: синхронізація даних оперативної пам’яті, що допомагає планувальнику розподіляти процеси між процесорами тощо.


4

Коротко: ядро ​​працює в просторі ядра, простір ядра має повний доступ до всієї пам'яті та ресурсів, ви можете сказати, поділ пам’яті на дві частини, частина для ядра, а частина для власного процесу користувача, (простір користувача) запускає звичайні програми, користувач простір не може отримати доступ безпосередньо до простору ядра, тому він вимагає від ядра використовувати ресурси. за допомогою syscall (попередньо визначений системний виклик у glibc)

є твердження, що спрощує різні " Користувацький простір - просто тестове навантаження для ядра " ...

Щоб бути дуже зрозумілим: архітектура процесора дозволяє процесору працювати в двох режимах, режимі ядра та користувальницькому режимі , інструкція по апаратному забезпеченню дозволяє переходити з одного режиму в інший.

пам'ять може бути позначена як частина простору користувача або простору ядра.

Коли ЦП працює в режимі користувача, ЦП може отримати доступ лише до пам'яті, яка знаходиться в просторі користувача, тоді як процесор намагається отримати доступ до пам'яті в просторі ядра, результат є "апаратним винятком", коли ЦП працює в режимі ядра, ЦП може отримати доступ безпосередньо до простору ядра та простору користувача ...


2

Простір ядра означає, що простір пам'яті може торкатися лише ядра. У 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)

Останнє питання дуже добре, яке ви висували. Але просто переривання програмного забезпечення INT 0x80 , і далі? Це не дуже вдале пояснення для мене. Не могли б ви детально пояснити, як працює рішення для поставленого вами питання?
Віктор Чой

2

Автор Суніл Ядав, Quora:

Ядро Linux посилається на все, що працює в режимі ядра і складається з декількох різних шарів. На найнижчому шарі ядро ​​взаємодіє з обладнанням через HAL. На середньому рівні ядро ​​UNIX розділено на 4 окремі області. Перша з чотирьох областей обробляє символьні пристрої, сирі та приготовлені TTY та керування терміналами. Друга область обробляє мережеві драйвери пристроїв, протоколи маршрутизації та сокети. Третя область обробляє драйвери дискових пристроїв, кеші сторінок і буферів, файлову систему, віртуальну пам'ять, іменування файлів та відображення. Четверта і остання область обробляє процес диспетчеризації, планування, створення та припинення, а також обробку сигналів. Над усім цим ми маємо верхній шар ядра, який включає системні виклики, переривання та пастки. Цей рівень служить інтерфейсом для кожної з функцій нижчого рівня. Програміст використовує різні системні виклики та переривання для взаємодії з особливостями операційної системи.


2

IN короткий простір ядра - це частина пам’яті, де працює ядро ​​Linux, (віртуальний простір 1 Гб у випадку Linux), а простір користувача - це частина пам’яті, де працює програма користувача (нижня 3 ГБ віртуальної пам’яті у випадку Linux. Якщо ви Хочете дізнатися більше дивіться посилання, подане нижче :)

http://learnlinuxconcepts.blogspot.in/2014/02/kernel-space-and-user-space.html


1

Намагаються дати дуже спрощене пояснення

Віртуальна пам'ять поділяється на простір ядра та простір користувача. Простір ядра - це область віртуальної пам'яті, де будуть працювати процеси ядра, а простір користувача - це область віртуальної пам’яті, де працюватимуть користувацькі процеси.

Цей розділ необхідний для захисту доступу до пам'яті.

Кожен раз, коли завантажувач запускає ядро ​​після завантаження його до місця в оперативній пам'яті, (як правило, на основі контролера ARM), він повинен переконатися, що контролер знаходиться в режимі супервізора з вимкненими FIQ та IRQ.


1

Простір ядра та простір користувачів - це логічні простори.

Більшість сучасних процесорів розроблені для роботи в різних привілейованих режимах. Машини x86 можуть працювати в 4 різних привілейованих режимах. введіть тут опис зображення

І певна інструкція на машині може бути виконана, коли в / над конкретним привілейованим режимом.

Завдяки такій конструкції ви надаєте захист системи або обробку піском для виконання.

Ядро - це фрагмент коду, який керує вашим обладнанням і забезпечує абстракцію системи. Таким чином, він повинен мати доступ до всіх інструкцій з машини. І це найбільш надійний фрагмент програмного забезпечення. Тому я повинен бути виконаний з найвищою привілеєю. І рівень дзвінка 0 - це найбільш привілейований режим. Тож рівень кільця 0 також називають режимом ядра .

Користувацькі програми - це програмне забезпечення, яке надходить від будь-якого сторонніх постачальників, і ви не можете повністю їм довіряти. Хтось із шкідливим наміром може написати код для збоїв у вашій системі, якщо він мав повний доступ до всіх інструкцій на машині. Таким чином, програма повинна мати доступ до обмеженого набору інструкцій. І рівень дзвінка 3 - найменш пільговий режим. Отже, всі ваші програми працюють у такому режимі. Отже, рівень 3 дзвінка також називають режимом користувача .

Примітка: я не отримую рівня кільця 1 і 2. Вони в основному є режимами з проміжними привілеями. Тому може бути, що код драйвера пристрою виконується з цим привілеєм. AFAIK, linux використовує тільки кільцеві рівні 0 і 3 для виконання коду ядра та додатку користувача відповідно.

Отже, будь-яка операція, що відбувається в режимі ядра, може розглядатися як простір ядра. І будь-яка операція, що відбувається в режимі користувача, може розглядатися як простір користувача.


0

Правильна відповідь: Не існує такого поняття, як простір ядра та простір користувача. Набір інструкцій процесора має спеціальні дозволи для встановлення руйнівних речей, таких як корінь таблиці таблиці сторінок, або доступу до пам'яті апаратних пристроїв тощо.

Код ядра має привілеї найвищого рівня, а код користувача - найнижчий. Це запобігає збиткові коду користувача, зміні інших програм тощо.

Як правило, код ядра зберігається під іншою картою пам'яті, ніж код користувача (так само, як користувацькі простори зберігаються в інших картах пам'яті, ніж один). Звідси походять терміни «простір ядра» та «простір користувачів». Але це не важке і швидке правило. Наприклад, оскільки x86 опосередковано вимагає, щоб його обробники переривань / пасток постійно відображалися, частина (або всі ОС) ядра повинна бути відображена в просторі користувача. Знову ж таки, це не означає, що такий код має привілеї користувача.

Чому необхідне розділення ядра / користувача? Деякі дизайнери не згодні з тим, що це, власне, і потрібно. Архітектура Microkernel заснована на ідеї, що найвищі привілейовані розділи коду повинні бути якомога меншими, при цьому всі значні операції виконуються у привілейованому користувачем коді. Вам слід вивчити, чому це може бути хорошою ідеєю, це не проста концепція (і славиться як своїми перевагами, так і недоліками).


0

Пам'ять ділиться на дві чіткі області:

  • Користувацький простір - це набір локацій, де працюють звичайні користувацькі процеси (тобто все, крім ядра). Роль ядра полягає в тому, щоб керувати програмами, що працюють у цьому просторі, не возившись між собою та машиною.
  • Простір ядра - це місце, де зберігається код ядра, і виконується під.

Процеси, що працюють в просторі користувача, мають доступ лише до обмеженої частини пам'яті, тоді як ядро ​​має доступ до всієї пам'яті. Процеси, що працюють в просторі користувача, також не мають доступу до простору ядра. Процеси користувальницького простору можуть отримати доступ лише до невеликої частини ядра через інтерфейс, що піддається ядру - система викликає. Якщо процес виконує системний виклик, ядро ​​надсилається програмне переривання, яке потім відправляє відповідний обробник переривання і продовжує його робота після закінчення обробника.


-7

У Linux є два простору: 1 - це простір користувача, а інший - простір ядра. користувальницький простір складається лише з користувацького додатку, який ви хочете запустити. оскільки служба ядра є управління процесами, управління файлами, обробка сигналів, управління пам’яттю, управління потоками і так багато служб. якщо ви запускаєте додаток з користувальницького простору, додатки взаємодіють лише з сервісом ядра. і ця служба взаємодіє з драйвером пристрою, який присутній між апаратним забезпеченням та ядром. Основна перевага простору ядра та розділення простору користувача полягає в тому, що ми можемо забезпечити захист вірусом.bcaz всіх програм користувача, що знаходяться в просторі користувача, а сервіс присутній у просторі ядра. ось чому Linux не впливає на вірус.


5
Крім того, що це "ядро", а не "ядро", ваша відповідь не зовсім правильна. Сучасні віруси (а під сучасними я маю на увазі все після Windows 98) взагалі не взаємодіють із "сервісом ядра", все робиться в просторі користувача. Той факт, що у Linux не так багато вірусів (звичайно, віруси для Linux), це те, що він має досить гарне управління дозволами і - найголовніший факт - більшість користувачів Linux - це не такі: "omaigosh JustinBieber.NewSong.exe! Я ОБОВ'ЯЗКОВО це почути NAO !!! 1111 "користувачів, які клацають та встановлюють все без жодного підказки.
alexclooze

3
Крім того, Linux використовується не так багато, як Windows - написання вірусів для цього не призведе до такої шкоди, скільки прагнуть досягти автори вірусів. Програми для користувальницького простору не спілкуються зі службою ядра, вони викликають спеціальні функції, що надаються ядром, звані syscalls.
alexclooze
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.