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

— 121 --- 1247176- Git: показать общую разницу в размере файла между двумя фиксациями?Можно ли показать общую разницу в размере файла между двумя фиксациями? Что-то вроде: $ git file-size-diff 7f3219 bad418 # Если бы это работало :) -1234 байт Я пробовал: $ git diff --patch-with-...

Можно ли показать общую разницу в размере файла между двумя коммитами? Что-то вроде:

$ git file-size-diff 7f3219 bad418 # I wish this worked :)
-1234 bytes

Я пробовал:

$ git diff --patch-with-stat

И это показывает разницу в размере файла для каждого бинарногофайла в diff — но не для текстовых файлов, и не общая разница в размере файла.

Есть идеи?

72
задан Mathias Bynens 1 June 2012 в 05:48
поделиться