Як ОС виявляє порушення доступу до пам'яті


12

Як операційна система (бажано Linux) знає, що ви отримали доступ до місця пам'яті, до якого вам заборонено?

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

Я добре знаю карти пам’яті в Linux, але мені здається трохи смішним, що ядро ​​перевіряє, чи місцезнаходження, до якого ви намагаєтесь отримати, знаходиться у дійсному діапазоні КОЖНЕ ЧАС, коли ви робите доступ. Це здається, що це витратить стільки часу, який можна витратити, роблячи щось більш продуктивне (але, можливо, менш безпечне, без перевірки!). Чи, можливо, він запам'ятовує всі недавні доступу та перевіряє їх на кожній галочці апаратного таймера? (Але це звучить небезпечно, і знову ж таки повільно.)

Мене здивувало, що це питання, як видається, не відповідає ніде. Мені це завжди було цікаво. Змушує мене думати, що є розділ апаратного забезпечення, який зробить це від імені ОС, на приємному, зручному рівні абстракції. Але все ж, можливо, буде потрібно завантажувати наступні карти пам'яті процесів на кожен контекстний комутатор, який знову звучить повільно.

Так, так, у будь-якому випадку, я продовжую трохи: як ОС виявляє порушення пам'яті?

Спасибі

Відповіді:


11

(Наступна відповідь передбачає "сучасний" робочий стіл, сервер або вбудовану платформу верхнього класу (наприклад, смартфони та все більше і менше дрібних систем). Для систем x86, сучасні засоби 386 і вище. Наступна відповідь передбачає також: "Сучасна" ОС, наприклад, майже будь-яка unix або Windows з 95 років.)

Це не відбувається в ОС, це відбувається в процесорі, зокрема в MMU ( блок управління пам'яттю ) . MMU підтримує віртуальну адресацію, при цьому біти, що складають вказівник, не вказують безпосередньо фізичне розташування бітів у пам'яті.

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

Якщо TLB не містить запису для цього конкретного номера віртуальної сторінки, MMU повідомляє процесор, що стався недійсний доступ; це зазвичай називається винятком.

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

  • ОС відповідає за переключення завдань. Коли ви це зробите, як ви підозрювали, він зберігає поточний TLB і замінює його збереженим TLB для наступного запланованого завдання. Таким чином, кожен процес має TLB, тому адреса 0x123456в процесі X може не вказувати на те саме фактичне місце в оперативній пам'яті, що та сама адреса в процесі Y, або може бути просто недійсною. Якщо процес намагається знеструмити вказівник за межами свого адресного простору, він не потрапить у простір іншого процесу, скоріше він не потрапить нікуди .

  • ОС вирішує, що станеться, коли підвищується виняток. Він може припинити процес здійснення недійсного доступу до пам'яті (помилка сегментації, помилка загального захисту, ...). Це також спосіб, яким реалізується заміна: обробник винятків може вирішити витягнути деякі дані з місця обміну, відповідно оновити TLB і знову здійснити доступ.

Зауважте, що MMU забезпечує безпеку, оскільки процес не може змінити свій TLB. Тільки ядро ​​ОС може змінювати TLB. Як працюють дозволи на зміни TLB, виходить за рамки цієї відповіді.


6

1) Seffaults виявляється блоком управління пам'яттю. Коли ви запитуєте про пам'ять, ОС просить блок управління пам’яттю отримати частину обладнання. Повинно бути щось, що відслідковує всі великі блоки пам'яті, які дає вам ОС. ОС, що передає MMU. Оскільки він знає всю пам’ять, яку він вам подарував, він також може повідомити вам, коли ви намагаєтеся отримати доступ до місця пам'яті, яке ви не отримали за допомогою асигнувань, в ОС спеціально для цього є подія, пам’ять у вас немає. Врешті-решт ОС вбиває вашу програму, запускаючи або segfault, або еквівалент на інших ОС.

Не всі ОС мають цей захист. MacOS до 9 не мав нічого з цього, навіть якщо MMU підтримував це. Не виграв 3.1. Win95 мав певний захист, оскільки він переходив між відсутністю захисту, а потім додаванням.

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

Отже, так, ви можете накрутити свої дані. Якщо у вас є бродячий покажчик, який перезаписує ваш власний додаток, ви НАДЕЖДА, що ви потрапили у свій стек, оскільки це, ймовірно, матиме ще одне порушення при спробі повернути стек, але якщо ви потрапите на власні дані, ви ніколи не дізнаєтесь.

Ви можете спробувати бути більш суворими, ніж "відсутність захисту". Є інструмент під назвою "Електрична огорожа" ( http://perens.com/FreeSoftware/ElectricFence/ ), який змусить ваш MMU працювати трохи більше, і змусить його виявити більше недоліки.


Гаразд, чи можете ви бути більш конкретними щодо того, як це працює? Мовляв, як відомо, що певний процес не може отримати доступ до певного місця? Що говорить про те, які процеси можуть отримати доступ куди? Як його розрізняти? Спасибі
Додді

1
@panic - знайдіть Memory_management_unit у wikipedia та посилання на цій сторінці. Зауважте, що стан процесу включає статус MMU. Ви можете витратити семестри на дизайн, функції та інтеграцію MMU.
mpez0
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.