Мы видим виртуальный адрес, соответствующий какой-либо инструкции, поэтому мой вопрос: где существуют эти виртуальные адреса? Если мы увидим дизассемблирование в gdb, мы увидим виртуальный адрес, где находится этот адрес? Пожалуйста, не говорите, что это только виртуальный адрес, который должен быть сопоставлен с физическим адресом по таблице страниц, я это знаю, но где существуют эти виртуальные адреса, которые мы видели в gdb? В ОЗУ или на жестком диске?
мы видим виртуальный адрес процесса (в пейджинговой системе), где эти виртуальные адреса существуют?
Ответы (3)
Адрес (или любое другое числовое значение в этом отношении) может существовать в регистрах ЦП, памяти и любом другом хранилище, включая диск. Но это, вероятно, не удивительно для вас, и это не то, о чем вы спрашиваете.
Если мы говорим о трансляции 32-битных x86-страниц, то таблицы страниц не содержат виртуальных адресов, которые транслируются в физические адреса. Таблицы страниц содержат только физические адреса, но не виртуальные. Нет необходимости хранить виртуальные адреса внутри таблиц страниц.
Давайте упростим ситуацию и предположим, что в системе есть только одна таблица страниц, и эта таблица страниц содержит 1024 физических адреса страниц кода/данных. Где тут виртуальные адреса? Они в значительной степени являются индексами в таблице страниц. Если страницы имеют размер 4 КБ и все адреса 22-разрядные, то 12 младших битов виртуального адреса определяют расположение внутри страницы кода/данных (от 0 до 4095), а 10 старших битов виртуального адреса выбирают один из 1024 страницы через таблицу страниц. Когда ЦП использует виртуальный адрес для доступа к памяти, он разбивает виртуальный адрес на индекс в таблице страниц и на смещение в пределах выбранной страницы. Затем он получает физический адрес страницы (из таблицы страниц), добавляет к нему смещение внутри страницы, а затем использует полученный физический адрес для чтения или записи памяти.
Виртуальный адрес не существует точно так же, как не существует улицы. Только дом, на который ссылается почтовый адрес, может существовать, и точно так же может (но не обязательно) существовать хранилище, на которое ссылается виртуальный адрес. Тип хранилища зависит от системы. Обычно это ОЗУ, но это также может быть ПЗУ, периферийное устройство с отображением памяти, открытая шина (то есть ничего) или что-то еще.
Общее упрощение ответа на ваш вопрос относительно x86 может быть следующим:
Если будет обнаружено, что указатель инструкций (IP) связан с адресом виртуальной памяти на странице, которая помечена как отсутствует, это вызовет ошибку страницы. Обработчик отказов страниц загрузит свободный фрейм страницы с кодом, отобразит его в виртуальную память, пометит виртуальную страницу присутствующей, а затем вернется обратно в расположение виртуальной памяти с вновь загруженной инструкцией. Будет предпринята попытка выполнить инструкцию.
Если инструкция обращается к операнду(ам) памяти, который ссылается на адрес виртуальной памяти, который отсутствует, то они также вызовут дополнительные страничные ошибки. Произойдет ошибка страницы, обработчик страницы загружает необходимые данные в свободный страничный фрейм, сопоставляет их с виртуальной памятью, помечает виртуальную страницу как присутствующую, а затем возвращается к инструкции, вызвавшей ошибку. вина. В этот момент инструкция повторяется снова.
Точный механизм, который ОС использует для поддержки фреймов страниц; поддерживать таблицы страниц и каталоги; решает, откуда/как загружать данные/код, детали реализации могут различаться. Ключевым моментом является то, что отказы страниц являются основным механизмом загрузки данных/кода в страницы виртуальной памяти, которые могут быть помечены ОС как отсутствующие.