зачем нам zone_highmem на x86? - PullRequest
       7

зачем нам zone_highmem на x86?

6 голосов
/ 23 февраля 2009

В ядре Linux, mem_map - это массив, который содержит все дескрипторы "struct page". Эти страницы включают в себя 128 МБ памяти в формате lowmem для динамического отображения highmem.

Поскольку минимальный размер составляет 1 ГБ, массив mem_map содержит только записи 1 ГБ / 4 КБ = 256 КБ. Если размер каждой записи составляет 32 байта, то объем памяти mem_map = 8 МБ. Но если бы мы могли использовать mem_map для отображения всей физической памяти 4 ГБ (если бы у нас было столько физической памяти на x86-32), то массив mem_map занимал бы 32 МБ, что не так много памяти ядра (или я ошибаюсь) ?).

Итак, мой вопрос: почему мы должны использовать этот 128MiB в низком для непрямого отображения highmem в первую очередь? Или, другими словами, почему бы не отобразить всю эту максимальную физическую память 4 ГБ (если имеется) непосредственно в пространство ядра?

Примечание: если мое понимание исходного кода ядра неверно, пожалуйста, исправьте. Спасибо!

Ответы [ 3 ]

1 голос
/ 23 февраля 2009

Смотрите здесь: http://www.xml.com/ldd/chapter/book/ch13.html

Недостаточно памяти ядра - это «реальная» карта памяти, адресуемая 32-разрядными указателями на x86.

Ядро с высокой памятью - это «виртуальная» карта памяти, адресованная виртуальным структурам на x86.

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

По крайней мере, так я это прочитал. Вау, это сложный вопрос, который вы задали.

Чтобы еще больше сбить с толку, в главе 13 говорится о том, что некоторые устройства PCI не могут обращаться к 32-разрядному пространству, что и стало следствием моего предыдущего комментария:

На x86 некоторое использование памяти ядра ограничено первым гигабайтом памяти из-за проблем адресации DMA. Я не на 100% знаком с этой темой, но есть режим совместимости для DMA на шине PCI. Это может быть то, что вы смотрите.

0 голосов
/ 05 октября 2014

Или, другими словами, почему бы не отобразить все эти физические максимальные 4 ГБ память (если есть) в пространстве ядра напрямую?

Одной из причин является пространство пользователей: каждый процесс пространства использования имеет свое собственное виртуальное адресное пространство. Предположим, у вас есть 4 ГБ оперативной памяти на x86. Поэтому, если мы предположим, что ядру принадлежит 1 ГБ памяти (~ 800 напрямую сопоставлено + ~ 200 vmalloc), все остальные ~ 3Gb должны быть динамически распределены между процессами, вращающимися в пространстве пользователя. Итак, как вы можете отобразить свои 4Gbs напрямую, когда у вас есть несколько адресных пространств?

зачем нам zone_highmem на x86?

Причина та же. Ядро резервирует только ~ 800 Мб для низкой памяти. Вся остальная память будет выделена и связана с конкретным виртуальным адресом только по требованию. Например, если вы выполните двоичный файл, будет создано новое виртуальное адресное пространство, и некоторые страницы будут выделены для хранения вашего двоичного кода и данных (куча, стек ...). Таким образом, ключевым атрибутом high mem является обслуживание запросов на динамическое распределение памяти, вы никогда не знаете заранее, что будет вызвано пользовательским пространством ...

0 голосов
/ 23 февраля 2009

3,6 ГБ - это не предел при использовании расширения физических адресов, которое обычно требуется на большинстве современных плат x86, особенно с оперативным подключением памяти.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...