Объяснение

Объяснение

Объяснение

Существует два вида адресного пространства: виртуальное и физическое. На физической модели(обычно используется ядром)память ограничена и каждый адрес соответствует физическому.

Виртуальный используется процессами. Ограничений нет.(кроме одного из-за размера указателя). Чтобы получить больше памяти, программа просто запросит ее.(не учитывая, какую сумму можно запросить). Каждый адрес сопоставлен с различными физическими адресами.
Вот как процессы ограничены в том, что они могут читать из оперативной памяти.

Проблема

Причина в том, что системные вызовы используют ring0, но в то же время(по крайней мере на Linux)состояние процесса обновлено до прерываемого, что предполагает, что системные вызовы используют виртуальное адресное пространство.
Насколько я понимаю, кольца ЦП касаются привилегированных инструкций, а не адресного пространства(так как это связано с MMU).

Так что если чтение выходит за рамки(из-за уязвимости)происходит во время выполнения системного вызова в коде ядра. Может ли он вернуть память из других процессов?

решение1

Код режима ядра может делать практически все, что захочет, включая отслеживание адресных пространств различных процессов.

Да, код режима ядра использует виртуальное адресное пространство. Ядроуправляетфизическое адресное пространство, но это не таквбежатьфизическое адресное пространство.

Пользовательский режим не может ничего прочитать из оперативной памяти, поскольку у него нет возможности устанавливать физические адреса.

Поскольку режим ядра работает с включенной трансляцией адресов, код режима ядра также может утверждать только виртуальные адреса. Но код k-режима может устанавливать записи таблицы страниц для определения виртуальных адресов, которые транслируются в любые физические адреса, к которым он может обратиться.

решение2

Системные вызовы, вызываемые ядром, используют физическое адресное пространство.
Системные вызовы, вызываемые процессами, используют виртуальное адресное пространство.

Связанный контент