Адреса! Запутался!

Тема в разделе "WASM.BEGINNERS", создана пользователем Luzer, 6 янв 2008.

  1. Mika0x65

    Mika0x65 New Member

    Публикаций:
    0
    Регистрация:
    30 июл 2005
    Сообщения:
    1.384
    SII

    Механизм сегментации на входе получает эффективный адрес в виде смещения в сегменте. Эффективный скалдывается с базовым, получается линейный (виртуальный). Линейный отображается в физический.
     
  2. rei3er

    rei3er maxim

    Публикаций:
    0
    Регистрация:
    15 янв 2007
    Сообщения:
    917
    Адрес:
    minsk
    Mika0x65
    угу
    а в плоской модели памяти логический (эффективный) адрес совпадает еще и с линейным
     
  3. SII

    SII Воин против дзена

    Публикаций:
    0
    Регистрация:
    31 окт 2007
    Сообщения:
    1.483
    Адрес:
    Подмосковье
    Mika0x65
    А также селектор сегмента, без коего выполнить преобразование невозможно.

    rei3er
    В плоской модели памяти, принятой в Windows, Linux и др., эффективный адрес, т.е. смещение в сегменте, действительно совпадает с линейным. Логический адрес с линейным не совпадает в любом случае, поскольку первый всегда включает и селектор сегмента, а не только смещение (кстати говоря, не единственного сегмента -- Вам, полагаю, известно, что из-за особенностей механизма сегментации IA-32 необходимо использовать два сегмента минимум -- один для кода, а другой для данных), а второй состоит лишь из одного компонента. Однако модель памяти, не использующая сегментацию, является плоской независимо от того, имеется ли данное совпадение или нет. Модель указанных ОС -- лишь частный случай. Плоской является модель памяти, принятая для COM-файлов MS DOS; плоской будет являться и любая другая модель, где задача никак не манипулирует с сегментными регистрами, даже если смещения не будут совпадать с линейными адресами.
     
  4. Luzer

    Luzer New Member

    Публикаций:
    0
    Регистрация:
    17 июл 2005
    Сообщения:
    95
    DOS будет работать в защищенном режиме?
     
  5. Mika0x65

    Mika0x65 New Member

    Публикаций:
    0
    Регистрация:
    30 июл 2005
    Сообщения:
    1.384
    Нет, DOS работает в реальном режиме.

    Можно, находясь в DOS'е включить защищенный режим, сделать что надо, и переключиться обратно.
     
  6. SII

    SII Воин против дзена

    Публикаций:
    0
    Регистрация:
    31 окт 2007
    Сообщения:
    1.483
    Адрес:
    Подмосковье
    Mika0x65
    Luzer
    Причём переключаться туда и обратно аккуратно, чтобы не похерить области памяти DOS и BIOS, не изменить соответствующие настройки оборудования и т.д.
     
  7. Luzer

    Luzer New Member

    Публикаций:
    0
    Регистрация:
    17 июл 2005
    Сообщения:
    95
    можно железо попортить чтоли?
     
  8. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    Luzer
    Можно настройки попортить и дос не будет работать в новоиспеченном реальном режиме до следующего ребута.
     
  9. Luzer

    Luzer New Member

    Публикаций:
    0
    Регистрация:
    17 июл 2005
    Сообщения:
    95
    Страничная адресация - альтернативный тип управления памятью, полезный для виртуальной памяти многозадачных ОС.
    В отличие от сегментации, которая разделяет программы и данные на сегменты произвольной длины, страничная адресация делит
    программы на множество страниц одинакового размера. Страницы не имеют прямой связи с логической структурой программ. В то время, как сегментные селекторы могут рассматриваться как логические "имена" программных модулей и структур данных, страница указывает только часть модуля или структуры данных. Преимуществом страничной организации является возможность хранения в основной памяти только небольшого количества страниц, требуемых для каждой активизируемой задачи. 80386 использует два уровня таблиц, преобразующих исполнительный адрес (с выхода блока сегментации) в физический адрес. В 80386 используются три компонента страничного механизма: страничная директория; таблицы страниц; собственно страница (страничный кадр).
    процессор может рассматривать память как один или несколько сегментов, причём размер сегмента может достигать 4 гигабайт (4*2*30 байт). С другой стороны, страничная адресация позволяет организовать защиту памяти для каждой страницы. Размер страницы составляет 4 килобайта. Использование страниц значительно облегчает реализацию виртуальной памяти.
    Единый размер страницы упрощает управление памятью и устраняет явление фрагментации. Страничная директория размером 4 Кбайта позволяет иметь 1024 входа в директорию страниц. Каждый вход страничной директории содержит адрес таблиц следующего уровня, таблицы страниц и информацию о таблице страниц.

    информация с сайта http://sborki.ru

    Вот не понятно мне, например, что значит полезный для виртуальной памяти? и вообще, все ли здесь корректно и правильно написано? а то в разных источниках все разное... ужас
     
  10. rei3er

    rei3er maxim

    Публикаций:
    0
    Регистрация:
    15 янв 2007
    Сообщения:
    917
    Адрес:
    minsk
    Luzer
    читай лучше официальную документацию
     
  11. Freeman

    Freeman New Member

    Публикаций:
    0
    Регистрация:
    10 фев 2005
    Сообщения:
    1.385
    Адрес:
    Ukraine
    no
    имеецо ввиду исходный код как в ворде разбивает? :)
    ничо страница не указывает
    это равно 240байт... разве 4гб=240байт? лол
    не всегда
    читайте маны от интела
     
  12. Luzer

    Luzer New Member

    Публикаций:
    0
    Регистрация:
    17 июл 2005
    Сообщения:
    95
    согласен, что читать нада официальную документацию, но увы) язык я знаю только один и то неважно...
    Freeman спасибо за разборку
     
  13. SII

    SII Воин против дзена

    Публикаций:
    0
    Регистрация:
    31 окт 2007
    Сообщения:
    1.483
    Адрес:
    Подмосковье
    Luzer

    Наши горе-переводчики, не знающие ни русского, ни английского, directory постоянно переводят как директорию, хотя вообще-то это каталог (последний термин устоялся ещё в 1970-х годах -- тогда переводили, как правило, лучше, хотя и тогда бывали ляпы). Спроси, например, историка, даже знакомого с компутерами, что такое директория, и он, вероятно, сразу скажет про правительство Франции после свержения монархии, но до воцарения Наполеона. А вот каталог или, на худой конец, папка (folder) куда понятнее незнакомому с компутерным сленгом. Но это так, лирика...

    А читать в любом случае надо официальные руководства: технический английский в одну сторону (перевод на русский) учится легко и быстро. Что же касается приведённого выше текста, то вникать лень, но кажется, что в общем правильно, но неполно. В частности, как сказал Freeman, размер страницы не обязательно (хотя обычно) составляет 4 Кб.

    Но суть-то работы страничного механизма поняли, или попытаться объяснить своими словами без излишнего углубления в детали?
     
  14. Luzer

    Luzer New Member

    Публикаций:
    0
    Регистрация:
    17 июл 2005
    Сообщения:
    95
    не очень понял... Непонятно, страничная адресация используется только вместе с сегментацией, а виртуальная память зачем? и всегда ли она используется в страничной адресации?
    Если не затруднит, с удовольствием прочту)
     
  15. Luzer

    Luzer New Member

    Публикаций:
    0
    Регистрация:
    17 июл 2005
    Сообщения:
    95
    читаю сейчас про таблицу дескрипторов. Как я понял, Локальная таблица дескрипторов она создается для каждой программы Операционной системой. Она является сегментом и поэтому имеет свой дескриптор в глобальной таблице дескрипторов. Вот не совсем понятно, почему она является сегментом. Это связано с сегментной адресацией?
     
  16. Luzer

    Luzer New Member

    Публикаций:
    0
    Регистрация:
    17 июл 2005
    Сообщения:
    95
    теперь про прерывания) только в реальном режиме используется таблица векторов прерываний или в защищенном тоже?
     
  17. rei3er

    rei3er maxim

    Публикаций:
    0
    Регистрация:
    15 янв 2007
    Сообщения:
    917
    Адрес:
    minsk
    это не сегмент, а таблица дескрипторов
    описывается специальным системным дескриптором, который как раз и располагается в глобальной таблице дескрипторов
    он кэшируется в регистре LDTR
    в защищенном используется таблица дескрипторов прерываний (IDT)
    базовый линейный адрес хранится в регистре IDTR
     
  18. Freeman

    Freeman New Member

    Публикаций:
    0
    Регистрация:
    10 фев 2005
    Сообщения:
    1.385
    Адрес:
    Ukraine
    ну и лимит, для полноты картины ;)
     
  19. SII

    SII Воин против дзена

    Публикаций:
    0
    Регистрация:
    31 окт 2007
    Сообщения:
    1.483
    Адрес:
    Подмосковье
    Luzer
    В голове наблюдается некоторая каша ;) Виртуальная память -- это фишка, реализуемая операционной системой, опирающейся на соответствующую аппаратуру; сам процессор организовать её не в состоянии. А вот сегментация и страничная организация -- аппаратные фичи именно процессора, которые может использовать (или не использовать) ось.

    В IA-32 включить страничный механизм без перехода в защищённый режим невозможно, однако в защищённом он может быть как включен, так и выключен (в последнем случае физические адреса всегда будут равны линейным, получаемым на выходе механизма сегментации). Сегментацию включить или отключить невозможно, однако можно так описать сегменты, что её как бы не будет: для этого во всех сегментах устанавливается базовый адрес 0 и предел 4 Гб. Именно так поступают Windows и Linux; эта модель памяти называется плоской (хотя, как я говорил выше, это не единственный вариант организации плоской модели, просто наиболее простой, понятный, да и во многих случаях разумный).

    Сегментный механизм для обычных сегментов кода и данных работает достаточно просто. При обращении к информации в сегменте (для чего используется виртуальный адрес -- селектор сегмента в одном из сегментных регистров и смещение, тем или иным способом указываемое в команде) процессор проверяет, разрешён ли доступ к сегменту (в подробности вдаваться не буду), и если проверка успешна, прибавляет смещение к базовому адресу сегмента, хранящемуся в его дескрипторе. Полученная сумма -- это линейный адрес ячейки памяти, к которой пытается обратиться программа.

    Далее в игру вступает механизм сегментации (описываю опять-таки упрощённо). Он рассматривает линейный адрес как состоящий из нескольких полей (от двух до четырёх). В обычно разбираемом режиме с 32-разрядным физическим адресом и страницами размером 4 Кб таких полей будет три: номер таблицы страниц (биты 31-22), номер страницы (биты 21-12) и смещение на странице (биты 11-0, коих как раз и хватает для адресации байта в странице размером 4 Кб). Процессор берёт базовый адрес каталога страниц в управляющем регистре CR3 (он же PDBR). Каталог содержит 1024 элемента, каждый из которых содержит базовый адрес одной таблицы страниц. Какой именно из элементов используется, процессор определяет по номеру таблицы из линейного адреса (биты 31-22). Таблица страниц также состоит из 1024 элементов, каждый из которых содержит базовый адрес страницы. Какой элемент выбирается, определяется по номеру страницы (биты 21-12 линейного адреса). После этого, получив базовый адрес страницы, процессор добавляет к нему в неизменном виде смещение на странице (биты 11-0 линейного адреса) -- и у нас готовый физический адрес, по которому будет производиться обращение к памяти. Единственное "но": записи и каталога страниц, и таблицы страниц содержат дополнительные биты, которые показывают, загружена ли в память соответствующая таблица страниц или страница. Если загружена и доступна -- всё хорошо, с ней можно работать, если же нет -- происходит прерывание. Этот механизм и лежит в основе организации виртуальной памяти: когда происходит означенное прерывание, ОС загружает с диска нужную страницу, вытесняя на диск какую-нибудь из давно не использованных, и повторяет выполнение команды, вызвавшей прерывание.
     
  20. SII

    SII Воин против дзена

    Публикаций:
    0
    Регистрация:
    31 окт 2007
    Сообщения:
    1.483
    Адрес:
    Подмосковье
    Luzer
    В определённом смысле LDT является сегментом: во-первых, она занимает какую-то область памяти, а во-вторых, описывается дескриптором сегмента. Только описывается она не обычным дескриптором кода или данных, а специальным системным дескриптором (точно так же системными дескрипторами описываются TSS и шлюзы вызова задач, процедур, ловушек и прерываний). Чтобы изменять информацию в самой LDT, система должна обращаться к занимаемой ей области памяти как к обычному сегменту данных, а не как к LDT, а вот чтобы дать возможность задаче использовать определённые в LDT сегменты, она должна описать эту LDT с помощью соответствующего системного дескриптора и правильным образом загрузить регистр LDTR. В общем, ничего сложного в этом нет, но довольно геморройно для изучения, да и для программирования. Это, пожалуй, одна из причин, почему реально возможности сегментации IA-32 используются осями по минимуму, а в 64-разрядном режиме были вообще фактически упразднены.

    И там, и там, только в реальном режиме она попроще: содержит лишь адреса обработчиков прерываний (их 16-разрядные сегменты и смещения), а в защищённом она представляет собой таблицу дескрипторов прерываний (IDT), адрес и размер которой загружаются предварительно в регистр IDTR, а сама таблица содержит до 256 8-байтовых дескрипторов, каждый из которых является шлюзом задачи, прерывания или ловушки. Опять-таки налицо аппаратная реализация поговорки "хотели как лучше, а получилось как всегда": на бумаге механизм выглядит неплохо, а на практике оказывается слишком громоздким и неудобным, и его возможности используются опять-таки весьма ограниченно.