ZONE_NORMAL и это являются связью с Kernel/User-pages?

В данном случае можно использовать X вместо x который только добавляет биты к каталогам или файлам, которые уже имеют исполняемый набор битов для некоторого пользователя (т.е. chmod -R +X my_dir).

В целом (например, если Вы хотели сделать все каталоги читаемыми, не влияя на файлы), Вы могли бы или использовать find с -type d или если Вы используете zsh (или колотите 4 с shopt -s globstar) **/ шарик (оба, не передавая -R флаг к chmod).

5
27.12.2010, 00:55
2 ответа

На 32-разрядной архитектуре Вы имеете 0xffffffff (4'294'967'295 или 4 ГБ) линейные адреса (не физическое пространство) для обращения к физическому адресу.
Даже только с 512 МБ физического устройства хранения данных (реальная палка RAM, подключенная к шине), ядро будет все еще использовать 4'294'967'295 линейные адреса (на 4 ГБ) для вычисления физических.

Ядро Linux делит этих 4 ГБ (адресов) в пространство пользователя (верхняя память) и пространство ядра (низкая память) 3/1, таким образом, пространство ядра имеет 1'073'741'823 (1 ГБ) линейных адресов для использования.

Этот 1 ГБ линейных адресов, только доступен ядром и становится разделенным еще больше.

ZONE_DMA: Содержит страничные блоки памяти ниже 16 МБ. Это используется для старых шин ISA, они могут обратиться только к первым 16 МБ RAM.

ZONE_NORMAL: Содержит страничные блоки памяти в и выше 16 МБ и ниже 896 МБ, это адреса, которые ядро может отобразить/получить доступ непосредственно.

ZONE_HIGHMEM: Содержит страничные блоки памяти в и выше 896 МБ, страничные блоки выше этой границы обычно не отображаются на пространстве ядра и поэтому не непосредственно доступные ядру. Страничные блоки от пространства пользователя могут быть временно или постоянно отображены здесь.

То, сколько реального, физического места RAM занято различными зонами, зависит от формы и количества процессов, которые Вы выполняете.

Если Вы входите free -ml в Вашей консоли Вы видите, что использование включает низко - и верхняя память:

             total       used       free     shared    buffers     cached
Mem:          3022       2116        905          0        105       1342
Low:           839        196        642
High:         2182       1919        263
-/+ buffers/cache:        667       2354
Swap:         2859         93       2766
3
27.01.2020, 20:41

Та же физическая страница может быть отображена больше чем на одном виртуальном адресе.

ZONE_NORMAL состоит из страниц, которые могут быть отображены ядром. Большая часть той памяти не принадлежит ядру, но ядро должно отобразить всю память в какой-то момент (не обязательно все одновременно). Например, когда ядро обрабатывает a write системный вызов, это должно скопировать данные из предоставленного пользователями буфера, что означает, что буфер должен быть отображен в виртуальном адресном пространстве ядра.

Схема описывает (относительно) простую ситуацию без верхней памяти. (Если Вы работаете с высокопроизводительными устройствами ARM, теперь время, чтобы начать узнавать о верхней памяти.) Затем ядро может отобразить всю память процесса и всю физическую память одновременно.

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

  • 0x00000000..0x00000fff: освобожденный. Указатель в этом диапазоне недопустим.
  • 0x00001000..0xbfffffff: память процесса. Это - указатель в виртуальное адресное пространство процесса, которого код ядра на рассмотрении обрабатывает системный вызов. Страница в том диапазоне могла быть освобождена, или это могло быть выделено и загружено (в этом случае, это также имеет физический адрес), или это могло быть выделено и выгружено (в этом случае, это не имеет физического адреса в RAM, но это имеет расположение в подкачке).
  • 0xc0000000..0xdfffffff: физическая память. Указатель в этом диапазоне представляет физический адрес p-0xc0000000. Интерпретация этого указателя на самом деле не зависит от MMU.
  • 0xe0000000..0xffefffff: освобожденный. Указатель в этом диапазоне недопустим.
  • 0xff000000..0xffffffff: память ядра. Это - указатель в код ядра или данные. Страница в этом диапазоне имеет связанный физический адрес, найденный MMU.

Я нашел, что Драйверы устройств Linux хорошее введение во внутренности ядра Linux. В конечном счете можно хотеть обратиться к источнику.

1
27.01.2020, 20:41
  • 1
    Я "отсутствовал" на ZONE_HIGHMEM здесь? Как это становится решительным, сколько из физической памяти переходит к ZONE_NORMAL и сколько переходит к ZONE_HIGHMEM? –  TheLoneJoker 26.12.2010, 19:24
  • 2
    @TheLoneJoker: система в Вашем вопросе не имеет верхней памяти, таким образом, мой ответ не обратился к этой сложности. –  Gilles 'SO- stop being evil' 27.12.2010, 14:12

Теги

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