Что подразумевает расположение памяти виртуального ядра в dmesg?

19

Проходя через «Вывод dmesg», я мог видеть список значений, которые я не могу правильно понять.

Memory: 2047804k/2086248k available (3179k kernel code, 37232k reserved, 1935k data, 436k init, 1176944k highmem)
virtual kernel memory layout:
    fixmap  : 0xffc57000 - 0xfffff000   (3744 kB)
    pkmap   : 0xff800000 - 0xffa00000   (2048 kB)
    vmalloc : 0xf7ffe000 - 0xff7fe000   ( 120 MB)
    lowmem  : 0xc0000000 - 0xf77fe000   ( 887 MB)
      .init : 0xc0906000 - 0xc0973000   ( 436 kB)
      .data : 0xc071ae6a - 0xc08feb78   (1935 kB)
      .text : 0xc0400000 - 0xc071ae6a   (3179 kB)

Из значений я понимаю, что у меня 2 ГБ ОЗУ (физическая память). Но остальное кажется мне Волшебными числами.

Я хотел бы узнать о каждом из них (fixmap, pkmap, ... и т. Д.) Вкратце (если есть сомнения, я опубликую каждый из них как отдельный вопрос)?

Может ли кто-нибудь объяснить мне это?

сен
источник

Ответы:

22

Во-первых, 32-битная система имеет 0xffffffff( 4'294'967'295) линейные адреса для доступа к физическому расположению поверх ОЗУ.
Ядро делит эти адреса на пространство пользователя и ядра.

Пользовательское пространство (большой объем памяти) может быть доступно пользователю и, при необходимости, также ядру.
Диапазон адресов в шестнадцатеричном и десятичном виде:

0x00000000 - 0xbfffffff
0 - 3'221'225'471

Пространство ядра (нехватка памяти) доступно только ядру.
Диапазон адресов в шестнадцатеричном и десятичном виде:

0xc0000000 - 0xffffffff
3'221'225'472 - 4'294'967'295

Как это:

0x00000000             0xc0000000  0xffffffff 
    |                        |          |
    +------------------------+----------+
    |  User                  |  Kernel  |
    |  space                 |  space   |
    +------------------------+----------+

Таким образом, расположение памяти, которое вы видели, dmesgсоответствует отображению линейных адресов в пространстве ядра.

Во-первых, последовательности .text, .data и .init, которые обеспечивают инициализацию собственных таблиц страниц ядра (переводят линейные в физические адреса).

.text : 0xc0400000 - 0xc071ae6a   (3179 kB)

Диапазон, в котором находится код ядра.

.data : 0xc071ae6a - 0xc08feb78   (1935 kB)

Диапазон, в котором находятся сегменты данных ядра.

.init : 0xc0906000 - 0xc0973000   ( 436 kB)

Диапазон, в котором находятся исходные таблицы страниц ядра.

(и еще 128 кБ для некоторых динамических структур данных.)

Это минимальное адресное пространство достаточно велико, чтобы установить ядро ​​в ОЗУ и инициализировать его основные структуры данных.

Их используемый размер указан в скобках, например, код ядра:

0xc071ae6a - 0xc0400000 = 31AE6A

В десятичной записи это 3'255'914(3179 кБ).


Во-вторых, использование пространства ядра после инициализации

lowmem  : 0xc0000000 - 0xf77fe000   ( 887 MB)

Диапазон низких значений может использоваться ядром для прямого доступа к физическим адресам.
Это не полный 1 ГБ, потому что ядру всегда требуется как минимум 128 МБ линейных адресов для реализации непрерывного распределения памяти и фиксированных линейных адресов.

vmalloc : 0xf7ffe000 - 0xff7fe000   ( 120 MB)

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

pkmap   : 0xff800000 - 0xffa00000   (2048 kB)

Постоянное отображение ядра позволяет ядру устанавливать долговременные отображения кадров страниц с большим объемом памяти в адресное пространство ядра. Когда страница HIGHMEM отображается с помощью kmap (), отсюда назначаются виртуальные адреса.

fixmap  : 0xffc57000 - 0xfffff000   (3744 kB)

Это линейные адреса с фиксированным сопоставлением, которые могут ссылаться на любой физический адрес в ОЗУ, а не только на последние 1 ГБ, как адреса младших элементов. Линейные адреса с фиксированным отображением немного более эффективны, чем их коллеги из lowmem и pkmap. Существуют выделенные дескрипторы таблицы страниц, назначенные для фиксированного отображения, и отсюда выделены отображения страниц HIGHMEM с использованием kmap_atomic.


Если вы хотите погрузиться глубже в кроличью нору:
Понимание ядра Linux

шутник
источник
Спасибо за этот отличный ответ. Я хотел бы знать, почему low mem не заполнен 1 ГБ и больше о следующей части предложения «потому что ядру всегда требуется как минимум 128 МБ линейных адресов для реализации непрерывного распределения памяти и линейных адресов с фиксированным отображением».
Сен
Ядро имеет для высокоуровневого кода доступа к памяти время от времени (ФЭ биоса и ACPI информация находятся на первом МБ ОЗУ), он не может сделать это непосредственно (например , область Lowmem), поэтому ему нужно сопоставить с низким уровнем памяти линейные адреса большой памяти, 128 МБ зарезервированы только для этой цели. Область vmalloc в основном временно отображается в некоторые области с высокой памятью и довольно быстро перераспределяется.
вилять
Таким образом, страницы, настроенные ядром для вызова виртуальной системы, также являются частью fixmap ??? Я столкнулся с этим вопросом, потому что я хочу знать, что именно лежит на странице с адресом fffb5000, fffa1000 и т. Д. ... Я получаю накладные расходы при воспроизведении записей моей виртуальной машины, потому что многие виртуальные процессоры получают доступ к этой странице МНОГО .... как сделать Я знаю, что именно в этом адресе ... БОЛЬШОЙ ОТВЕТ кстати :)
Deepthought