Какая реальная польза от логических адресов? - PullRequest
0 голосов
/ 07 мая 2020

Вот что я понял о логических адресах:

Логические адреса используются для того, чтобы данные в физической памяти не были повреждены. Благодаря использованию логических адресов процессы не смогут напрямую обращаться к физической памяти, тем самым гарантируя, что они не могут хранить данные в уже используемых ячейках физической памяти и, следовательно, защищая целостность данных. Сомневаюсь, действительно ли было необходимо использовать логические адреса. Целостность данных в физической памяти можно было сохранить с помощью алгоритма или такого, который не позволяет процессам получать доступ или изменять участки памяти, к которым уже обращались другие процессы.

Ответы [ 3 ]

0 голосов
/ 07 мая 2020

Есть некоторые вещи, которые вам необходимо понять.

Прежде всего, ЦП не может напрямую обращаться к физической памяти. Для вычисления физического адреса ЦП необходим логический адрес. Затем используется логический адрес для вычисления физического адреса. Итак, это основная c потребность в логических адресах для доступа к физической памяти. Без логического адреса вы не сможете получить к нему доступ. Это преобразование необходимо. Предположим, что если существует система, которая не отслеживает виртуальные / логические адреса, эта система станет очень уязвимой для хакеров или злоумышленников, поскольку они смогут напрямую обращаться к физической памяти и манипулировать полезными данными в любом месте.

Второе, когда процесс запускается, CPU генерирует логический адрес, чтобы загрузить этот процесс в основную память. Теперь цель этого логического адреса - управление памятью. Размер регистров намного меньше реального размера процесса. Поэтому нам нужно переместить память, чтобы получить оптимальную эффективность. Здесь в игру вступает MMU (блок управления памятью). Физическая память рассчитывается MMU с использованием логического адреса. Таким образом, логические адреса генерируются процессами, и MMU обращается к физическому адресу на основе этого логического адреса.

Этот пример проясняет это.

Если данные хранятся по адресу 50, базовый регистр содержит значение 50, а смещение равно 0. Теперь MMU сдвигает его на адрес 100, это также отразится на логическом адресе. Смещение становится 100-50 = 50. Итак, теперь, если данные необходимо получить через логический адрес, они перейдут на базовый адрес 50, а затем увидят смещение, т.е. 50, перейдут на адрес 100 и получат доступ к данным. Логический адрес хранит запись данных, куда он был перемещен. Независимо от того, сколько ячеек адресов меняются, они будут отражены в логическом адресе, и, следовательно, этот логический адрес обеспечивает доступ к этим данным, независимо от того, какой физический адрес они содержат сейчас.

Надеюсь, это поможет.

0 голосов
/ 08 мая 2020

«Целостность данных в физической памяти можно было сохранить с помощью алгоритма или подобного, не позволяющего процессам получать доступ или изменять участки памяти, к которым уже обращались другие процессы».

Короткий ответ: невозможно разработать эффективный алгоритм, как предлагается, чтобы соответствовать тому же уровню производительности с логическим адресом.

Проблема с этим алгоритмом заключается в том, как вы собираетесь перехватывать каждый процесс доступ к памяти? Без перехвата доступа к памяти невозможно проверить, имеет ли процесс права доступа к определенной области памяти. Если мы действительно собираемся реализовать эти алгоритмы, есть способы перехватить доступ к памяти без использования логического адреса, предоставляемого MMU (блок управления памятью) на современных процессорах (предположим, у вас есть процессор без MMU). Однако эти методы не будут такими эффективными, как использование MMU. Если в вашем процессоре есть MMU, хотя трансляция логического адреса будет неизбежной, вы можете настроить физическую память один к одному.

Один из способов перехватить доступ к памяти без MMU - это вставить команду прерывания ядра перед каждой инструкцией доступа к памяти в программе. Поскольку мы не можем доверять программе пользовательского уровня, такую ​​работу нельзя делегировать компилятору. Таким образом, вы можете написать ОС, которая будет выполнять эту работу до того, как загрузит программу в память. Эта ОС будет сканировать двоичный файл вашей программы и вставлять команду прерывания ядра перед каждым обращением к памяти. Таким образом, ядро ​​может проверить, следует ли предоставить доступ к памяти. Однако такой подход значительно снижает производительность вашей системы, поскольку каждый доступ к памяти, законный или нет, будет попадать в ядро. А захват в ядро ​​включает переключение контекста, которое занимает много циклов процессора.

Можем ли мы сделать лучше? Как насчет статического c анализа доступа наших программ к памяти перед загрузкой их в память, чтобы мы вставляли ловушку только перед незаконным доступом к памяти? Однако у процессов нет предопределенного порядка выполнения. Допустим, у вас есть программы A и B. Они обе пытаются получить доступ к одной и той же области памяти. Тогда кто должен получить это с помощью нашего статического c анализа? Мы могли случайным образом назначить одного из них. Скажем, мы назначаем B. Тогда как мы узнаем, когда B будет сделано с этой памятью, чтобы мы могли передать A, чтобы он мог продолжить? Допустим, B использует этот регион для хранения глобальной переменной, к которой обращались несколько раз на протяжении ее жизненного цикла. Дождемся ли мы завершения B, чтобы передать эту область A? Что, если B никогда не закончится?

Более того, статический c анализ доступа к памяти был бы невозможен при наличии динамического c распределения памяти. Если программа A или B пытается выделить область памяти, размер которой зависит от ввода пользователя, тогда ОС или наш инструмент анализа stati c не может заранее знать, где и насколько велика область. И поэтому мы вообще не сможем провести анализ.

Таким образом, мы должны возвращаться к ловушке при каждом доступе к памяти и определять, является ли доступ законным во время выполнения. Звучит знакомо? Это функция MMU или логического адреса. Однако с логическим адресом ловушка возникает тогда и только тогда, когда вместо каждого доступа к памяти произошел незаконный доступ.

0 голосов
/ 07 мая 2020

Это моделируется ОС для программ, как если бы они использовали физическую память. Дополнительный уровень (логический адрес) необходим для обеспечения целостности данных. Вы можете провести аналогию с логическими адресами как с языком ОС для адресов, потому что без этого Mapping ОС не смогла бы понять, какие «фактические» адреса разрешены любой программе. Чтобы устранить эту двусмысленность, требуется отображение логических адресов, чтобы ОС знала, какой логический адрес соответствует какой физической адресации и разрешено ли расположение этого физического адреса для этой программы. Он выполняет «проверки целостности» логических адресов, а не физической памяти, потому что вы можете проверить целостность, изменив логический адрес и выполняя манипуляции, но вы не можете сделать то же самое с физической памятью, потому что это повлияет на уже запущенные процессы, использующие память. .

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

...