Як ядро ​​заважає шкідливій програмі зчитувати всю фізичну оперативну пам’ять?


10

Якщо я напишу програму, яка намагається прочитати пам'ять за кожною можливою адресою, і я запускаю її на "повній" Unix, вона не зможе отримати доступ до всієї фізичної ОЗУ. Але як операційна система заважає це робити?

Мені більше знайомі невеликі архітектури процесора, де будь-який фрагмент коду складання може отримати доступ до всього. Я не розумію, як програма (ядро) може виявляти такі шкідливі операції.


2
Зазвичай MMU дбає про те, щоб ви не мали доступу до пам'яті за межами дозволених ділянок.
ott--

1
Ну, MMU налаштовується складанням. Таким чином, код складання може змінити конфігурацію MMU та отримати доступ до іншої сторінки пам'яті, правда?
nowox

Це справедливо лише в тому випадку, якщо ви запускаєте код як root.
ott--

2
Ви повинні прочитати про таблиці сторінок і абстракцію ядра там.
Clarus

@ott: навіть root не може змінити MMU (принаймні, не в Linux). Тільки ядро ​​робить.
Базиль Старинкевич,

Відповіді:


12

Це не ядро, яке запобігає поганому доступу до пам'яті, це процесор. Роль ядра полягає лише в правильному налаштуванні процесора.

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

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

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


Чи можете ви трохи вказати твердження "адреса розшифровується процесором на основі вмісту MMU" ? Чи є в запущеній програмі фактичний код, який розшифровує адреси? Або коли ЦП робить доступ до адреси - це доступ до MMU, який належним чином переводить / обробляє його (робить доступ до пам'яті чи кешу і повертає результат, або запускає процедуру ядра)? Отже, з точки зору мікроконтролера / складання, MMU є новою частиною. Процесор не підключений безпосередньо до пам'яті, він підключений до MMU і саме там відбувається абстракція віртуальної пам'яті.
xealits

3
@xealits Переклад з віртуальної адреси на фізичну адресу здійснюється всередині MMU, що є апаратною схемою. Немає коду для цього в програмі чи в ядрі. Ядро викликається лише у виняткових випадках, коли програма намагається отримати доступ до віртуальної адреси, для запису MMU йдеться про "недійсну адресу". Ядро також виконує завдання налаштування регістрів і таблиць в ОЗУ, які використовує MMU.
Жил "ТАК - перестань бути злим"
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.