загрузчик изменяет таблицу перемещения, когда он знает, что сегментация выключена (noaways)? - PullRequest
0 голосов
/ 24 ноября 2018

позвольте мне попытаться объяснить мой расплывчатый вопрос.

Несколько дней назад я начал изучать разбиение на страницы и сегментацию, и я понял, что сегодня сегментация игнорируется, если установить для всех сегментов базу 0 и их максимум до предела - 2 ^ 32 (также известный какмодель с плоской памятью).

Но до этого, а также и сегодня (хотя и игнорируется), каждая ссылка на память была объединена регистром сегмента: смещение сегмента.регистр сегмента является селектором, который содержит индекс для сегмента в таблице сегментов, который содержит базовый адрес сегмента.как я уже говорил, теперь все 0. эта ссылка на память также известна как «логический адрес».

Насколько я понимаю, во времена, когда каждый сегмент имел свое собственное пространство памяти, мы бы достиглипервый байт кода с: call CS: 0 и первый байт данных с [DS: 0].

Но сегодня это просто не будет работать (я думаю), потому что все сегменты используют одинаковое пространство памятипоэтому код должен быть другим.Например, первый байт кода должен быть по (произвольному адресу) вызову CS: 0x4567 (просто абсолютный, а не смещение, как раньше), а первый байт данных будет по (произвольному адресу) [DS: 0x12121212].

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

спасибо, и хорошего дня.

...