Я изучаю выполнение процессов в 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 file-size-diff 7f3219 bad418 # I wish this worked :)
-1234 bytes
Я пробовал:
$ git diff --patch-with-stat
И это показывает разницу в размере файла для каждого бинарногофайла в diff — но не для текстовых файлов, и не общая разница в размере файла.
Есть идеи?