@SergeySerge11

Как ос генерируют виртуальные адреса, по которым будет поиск, не физические? Почему программы с одних адресов начинаются?

Виртуальные, не физические, Каким образом сам адрес определяется, старшие 20 бит, для дальнейшей трансляции, при загрузки процесса, выделений ппамяти
Я ни как не могу до конца понять, почему начальные адреса сегментов всех программ имеют один адрес?
Вот есть Tlb, представим это как линейный массив, или c , если все адреса будут одинаковы. То Очевидно что tlb будет работать в 1% своего множества, тогда как 99% комбинаций "виртуальных адресов" будут бездействовать. Или если рассмотреть структуру с тегами, то там так же будут области более и менее интенсивные. Так как адреса в порядке возрастания будут всегда поступать. Допустим с начала(код), с конца(стек), и где-то в середине(куча), а между ними будут области куда не каждый дойдет.
Или есть все не так, и ОС как-то(в принципе очень легко) рандомизирует очередь при выделении Виртуальных адресов. В принципе просто можно случайны возвращать всегда при инициализации процесса
  • Вопрос задан
  • 110 просмотров
Пригласить эксперта
Ответы на вопрос 2
AshBlade
@AshBlade
Просто хочу быть счастливым
Ты уже сказал про старшие 20 бит, скорее всего знаешь про сегментную организацию виртуальной памяти.
20 бит используются в 32 битных системах, а сейчас большая часть 64 битная, но это не важно.
Принцип следующий:
Существует 3 таблицы:
- PGD - Page Global Directory
- PMD - Page Middle Directory
- PTE - Page Table Entry

Они иерархические, т.е. запись в PGD указывает на запись в PMD, а PMD - на PTE.
В итоге, ты приходишь с 3 "числами" - индексы для этих таблиц и последовательно приходишь к нужной PTE.
Но тебе нужно еще 4 число - смещение относительно полученного в PTE значения (там хранятся "начала" выделенных сегментов/интервалов памяти)
Теперь последовательно запиши эти адреса и получишь виртуальный адрес.

TLB в данном случае - это просто кэш, чтобы ты постоянно не ходил через этот ад указателей. Он в процессе выделения памяти не участвует.

Как выделяется реальная память - деталь реализации, о которой знать не нужно.
Если интересно - вот статья про память в линуксе.

P.S. пример показан на C# - там собственная виртуальная память и GC. Поэтому показывает не то, что выделила ОС.
Ответ написан
Комментировать
jcmvbkbc
@jcmvbkbc
"I'm here to consult you" © Dogbert
Почему программы с одних адресов начинаются?

Потому что часть программ просто линкуется в одни и те же адреса. Это т.н. position-dependent executable, их в принципе невозможно загрузить для исполнения по другому адресу, и до недавнего времени (по крайней мере в linux) это было поведением по умолчанию. Но вот уже лет 10 во многих дистрибутивах по умолчанию используются PIE -- position-independent executables, и если не выключен ASLR, то при каждой загрузке часть адреса выбирается случайно. Но это сделано не для улучшения поведения TLB а для безопасности, поскольку это затрудняет атаки использующие известные адреса загрузки кода.

Вот есть Tlb, представим это как линейный массив, или c , если все адреса будут одинаковы. То Очевидно что tlb будет работать в 1% своего множества

Нет, не очевидно. Потому что никто не делает процессоры с пропорциональным отображением всего адресного пространства на все записи TLB. Обычно индексом записи TLB являются младшие биты номера страницы. Т.е. две соседние страницы могут использовать два соседних индекса в TLB, а канал TLB на 256 записей может быть полностью использован всего-то непрерывным мегабайтом памяти в 4-КБайтных страницах.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы