Почему ядро ​​Linux ZONE_NORMAL ограничено 896 МБ? - PullRequest
9 голосов
/ 24 ноября 2011

Вопрос новичка.Я занимаюсь изучением ядра и запутался в предельном размере ZONE_NORMAL, равном 896 МБ.Я не понимаю, почему ядро ​​не может напрямую отобразить физическую память 4G в пространство ядра.В некоторых документах упоминается ограничение размера карты страницы.Но, учитывая, что память 4G имеет 2 ^ 20 страниц, а каждая "страница структуры" составляет 4 байта, mem_map будет иметь размер только 4 МБ.Это не должно быть проблемой.Надеюсь, вы могли бы пролить мне немного света.

Спасибо

Ответы [ 2 ]

8 голосов
/ 24 ноября 2011

Причина, по которой ядро ​​ограничивается 896 мегабайтами, связана с производительностью.

Чем больше места доступно ядру, тем меньше адресного пространства, доступного для пространства пользователя. Это разделение на 3/1 означает, что наибольшее количество адресного пространства, которое пользовательский процесс может выделить, составляет 3 гигабайта - конечно, из-за фрагментации памяти на практике он начинает давать сбой около 2,5 гигабайт.

Доступны различные разбиения: 2/2 и 1/3, которые выделяют два гигабайта адресного пространства для ядра и два гигабайта для пространства пользователей, и три гигабайта для ядра и одно гигабайта адресного пространства для пространства пользователей. (Это firefox означает сейчас , потребляющее 1249 мегабайт, поэтому оно не может поместиться в одно из этих 1/3 разделенных ядер.)

Существуют некоторые ядра (возможно, только для поставщиков?), Которые поддерживают то, что известно как разделение 4: 4 - четыре гигабайта адресного пространства для ядра и четыре гигабайта адресного пространства для пространства пользователей. Они чрезвычайно полезны для 32-разрядных систем, которые имеют 32 или 64 гигабайта памяти - поскольку большая система, вероятно, имеет много дисков, много операций ввода-вывода в полете и требует значительной буферизации как для блочных устройств, так и для сетевого трафика. Однако эти ядра 4: 4 требуют очистки кэша TLB при входе и выходе из каждого системного вызова. Эти сбросы TLB приводят к значительному замедлению работы в «малых» системах и имеют смысл только в «больших» системах, где дополнительная память может кэшировать достаточно дисковых / сетевых ресурсов для повышения производительности системы.

Другие разделы не вызывают этот сброс TLB, потому что TLB поддерживает бит разрешений, указывающий, доступны ли страницы, когда ЦП находится в состоянии пользователя или в режиме супервизора: страницы ядра всегда отображаются, но помечаются как доступные только тогда, когда Флаг супервизора ЦП установлен. Таким образом, вход и выход из ядра происходит быстро при выходе из процесса, который вошел в ядро. При переключении контекста, конечно, TLB должен быть сброшен.

7 голосов
/ 24 ноября 2011

Конечно, ядро ​​может отобразить всю доступную память.

В Linux память, доступная во всех банках, классифицируется на «узлы». Эти узлы используются, чтобы указать, сколько памяти имеет каждый банк. Память в каждом узле делится на «зоны». В настоящее время определены зоны ZONE_DMA, ZONE_NORMAL и ZONE_HIGHMEM.

ZONE_DMA используется некоторыми устройствами для передачи данных и отображается в нижнем диапазоне физической памяти (до 16 МБ).

Память в области ZONE_NORMAL отображается ядром в верхней области линейного адресного пространства. Большинство операций могут выполняться только в ZONE_NORMAL; так что это наиболее критичная для производительности зона. ZONE_NORMAL идет от 16 МБ до 896 МБ.

Почему?

Часть памяти зарезервирована для структур данных ядра, которые хранят информацию о карте памяти и таблицах страниц. Это на x86 128 МБ. Следовательно, из 1 ГБ физической памяти, к которой ядро ​​может обращаться (в типичной конфигурации 1 ГБ зарезервировано для ядра), 128 МБ зарезервировано. Следовательно, виртуальные адреса ядра в этих 128 МБ не отображаются непосредственно в физическую память. Это оставляет максимум 896 МБ для ZONE_NORMAL. Таким образом, даже если у вас есть 1 ГБ физической ОЗУ, для пользователей будет доступно всего 896 МБ.

Чтобы лучше понять предмет, я предлагаю вам взглянуть на главу 15 «Драйверы устройств Linux» ( pdf ).

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