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

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

  1. Luzer

    Luzer New Member

    Публикаций:
    0
    Регистрация:
    17 июл 2005
    Сообщения:
    95
    Вот читаю я, читаю... и много всяких адресов встречается, но где-то они выделяются отдельно, где-то их называют другими значениями. Например, исполнительны адрес и логический адрес - одно и то же... вообщем я запутался, разъясните плиз попростяцки, что такое
    логический адрес
    физический адрес
    абсолютный адрес
    исполнительный адрес
    локальный адрес
    базовый адрес
    Что-то мне подсказывает, что половино из этого всего одно и то же... Разъясните пожалуста)
    З.Ы: Тут вроде как ветка программинга, но не знал куда запостить, так что если чего, перенесите куда нада)
     
  2. MSoft

    MSoft New Member

    Публикаций:
    0
    Регистрация:
    16 дек 2006
    Сообщения:
    2.854
    физический - адрес в файле на диске
    абсолютный - адрес в файле в памяти
    базовый - видимо адрес, с которого грузится файл в памяти
    про остальное не слышал
     
  3. Xerx

    Xerx Алексей

    Публикаций:
    0
    Регистрация:
    17 фев 2005
    Сообщения:
    528
    Адрес:
    Russia
    логический адрес - в адресном пространстве процесса
    исполнительный адрес - адрес следующей команды на выполнение
    локальный адрес - IP-адрес компа?
    вроде так...
     
  4. SII

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

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

    Если же речь идёт о памяти, то картина будет такая (хотя некоторые авторы обходятся с терминами несколько по-иному):

    -- логический адрес, обычно называемый также виртуальным -- это адрес ячейки памяти с точки зрения программиста-прикладника. Для процессоров архитектуры IA-32 (она же x86) виртуальный адрес состоит из селектора сегмента (значения, находящегося в сегментном регистре) и смещения (по-буржуйски offset), тем или иным способом указываемого в команде. В плоской (flat) модели памяти, используемой, например, в Windows и Linux, виртуальный адрес по-прежнему состоит из этих двух частей, однако программист никогда сам не меняет содержимое сегментных регистров, поэтому с его точки зрения виртуальный адрес совпадает со смещением (собственно, поэтому модель и называется плоской, т.е. состоящей из единственного сегмента);

    -- линейный адрес вычисляется процессором из логического (виртуального) при работе механизма сегментации. Способ вычисления зависит от того, в каком режиме работает процессор. Например, в реальном режиме линейный адрес = сегмент*16 + смещение; в защищённом режиме по селектору сегмента, находящемуся в сегментном регистре, из памяти извлекается дескриптор сегмента, из дескриптора -- базовый адрес сегмента в памяти (т.е. адрес первого байта этого сегмента), и к этому базовому адресу прибавляется смещение, что в итоге даст линейный адрес;

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

    Базовый адрес -- это начальный адрес чего-то. Например, если речь идёт о преобразовании из виртуального адреса в линейный в защищённом режиме, под базовым адресом будет пониматься линейный адрес, с которого сегмент начинается в памяти. Однако с этим базовым адресом простой смертный программист дела не имеет -- им занимается ОС.

    Куда чаще приходится сталкиваться с другим базовым адресом, применяемым для определения адресов операндов в командах ассемблера. Например, команда

    Код (Text):
    1. MOV  AX, 10 [BX]
    загрузит в регистр AX слово из ячейки памяти, смещение которой вычисляется как сумма базового адреса, содержащегося в регистре BX, и отклонения (displacement) 10, прямо заданного в команде.

    Таким образом, и в этом случае базовый адрес -- это "точка отсчёта", с которой начинается некая область памяти.

    Исполнительный адрес -- возможно, имеется в виду как раз смещение, вычисленное из всех его компонентов (в приведённом выше примере таких компонентов было два -- базовый адрес и смещение, но их может быть больше). Если так, то правильнее (с точки зрения терминологии Intel) называть это смещение эффективным адресом (команда "загрузить эффективный адрес" -- LEA -- как раз и предназначена для того, чтобы вычислить смещение указанного в ней операнда и загрузить его в регистр).

    Локальный адрес -- первый раз слышу :)
     
  5. rei3er

    rei3er maxim

    Публикаций:
    0
    Регистрация:
    15 янв 2007
    Сообщения:
    917
    Адрес:
    minsk
    поправка
    дескриптор извлекается из сегментного регистра
    селектор не участвует в формировании логического адреса
    он только лишь идентифицирует дескриптор
    логический адрес совпадает с линейным, потому что в плоской модели база = 0, лимит = 4Gb
    а не потому что программист не меняет содержимое
    я бы сказал, что физический адрес - это способ уникальной идентификации компонентов системы (не обязательно соответствует какому-то байту в ОЗУ)
    для того же контроллера памяти физический адрес представляет собой ту же сущность, что и линейный адрес для MMU
     
  6. Freeman

    Freeman New Member

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

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

    Публикаций:
    0
    Регистрация:
    31 окт 2007
    Сообщения:
    1.483
    Адрес:
    Подмосковье
    rei3er
    Неверно. Дескрипторы сегментов хранятся в памяти, а именно в таблицах дескрипторов, а в сегментных регистрах хранятся селекторы сегментов (фактически -- номера дескрипторов и таблицах).

    То, что текущие дескрипторы (селекторы которых загружены в сегментные регистры) кэшированы процессором в специальных теневых регистрах (а не просто сегментных), программист может и не знать: всё равно никакого доступа к этой информации у него нет и на логике работы программы это не сказывается. Исключением является лишь тот факт, что перепись содержимого дескриптора в памяти не приведёт к автоматическому изменению кэшированной копии, но прикладной программист и не может такое сделать; это нужно учитывать лишь разработчикам осей.

    Чушь. Логический адрес -- это и сегмент (селектор), и смещение, а не одно голое смещение. Или, по-Вашему, 0008h:1000h и 1008h:1000h -- это один и тот же логический адрес?

    Кстати, почитали б лучше документацию от Интел (вроде бы я когда-то это уже советовал). Например, на первой же странице главы 3 третьей части, в последнем абзаце этой страницы, прямо написано:

    Надеюсь, Вам объяснять, что такое дальний указатель, не требуется?

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

    Кстати, плоская модель памяти вовсе не предполагает загрузку базового адреса 0 и размера 4 Гб -- эти значения грузятся в современных системах, но не являются догмой. Ось вполне может ограничивать задачу более скромным объёмом памяти, а соответственно, выставлять и другой базовый адрес. Отличие плоской модели от сегментированной заключается как раз в отсутствии множества сегментов со своими селекторами, а значит, и нужды время от времени загружать селекторы в сегментные регистры; базовый адрес и размер сегмента при этом роли не играют.

    Речь шла об адресах именно памяти; про регистры внешних устройств, в т.ч. отображаемых на адресное пространство памяти, я не говорил: человеку это пока вроде как не нужно.
     
  8. lotos_od

    lotos_od New Member

    Публикаций:
    0
    Регистрация:
    10 фев 2005
    Сообщения:
    29
    Адрес:
    Ukraine
    В споре рождается истина :).

    Раз уж пошла такая пьянка, можно ли пару слов об отображении внешних устройств? К примеру, на линейное или физическое адресное пространство они отображаются?
     
  9. Luzer

    Luzer New Member

    Публикаций:
    0
    Регистрация:
    17 июл 2005
    Сообщения:
    95
    пипец, я сейчас сдохну=) К сожалению кроме как "спасибо SII" ничего другого сказать не могу)
    Но снова своим незнанием поднял дискуссию) буду наблюдать)
     
  10. Luzer

    Luzer New Member

    Публикаций:
    0
    Регистрация:
    17 июл 2005
    Сообщения:
    95
    удалил:)
     
  11. SII

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

    Публикаций:
    0
    Регистрация:
    31 окт 2007
    Сообщения:
    1.483
    Адрес:
    Подмосковье
    ehippo
    Устройства шины PCI (как и её в определённом смысле аналогов -- AGP и PCI Express) обязаны уметь отображать свои регистры хоть на адресное пространство ввода-вывода, хоть на адресное пространство памяти -- таково требование спецификации PCI. Куда именно они будут отображаться, определяет ПО, производящее их настройку (BIOS и/или ОС). Естественно, что при отображении на адресное пространство памяти производится отображение в физические адреса -- о других адресах шина просто-напросто не имеет ни малейшего понятия (виртуальные и линейные адреса существуют в глубинах процессора, с внешим миром он общается посредством физических адресов).
     
  12. Luzer

    Luzer New Member

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

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

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

    Да.
     
  14. rei3er

    rei3er maxim

    Публикаций:
    0
    Регистрация:
    15 янв 2007
    Сообщения:
    917
    Адрес:
    minsk
    именно в сегментных (10-ти байтных) регистрах
    раздел 3.4.3, часть 3A трехтомника
    я говорил в контексте защищенного режима, потому как ты упомянул про виртуальный адрес
    так вот, в формировании виртуального адреса, селектор никак не участвует
    что касается реального режима, то здесь селектор содержит модифицированную сегментную составляющую адреса
    и не более того, реальный сегментный адрес берется из скрытой части сегментного регистра
    (поле базы дескриптора, который хранится там)
    в том числе и это
    смотри
    3.2.1, 3A
    одно без другого невозможно
    ограничение размера сегмента так или иначе приведет к необходимости модификации соответствующего ему сегментного регистра
     
  15. redsh

    redsh New Member

    Публикаций:
    0
    Регистрация:
    19 июл 2007
    Сообщения:
    20
    2Luzer чтобы не путаться в терменологии, желательно читать оригинальную документацию, а не те книжки, что наши преподы сочинили спохмелья.
     
  16. Luzer

    Luzer New Member

    Публикаций:
    0
    Регистрация:
    17 июл 2005
    Сообщения:
    95
    ☺Когда программа обращается к ячейке памяти, процессор осуществляет преобразование линейного адреса этой ячейки в физический. При этом он использует старшие биты линейного адреса (определяющие номер страницы) в качестве ключа для поиска в страничных таблицах. Найдя в таблице дескриптор страницы, процессор проверяет ее права доступа и флаг присутствия в памяти. Если дескриптор ненайден, обнаружено нарушение прав доступа или страница отмечена как отсутствующая в памяти, то процессор формирует прерывание, называемое страничной ошибкой (Page Fault). Это прерывание перехватывается МВМ. Если страничной ошибки нет, то процессор прибавляет базовый адрес страницы к младшим битам линейного адреса и тем самым получает физический адрес. Воспользовавшись этим физическим адресом, процессор считывает (или записывает) содержимое ячейки реальной памяти.

    Что за реальная память? обычная доступная память чтоли?
     
  17. Mika0x65

    Mika0x65 New Member

    Публикаций:
    0
    Регистрация:
    30 июл 2005
    Сообщения:
    1.384
    Да, еще она называется "физическая память". Только написано как-то некорректно ИМХО. Прибавление происходит на стадии получения линейного адреса (его иногда называют виртуальным). В процессе страниченого преобразования, по сути, происходит замещение 20 старших бит виртуального (в случае 32битного режима, без PAE) на 20 бит физического адреса. Младшие 12 бит, таким образом, образуют смещение в странице.
     
  18. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    Да вот как раз в теневой части сегментных регистров и кешируется.

    А вообще вы спорите ни о чем, как уже было сказано - человеку такие подробности уж точно не нужны на данном этапе.

    ЗЫ. А вообще если наглядно представить:

    логический адрес (сегмент:смещение) => линейный адрес (=база_сегмента+смещение) => физический адрес (просмотр по PDE/PTE/TLB)

    Пример преобразования:

    FS:00000000 - логический адрес
    7ffdf000 - линейный адрес
    00134000 - физический адрес.

    До последнего этапа преобразование сразу может не дойти - во всех современных ОС широко используются недействительные PTE, сообщающие о нахождении страницы в файле подкачки или где еще в укромном месте..
     
  19. SII

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

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

    rei3er maxim

    Публикаций:
    0
    Регистрация:
    15 янв 2007
    Сообщения:
    917
    Адрес:
    minsk
    я уже говорил, в зависимости от физического адреса
    "реальная память", которая ему соответствует, может быть представлена и DIMM-устройствами, и регистрами PCI-устройств, и т. д