Инструменты для просмотра логического адреса - PullRequest
0 голосов
/ 30 марта 2020

Я новичок в linux системном программировании. Мой вопрос:

  • Какого типа адрес, когда мы запускаем команду "nm a.out" - это логические адреса?
  • Есть ли linux инструменты для просмотра все типы адресов - например, есть ли инструмент для просмотра логического адреса - линейного адреса - виртуального адреса?
  • Каков тип адреса & x в этом коде:
    int x;
    printf("%p", &x);

Ответы [ 2 ]

0 голосов
/ 30 марта 2020

В процессоре x86_64 существует 3 типа адреса:

  • Логический адрес (0x08: 0x12345678): этот тип адреса имеет сегмент: формат смещения. Разрешение на управление частью сегмента (ядро, пользователь), режим (32-битный или 64-битный), базовый, лимит. Часть смещения - это смещение в этот сегмент. Логический -> Линейная трансляция адресов: линейный адрес = основание сегмента + смещение. В 64-битном режиме все сегменты имеют base = 0 и limit = 0xffffffff, который игнорируется процессором (кроме сегмента fs и gs), при этом весь логический адрес = линейный адрес

  • Линейный адрес (виртуальный адрес): это адрес, используемый современной операционной системой, так как он является обязательным для 64-битного длинного режима

  • Физический адрес: адрес, который отправляется на системную шину, а затем в ОЗУ

О вашем вопросе:

  • Какого типа адрес при выполнении команды «nm a.out» - это логические адреса?

    • Нет, это линейный (виртуальный) адрес
  • Каков тип адреса & x в этом коде: int x; printf ("% p", & x);

    • Линейный (виртуальный) адрес
  • Есть ли linux инструменты для просмотра всех типов адреса - например, есть ли инструмент для просмотра логического адреса - линейного адреса - виртуального адреса?

    • Нет, линейный (виртуальный) адрес -> преобразование физического адреса контролируется структурой, называемой структурой подкачки, каждый процесс имеет одну из них. Структура находится внутри пространства ядра и контролируется ядром, поэтому программа пространства пользователя не может получить к ней доступ. Но вы можете видеть все линейные (виртуальные) адреса вашей программы при отладке вашей программы
0 голосов
/ 30 марта 2020

В пользовательском пространстве вы имеете дело с линейной адресацией, где линейный адрес == логический адрес == виртуальный адрес. Другими словами, существует только одно адресное пространство. Если у вас есть два указателя с одинаковым значением, они ссылаются на один и тот же объект в памяти.

...