2009-02-23 5 views
6

В ядре linux mem_map - это массив, который содержит все дескрипторы «struct page». Эти страницы включают 128MiB память в lowmem для динамического отображения highmem.Зачем нам нужно zone_highmem на x86?

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

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

Примечание: если мое понимание источника ядра выше неверно, исправьте. Благодаря!

ответ

1

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

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

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

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

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

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

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

0

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

0

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

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

Почему мы нуждаемся в зоне_highmem на x86?

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