Я изучаю выполнение процессов в 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, чтобы она указывала на таблицу страниц, соответствующую программе, каждый раз, когда выполняется переключение задач. Если это так, это звучит как дополнительная сложность --, учитывая, что программный код не зависит от позиции -, не будет ли проще просто загрузить программу по произвольному виртуальному адресу и просто перейти оттуда?