Кажется, вы говорите о 32-битных системах x86, верно?
Если я не ошибаюсь, ядро можно настроить не только для распределения памяти 3Gb / 1Gb, возможны и другие варианты (например, 2Gb / 2Gb).Тем не менее, 3Gb / 1Gb, вероятно, является наиболее распространенным на x86-32.
Часть адреса пространства ядра должна быть недоступна из пространства пользователя.С точки зрения ядра, да, отображение памяти, занимаемой самим ядром, всегда одинаково.Неважно, в контексте какого процесса (или обработчика прерываний, или чего-либо еще) работает ядро.
В качестве одного из следствий, если вы посмотрите на адреса символов ядра в /proc/kallsyms
из разных процессов, вы будете видеть одни и те же адреса каждый раз.И это в точности адреса соответствующих функций ядра, переменных и других с точки зрения ядра.
Итак, я полагаю, ответ на ваш первый вопрос - «да», но, вероятно, он не очень полезен длякод пользовательского пространства как память пространства ядра в любом случае напрямую не доступен оттуда.
Что касается второго вопроса, хорошо, если ядро в настоящее время работает в контексте какого-либо процесса, оно может фактически получить доступ к пользователюПространственная память об этом процессе.Я не могу описать это подробно, но, вероятно, реализация функций ядра copy_from_user
и copy_to_user
может дать вам несколько советов.Смотрите arch/x86/lib/usercopy_32.c
и arch/x86/include/asm/uaccess.h
в исходниках ядра.Кажется, в x86-32 доступ к памяти пользовательского пространства осуществляется непосредственно в этих функциях с использованием отображений памяти по умолчанию для текущего контекста процесса.«Волшебные» вещи там связаны только с оптимизацией и проверкой адреса области памяти на правильность.