Вопросы о макете виртуального адреса ядра

У меня есть два вопроса о структуре виртуальных адресов ядра в системах x86 и x64.

Насколько мне известно, x86 использует структуру разделенной памяти: highmem и lowmem.

Если я правильно понимаю, единственная разница между highmem и lowmem заключается в том, имеет ли он отображение 1: 1 виртуального в физический адрес или нет.

Также кажется, что lowmem содержит код и данные, к которым часто обращается программа ядра, а highmem содержит таблицы страниц или данные программы уровня пользователя, к которым нечасто обращаются.

Однако я не могу понять причину, по которой ядро ​​x86 разделяет виртуальные адресные пространства и размещает часто используемые данные и код в lowmem. Какая от этого польза? Кажется, что независимо от расположения памяти ядра следует вызывать обход таблицы страниц для получения виртуальных сопоставлений с физическими. Если это правильно, то кажется, что преимуществ highmem и lowmem нет.

Здесь мой первый вопрос: если lowmem использует сопоставления 1: 1 (т.е. физический адрес + константа (0x80000000) => виртуальный адрес ядра), почему MMU тратит свои часы на просмотр таблицы страниц, чтобы узнать, что виртуальный физические сопоставления. Если возможно, мы можем изменить логику MMU, чтобы сделать это только за вычетом магической константы из виртуального адреса, чтобы получить физический адрес, если он расположен в области lowmem. или есть какие-то другие причины для размещения часто используемых данных и кода в lowmem? И почему только lowmem использует сопоставления 1: 1?

Мой второй вопрос: «Развернут ли механизм разделения памяти lowmem и highmem в системе x64 linux?»

Заранее спасибо

0
07.04.2017, 18:40
1 ответ

Highmem и lowmem связаны с расширением физического адреса на процессорах x86. Этот механизм позволяет процессору адресовать 64 ГБ памяти вместо обычных 4 ГБ. Однако, поскольку набор команд не изменился, а регистры и указатели по-прежнему имеют длину 32 бита, виртуальное адресное пространство по-прежнему ограничено 4 ГБ. Машинные инструкции всегда используют виртуальные адреса, а не физические.

Следствием этого является то, что "highmem" вообще не может быть адресован напрямую, пока не будет отображен в адресуемую область. Вот почему только lowmem использует отображение 1: 1; сопоставление с highmem невозможно.

Ваш следующий вопрос был: почему нельзя упростить логику MMU, пропустив таблицы страниц и сделав простое вычитание для получения физического адреса? MMU реализован аппаратно и предназначен для использования таблиц страниц (и TLB) для выполнения своей работы. Однако существуют «огромные» страницы, которые пропускают один уровень в таблицах страниц, что делает размер страницы 4 МБ вместо 4 КБ на x86.

Ваш последний вопрос: разделена ли память на lowmem и highmem на архитектуре x64? Нет. Механизм PAE - это своего рода кладжа для продления срока службы x86. X64 с его гораздо большими адресными пространствами (как физическими, так и виртуальными) в этом не нуждается.

1
28.01.2020, 02:46

Теги

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