Указатели относятся к физическим или виртуальным воспоминаниям? - PullRequest
3 голосов
/ 29 марта 2019

Я недавно узнал, что компьютерные программы фактически не используют адрес физической памяти.Скорее я понимаю, что физическая память «скрыта» операционной системой для приложения.

Вот мой вопрос: возвращают ли указатели адрес физической памяти или виртуальной памяти?

Если я выполню код, приведенный ниже, я получу адрес в шестнадцатеричной форме.Это просто номер, который был случайно назначен операционной системой?А также я обнаружил, что адреса элементов в массиве назначаются последовательно.Означает ли это, что массив в ОЗУ имеет «строчную» форму, или его можно назначать в разреженных областях, а ОС просто обманывает программиста?

int num = 3;
int arr[3];

printf("address of num: 0x%0x \n", &num);
printf("&arr[0]: 0x%0x \n", &arr[0]);
printf("&arr[1]: 0x%0x \n", &arr[1]);
printf("&arr[2]: 0x%0x \n", &arr[2]);

Ответы [ 2 ]

5 голосов
/ 29 марта 2019

Во всех современных операционных системах (Windows, Linux, BSD и т. Д.) все адреса в приложении пользовательского пространства являются виртуальными адресами. Исключением являются определенные ОСРВ или другие пользовательские приложения без использования металла.

Виртуальные адреса не обязательно случайные , но с точки зрения аппаратного обеспечения они являются произвольными. Ядро, как правило, решает, какое виртуальное адресное пространство выделить для данного запроса сопоставления, иногда принимая во внимание запросы пространства пользователя. Когда используются такие вещи, как ASLR (что является обычным в наши дни), адреса намеренно рандомизируются.

Означает ли это, что массив на самом деле имеет форму «линии» в ОЗУ или он может быть назначен в редких областях, а ОС просто обманывает программиста?

Оба. ОС создает физические-виртуальные отображения страниц памяти, а не отдельных адресов. Размер страницы зависит от архитектуры, но обычно составляет 4 КиБ.

Так, если у вас есть массив 1 КиБ (начальный адрес которого выровнен как минимум на 1 КиБ), он будет физически смежным. Массив 16 КиБ, однако, может быть разбросан по 4 страницам, которые нигде не находятся рядом.

1 голос
/ 29 марта 2019

Это зависит от операционных систем. Но в основном (на большинстве ОС) это логические адреса. Существуют механизмы ОС, такие как виртуальная память, пейджинг и т. Д. Для преобразования адресов. Обычно это делается для того, чтобы программе не разрешалось перезаписывать части памяти. Если вы используете это на чистом ядре без ОС для обработки виртуального адреса. Это будет физический адрес. Если он запускается как приложение поверх операционной системы, вы получите виртуальные адреса.

...