Intereting Posts
Как stdin обрабатывается в этом сценарии bash? Изменение части строки в сценарии bash sshfs – конечная точка транспорта не подключена Как использовать / dev / fb0 в качестве консоли из пользовательского пространства или выводить на нее текст Начать песню с определенного времени в ритм-боксе с помощью командной строки Как я могу установить кнопку питания (на корпусе компьютера) для выключения системы с помощью `systemd`? AFP Client (afpfs-ng) ls: чтение каталога.: Ошибка ввода / вывода, CentOS 7 и MacOS Sierra В чем разница между «расширенным» разделом и «логическим» разделом Сделать доступным только для чтения каталог для других пользователей Как передать переменную скрипту KSH с CGI? Как заменить каждое вхождение строки инкрементным счетчиком в vim? Nagios использует sendmail, новый почтовый сервер, необходимо изменить SMTP-сервер Как вставить запятую в указанное место? Почему я не могу найти аппаратное кеш-событие в моем перфомансе? / var в логическом томе ISCSI

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

Просматривая «Выход 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, … и т. Д.) Вкратце (если больше сомнений, я отправлю каждый из них как отдельный вопрос)?

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

Во-первых, 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 kB).


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

 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