Откуда ОС получает необходимый адрес диска, когда происходит ошибка страницы?

Когда запись в таблице страниц (PTE) не помечена как допустимая, это означает, что необходимые данные находятся не в памяти, а на диске. Итак, теперь происходит ошибка страницы, и ОС отвечает за загрузку этой страницы данных с диска в память.

Мой вопрос в том, как ОС знает точный адрес диска?


person Elrid    schedule 20.12.2014    source источник
comment
В общем, это зависит. Один пример ОС на базе Linux и страницы памяти, которая в настоящее время выгружается на диск, см. Linux → /mm/swapfile.c → page_swap_info и его окрестности   -  person xmojmr    schedule 20.12.2014
comment
В дизайне ОС яйцо всегда предшествует курице. МВМ сначала должен знать, как будет отображаться память, затем генерирует соответствующие PTE. Таким образом, он всегда знает, как обслуживать ошибку страницы.   -  person Hans Passant    schedule 07.04.2019
comment
Отвечает ли это на ваш вопрос? Как ОС узнает адрес диска отсутствующего страница?   -  person yyFred    schedule 12.12.2019


Ответы (3)


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

Операционная система должна поддерживать таблицу того, куда она помещает данные.

Данные могут находиться в нескольких местах. 1. Это могут быть неинициализированные данные, которые нигде не отображаются. Реагируйте на отказ страницы, очистив физическую страницу и сопоставив ее с адресным пространством процесса.

  1. Это может быть в файле подкачки.

  2. Некоторые системы имеют отдельный файл подкачки.

  3. Это может быть исполняемый файл или файл общей библиотеки.

person user3344003    schedule 20.12.2014

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

В некоторых случаях эту ошибку страницы нужно будет передать приложению на всем пути, в Linux как сигнал SIGSEGV («нарушение сегментации»), например, когда пользователь использует нулевой указатель. Но, как вы сказали, чаще всего ядро ​​должно и может обрабатывать ошибку страницы. Ядро хранит в своих собственных таблицах (а не в таблице страниц, которая представляет собой структуру с определенным форматом, определяемым процессором) информацию о том, что должна содержать каждая страница виртуальной памяти. Ниже приведены некоторые вещи, которые ядро ​​может понять о странице ошибки, обращаясь к своим собственным таблицам. Это не исчерпывающий список.

  1. Это может быть страница, созданная mmap() с диска. Этот случай включает в себя явное использование приложением mmap(), но также происходит, когда вы запускаете исполняемый файл или используете общие библиотеки — они также отображаются с диска — поэтому ошибка страницы также может произойти, когда процессор выполняет инструкции, а не только при чтении и писать. Ядро хранит список этих сопоставлений, поэтому, когда оно получает ошибку страницы, оно может выяснить, где на диске ему нужно прочитать, чтобы получить недостающую страницу. Таким образом, он читает с диска, а при получении данных помещает их в новую страницу в памяти и устанавливает запись в таблице страниц (PTE) так, чтобы она указывала на эту новую страницу с данными, и возобновляет поток приложения — где неисправная инструкция повторяется и теперь успешно.

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

  3. Возможно, это была попытка записи на страницу «копирование при записи». Ядру необходимо сделать копию исходной страницы и изменить адрес в таблице страниц, чтобы он указывал на новую копию, а затем разрешить запись. Например, когда вы выделяете большую область памяти, она может указывать на существующую «нулевую» страницу и выделяться только при первой записи на страницы. Другой пример: после fork() все страницы нового процесса являются страницами копирования при записи, указывающими на страницы исходного процесса, и будут фактически скопированы только при первой записи (любым процессом).

Однако, поскольку вы ищете достоверные источники, возможно, вы захотите прочитать объяснение того, как именно ядро ​​Linux делает это, например, в: https://vistech.net/~champ/online-docs/books/linuxkernel2/060.htm.

person Nadav Har'El    schedule 13.04.2019

Это то же самое, что адресация виртуальной памяти.
Адреса, которые появляются в программах, являются виртуальными адресами или программными адресами. Для каждого доступа к памяти, будь то для получения инструкции или данных, ЦП должен преобразовать виртуальный адрес в реальный физический адрес. Можно считать, что адрес виртуальной памяти состоит из двух частей: номера страницы и смещения внутри страницы. Номер страницы определяет, какая страница содержит информацию, а смещение указывает, какой байт внутри страницы. Размер поля смещения равен логарифмическому основанию 2 размера страницы.
Если виртуальный адрес действителен, система проверяет, свободен ли фрейм страницы. Если нет свободных кадров, запускается алгоритм замены страницы для удаления страницы.

person moinmaroofi    schedule 13.04.2019