У меня вот такой дурацкий вопрос насчёт виртуальной адресации: пусть у нас есть 2 дескриптора сегментов-53h и 58h (оба в GDT но с разными правами). Пускай база сегмента, описываемого первым дескриптором 12345678h, а база сегмента, описываемого вторым дескриптором 12345680h. Пускай размеры сегментов равны-оба по 20 Mb. Режим страничной адресации выключен. Для лучшего представления описанная ситуация схематически изображена на рисунку внизу. ........|Сегмент #1|................... --------------------------------------- Виртуальное пространство ............|Сегмент #2|............... Тоесть сегменты как бы накладываются в виртуальном адресном пространстве. Вопрос: Такая ситуация вообще возможна? Я думаю что возможна, хотя очень хочу узнать правильный ответ. Если невозможна, объясните пожалуйста почему. Процессор не проверяет же все сегменты в таблице дескрипторов при добавлении нового сегмента, он только проверяет правильно ли мы обращаемся к какой либо ячейке памяти. Если такая ситуация возможна (тоесть, в виртуальном адресном пространстве это ДВА РАЗНЫХ СЕГМЕНТА), то в нашем примере существует область памяти (в линейном адресном пространстве), которая перекрывается обеими сегментами. Тоесть, например, у программы из сегмента #1 нету прав для того, чтобы прочитать байт в сегменте #2 со смещением 4 относительно начала сегмента #2. Но ведь линейный адрес четвертого байта сегмента #2 такой же, как линейный адрес байта со смещением 9 сегмента #1. Это вообще разные ячейки памяти? Если мы в сегменте #1 изменим значение 9-го байта, приведёт ли это к модификации значения 4-го байта сегмента #2? Я так понимаю, что если операционная система не предпринимает никаких действий связанных с предвидением и обработкой таких ситуаций (например, все сегменты кроме текущего помечать как отсутствующие в памяти и перехватывать исключение #NP, в котором переписывать запрашиваемый сегмент в память), то это будут одинаковые ячейки памяти. Я правильно понимаю? Наперёд благодарен за ответ. С уважением, _MGF_.
у тебя проблемы - перечитай еще раз что такое сегмент и что такое страница. да, такое вполне реально. линейный адрес одинаков, однако при обращении к этой ячейке с помощбю РАЗНЫХ сегментных регистров (в которых и прописаны права доступа) будет разный эффект. А ячейка памяти одна и та-же.
_mgf_ А если говорить про Win/*nix, то такая ситуация очень даже практикуется -- все сегменты (ну или почти все) -- "плоские", т.е. имеют базу 0 и лимит FFFF FFFF.
_mgf_ Сегменты могут перекрываться как угодно, в т.ч. с разными правами доступа через разные селекторы. infern0 А в чём проблема-то? У сегмента в дескрипторе тоже есть бит присутствия.
Бит присутсвия есть и в дескрипторах сегментов. Я же писал, что режим страничного преобразования выключен. То есть я смогу изменять значение байтов в сгменте №2 из сегмента №1 в перекрываемой области памяти (если не предпринятые специальные меры)?