Как одна и та же программа Linux может использовать адреса загрузки памяти несколько раз в разных процессах, работающих одновременно?

Я изучаю выполнение процессов в Linux 2.6.32 на 64-битной машине -. Изучая результаты /proc/$PID/maps, я заметил одну вещь:

$ cat /proc/2203/maps | head -1
00400000-004d9000 r-xp 00000000 08:02 1050631              /bin/bash

$ cat /proc/27032/maps | head -1
00400000-00404000 r-xp 00000000 08:02 771580               /sbin/getty

Кажется, что файл mapsдля всех программ показывает, что исполняемый код для каждой программы загружается в блок памяти, начинающийся с 0x00400000.

Я так понимаю, что это виртуальные адреса. Однако я не понимаю, как эти адреса могут быть одинаковыми для нескольких одновременно запущенных процессов. В чем причина использования общего начального адреса для загрузки всех процессов и как ОС различает виртуальную точку загрузки одного процесса от другого?

Изменить:

Исходя из моего понимания виртуализации адресного пространства с использованием подкачки, я подумал, что часть виртуального адреса использовалась для поиска физического адреса блока памяти (кадра ), используя его для индексации одной или нескольких таблиц страниц.Рассмотрим этот случай. Адрес выглядит 32-бит (вот это другое меня смущает --почему адреса программы 32-бит, а адреса загружаемых библиотек 64-бит? ). Разбиение адреса на десять, десять и двенадцать битов, соответствующих записи каталога страниц, записи таблицы страниц и смещению страницы соответственно, не должно 0x00400000всегда означать «запись каталога страниц 1, запись таблицы страниц 0, смещение 0». ", неважно какая программа выполняет трансляцию адресов?

Один из способов, которым я вижу, как это можно сделать, заключается в том, что ОС изменила запись каталога страниц #1, чтобы она указывала на таблицу страниц, соответствующую программе, каждый раз, когда выполняется переключение задач. Если это так, это звучит как дополнительная сложность --, учитывая, что программный код не зависит от позиции -, не будет ли проще просто загрузить программу по произвольному виртуальному адресу и просто перейти оттуда?

9
задан Ciro Santilli 新疆改造中心法轮功六四事件 5 April 2016 в 13:08
поделиться