
У меня два вопроса о структуре виртуальных адресов ядра в системах 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 также в системе Linux x64?»
заранее спасибо
решение1
Хаймемиlowmemсвязаны с расширением физического адреса на процессорах x86. Этот механизм позволяет процессору адресовать 64 ГБ памяти вместо обычных 4 ГБ. Однако, поскольку набор инструкций не изменился, а регистры и указатели по-прежнему имеют длину 32 бита, виртуальное адресное пространство по-прежнему ограничено 4 ГБ. Машинные инструкции всегда используют виртуальные адреса, а не физические.
Следствием этого является то, что к "highmem" вообще нельзя напрямую обратиться, пока он не будет отображен в адресуемую область. Вот почему только lowmem использует отображение 1:1; отображение в highmem невозможно.
Ваш следующий вопрос был: почему нельзя упростить логику MMU, чтобы пропустить таблицы страниц и выполнить простое вычитание для получения физического адреса? MMU реализован на аппаратном уровне и разработан для использования таблиц страниц (и TLB) для выполнения своей работы. Однако существуют «огромные» страницы, которые пропускают один уровень в таблицах страниц, делая размер страницы 4 МБ вместо 4 КБ на x86.
Ваш последний вопрос: память также разделена на lowmem и highmem в архитектуре x64? Нет. Механизм PAE — это своего рода халтура для продления срока службы x86. Для x64 с его гораздо большими адресными пространствами (как физическими, так и виртуальными) он не нужен.