@theeighthofseptember

Как происходит управление перемещением программ в пользовательском пространстве?

Короче, я на зачёте и не очень понимаю, что отвечать на вопрос который звучит следующим образом: "Управление перемещением программ в пользовательском пространстве"
Сначала я рассказал, что есть абсолютная и косвенная адресация и про них немного
Затем сказал, что перемещение происходит, например, тогда, когда у нас есть 8 ячеек памяти, три из которых заняты следующим образом:
|0|0|1|1|1|0|0|0|
Нам надо тут разместить программу, которая будет занимать 4 ячейки(тут вопрос откуда информация что программа займет именно 4 ячейки), но она не может поместиться. В таком случае происходит перемещение. (дальше мне задают вопрос как вообще происходит перемещение и я хожу под себя.
И вот у меня не получается найти источник, где было бы хорошо написано про то, как происходит именно перемещение. По сути я бы хотел узнать как вообще перемещение устроено на программном уровне, каким образом перемещается эта программа, весом в три ячейки, как вычисляется необходимый объем для новой программы.
  • Вопрос задан
  • 297 просмотров
Решения вопроса 1
saboteur_kiev
@saboteur_kiev Куратор тега Linux
software engineer
Это зависит от ОС и зависит от типа программы.
Программы могут быть разные, исполняемые файлы могут быть разного типа.

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

Для виндовс, почитай про PE формат - это основной формат исполняемых (.com был в ДОС, там было очень просто но он уже не используется)
https://en.wikipedia.org/wiki/Portable_Executable

Вот еще хорошая статья
https://medium.com/@db2crush/process-of-loading-pr...
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
@Mercury13
Программист на «си с крестами» и не только
Программа туда не уместится, если не предусмотрено способа разбить её пополам. Перемещение происходит, если её адрес по умолчанию чем-то не нравится: или занят, или надо утрамбовать адреса плотнее (было важно в эпоху DOS), или…

А пока — три важных ремарки.
1. В пользовательском пространстве у нас 2 гигабайта или больше виртуальной памяти, и она условно «пуста»: в любых адресах этой памяти можно разместить что угодно. Но если мы обратимся к отсутствующей странице, получим аварийный останов — такова уж издержка виртуальности. Сначала надо обратиться к системному менеджеру памяти, и он выдаст рабочий диапазон адресов.
2. Программа перемещается посегментно.
3. Есть два главных способа перемещения программы: адресация от IP и relocations.

Адресация от IP работает, понятное дело, если исходный и целевой адрес в одном сегменте. По какому адресу ни располагай сегмент — адреса от IP менять не надо. В x86, НЯЗ, она работает в одном-единственном случае: короткие переходы (±127 байтов). Ветвления все короткие, а если нужно ветвиться далеко — ответвляется на безусловный переход, который уносит далеко-далеко.

В x64 режим адресации от IP есть во всех обращениях к памяти, переходах и вызовах, но только на ±2Г (точно не в курсе).

Во всех версиях x86 базовый адрес при адресации от IP — это конец текущей команды, не начало.

Relocations — это ремарки: сегмент 1 рассчитан на базовый адрес 12. Если он другой — подкорректируй адреса 34 и 56. Независимо от метода адресации — от IP или абсолютного. Если сегмент загрузился не по штатному адресу — например, 23 — к числам по адресам 34 и 56 прибавляем разницу 11. Скажем, было 78, стало 89.

В архитектурах с сегментной памятью (x86-16) эта самая сегментная память — также метод перемещения программы. Старый добрый COM-файл имел абсолютные адреса, но только от начала текущего сегмента — и представлял собой исключительно машинный код, загружаемый по адресу не то 128, не то 256 (вот не помню). А перемещение его по памяти сводится к установке нужных значений в сегментные регистры SS/CS/DS/ES.
(Да, *.COM не имел вообще никакого формата, это просто куча кода и данных, которая 1:1 грузится в память.)
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы