Прежде всего система на 32 бита имеет 0xffffffff
(4'294'967'295
) линейные адреса для доступа к физическому местоположению ontop RAM.
Ядро делит эти адреса на пространство ядра и пользователя.
К пространству пользователя (верхняя память) может получить доступ пользователь и, при необходимости, также ядром.
Диапазон адресов в шестнадцатеричном числе и нотации в декабре:
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 КБ для некоторых динамических структур данных.)
Это минимальное адресное пространство является просто достаточно большим, чтобы установить ядро в RAM и инициализировать ее базовые структуры данных.
Их используемый размер показывают в круглой скобке, возьмите, например, код ядра:
0xc071ae6a - 0xc0400000 = 31AE6A
В десятичной записи это 3'255'914
(3 179 КБ).
Во-вторых, использование пространства ядра после инициализации
lowmem : 0xc0000000 - 0xf77fe000 ( 887 MB)
Диапазон lowmem может использоваться ядром для прямого доступа к физическим адресам.
Это не полный 1 ГБ, потому что ядро всегда требует, чтобы по крайней мере 128 МБ линейных адресов реализовали выделение памяти, состоящее из нескольких несмежных участков, и отображенные на фиксацию линейные адреса.
vmalloc : 0xf7ffe000 - 0xff7fe000 ( 120 MB)
Выделение виртуальной памяти может выделить страничные блоки на основе схемы, состоящей из нескольких несмежных участков. Основное преимущество этой схемы состоит в том, чтобы избежать внешней фрагментации, это используется для областей подкачки, модулей ядра или выделения буферов к некоторым устройствам ввода-вывода.
pkmap : 0xff800000 - 0xffa00000 (2048 kB)
Постоянное отображение ядра позволяет ядру устанавливать длительные отображения страничных блоков верхней памяти в адресное пространство ядра. Когда страница HIGHMEM отображается с помощью kmap (), виртуальные адреса присвоены отсюда.
fixmap : 0xffc57000 - 0xfffff000 (3744 kB)
Они отображаются на фиксацию линейные адреса, которые могут относиться к любому физическому адресу в RAM, не только последний 1 ГБ как адреса lowmem. Отображенные на фиксацию линейные адреса немного более эффективны, чем их lowmem и pkmap коллеги. Существуют выделенные дескрипторы таблицы страниц, присвоенные для фиксированного отображения, и отображения страниц HIGHMEM с помощью kmap_atomic выделяются отсюда.
Если Вы хотите погрузиться глубже в кроличью нору:
Понимание ядра Linux
XkbOptions
обращается к правилу, определенному в файле правил XKB, обычно /usr/share/X11/xkb/rules/base
, который будет похож:
terminate:ctrl_alt_bksp = +terminate(ctrl_alt_bksp)
Это в свою очередь забирает определение из оконечного файла символов, обычно /usr/share/X11/xkb/symbols/terminate
. Я не уверен, можно ли просто добавить больше модификаторов к type="CTRL+ALT"
выровняйте там или если существуют пределы на значение типа.
Документация относительно настройки XKB может быть найдена по http://www.x.org/wiki/XKB и смочь помогать заполнить некоторые разрывы в этом ответе.