мы видим виртуальный адрес процесса (в пейджинговой системе), где эти виртуальные адреса существуют?

Мы видим виртуальный адрес, соответствующий какой-либо инструкции, поэтому мой вопрос: где существуют эти виртуальные адреса? Если мы увидим дизассемблирование в gdb, мы увидим виртуальный адрес, где находится этот адрес? Пожалуйста, не говорите, что это только виртуальный адрес, который должен быть сопоставлен с физическим адресом по таблице страниц, я это знаю, но где существуют эти виртуальные адреса, которые мы видели в gdb? В ОЗУ или на жестком диске?


person user156991    schedule 17.09.2016    source источник
comment
Я не понимаю, что вы спрашиваете, при чем здесь проживание и существование - вы ожидаете, что будет огромный список всех возможных адресов?   -  person harold    schedule 17.09.2016
comment
@harold на самом деле я хочу знать о фактическом положении виртуального адреса, они находятся на диске или в ОЗУ?   -  person user156991    schedule 17.09.2016
comment
Куда бы вы их ни положили. Они не так уж отличаются от других видов ценностей. У вас, вероятно, будут какие-то указатели в регистрах, ОЗУ, возможно, часть этой ОЗУ будет выгружена на диск ... хотя это странный вопрос. Это сравнимо с тем, где находятся индексы массива.   -  person harold    schedule 17.09.2016
comment
Индексы массива @harold будут находиться в основной памяти, но мы видим соответствующую инструкцию виртуального адреса, такую ​​​​как mov, store. где находятся эти инструкции с виртуальным адресом, все ли инструкции, которые мы видим в gdb, имеют физический фрейм?   -  person user156991    schedule 17.09.2016
comment
О, это то, что вы имели в виду. Ваш вопрос действительно удивительно сбивает с толку. Инструкции — это просто данные, которые выполняются. Типичные страницы, содержащие инструкции, также могут быть заменены (в ядре есть некоторые страницы, которые должны быть постоянно резидентными), но часто они представляют собой отображаемые в памяти страницы исполняемого файла, поэтому он просто удаляется, поскольку уже существует на диск. Этот трюк не зарезервирован для инструкций. В конце концов, это на самом деле не имело никакого отношения к адресам.   -  person harold    schedule 17.09.2016
comment
@MichaelPetch спасибо, это то, что я хочу знать.   -  person user156991    schedule 17.09.2016
comment
Без проблем. мой комментарий должен был быть больше похож на то, что если указатель инструкции находится на странице, не отмеченной как присутствующая, это вызовет ошибку страницы. Обработчик ошибок страниц загрузит страницу, содержащую инструкции, и сопоставит ее с виртуальным адресным пространством, пометит страницу как присутствующую и затем перезапустится с места, где произошла ошибка инструкции.   -  person Michael Petch    schedule 17.09.2016
comment
После перезапуска инструкции должны выполняться, поскольку теперь они находятся в памяти (присутствуют) и сопоставлены с виртуальным адресом. Если сама инструкция имеет ссылку на память (доступ к фрагменту данных), а данные отсутствуют, произойдет другая ошибка, когда страница, содержащая данные, будет загружена в память; сопоставлен с виртуальным адресом; помечен как присутствующий; а затем перезапустил.   -  person Michael Petch    schedule 17.09.2016


Ответы (3)


Адрес (или любое другое числовое значение в этом отношении) может существовать в регистрах ЦП, памяти и любом другом хранилище, включая диск. Но это, вероятно, не удивительно для вас, и это не то, о чем вы спрашиваете.

Если мы говорим о трансляции 32-битных x86-страниц, то таблицы страниц не содержат виртуальных адресов, которые транслируются в физические адреса. Таблицы страниц содержат только физические адреса, но не виртуальные. Нет необходимости хранить виртуальные адреса внутри таблиц страниц.

Давайте упростим ситуацию и предположим, что в системе есть только одна таблица страниц, и эта таблица страниц содержит 1024 физических адреса страниц кода/данных. Где тут виртуальные адреса? Они в значительной степени являются индексами в таблице страниц. Если страницы имеют размер 4 КБ и все адреса 22-разрядные, то 12 младших битов виртуального адреса определяют расположение внутри страницы кода/данных (от 0 до 4095), а 10 старших битов виртуального адреса выбирают один из 1024 страницы через таблицу страниц. Когда ЦП использует виртуальный адрес для доступа к памяти, он разбивает виртуальный адрес на индекс в таблице страниц и на смещение в пределах выбранной страницы. Затем он получает физический адрес страницы (из таблицы страниц), добавляет к нему смещение внутри страницы, а затем использует полученный физический адрес для чтения или записи памяти.

person Alexey Frunze    schedule 17.09.2016
comment
хорошо, но скажем, 0x80123456 mov reg1, reg2 — это наша первая инструкция в разделе .text, которая будет выполняться, будет ли ошибка страницы для 0x80123456, потому что это первая инструкция или физический фрейм, соответствующий 0x80123, виртуальная страница уже загружена в систему ? если будет ошибка страницы страницы, то как мы увидим инструкцию mov reg1, reg2, потому что для нее не выделен физический фрейм, как мы увидим инструкцию раздела .text без ее физической загрузки? - person user156991; 17.09.2016
comment
@user156991 user156991 Если вы видите что-то в памяти (код или данные), это означает, что соответствующие виртуальные адреса были сопоставлены с физическими адресами, и в какой-то момент что-то было загружено/записано в базовую физическую память. Это может быть сделано автоматически/по требованию ОС, особенно когда вы сопоставляете файл с памятью (ошибка страницы указывает ОС на сопоставление и загрузку). Это можно сделать вручную, попросив ОС (через системные вызовы) выделить память (выделить физическую память и сопоставить с ней виртуальное адресное пространство), а затем загрузить в нее содержимое файла. - person Alexey Frunze; 18.09.2016

Виртуальный адрес не существует точно так же, как не существует улицы. Только дом, на который ссылается почтовый адрес, может существовать, и точно так же может (но не обязательно) существовать хранилище, на которое ссылается виртуальный адрес. Тип хранилища зависит от системы. Обычно это ОЗУ, но это также может быть ПЗУ, периферийное устройство с отображением памяти, открытая шина (то есть ничего) или что-то еще.

person fuz    schedule 17.09.2016
comment
@FUZxxi мы видим инструкцию в gdb, все ли инструкции присутствуют физически, или мы просто видим ее с диска, и ОС получает ошибку страницы для текущей выполняемой инструкции (рассмотрим случай без LOAD, STORE). - person user156991; 17.09.2016
comment
Это определено реализацией. В какой-то момент инструкции были загружены в оперативную память, но, возможно, они уже были заменены. - person fuz; 17.09.2016

Общее упрощение ответа на ваш вопрос относительно x86 может быть следующим:

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

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

Точный механизм, который ОС использует для поддержки фреймов страниц; поддерживать таблицы страниц и каталоги; решает, откуда/как загружать данные/код, детали реализации могут различаться. Ключевым моментом является то, что отказы страниц являются основным механизмом загрузки данных/кода в страницы виртуальной памяти, которые могут быть помечены ОС как отсутствующие.

person Michael Petch    schedule 17.09.2016