Intereting Posts
c параметры функции порядок оценки регулярные выражения в C совпадении и печати Копирование аргументов командной строки в массив segmentation fault из-за функции initialize () при изменении размера огромного выделения страницы Является ли вилка (предположительно) безопасной от обработчиков сигналов в многопоточной программе? Возможно ли, что переменная, объявленная после основного, имеет размер файла? Как объявить размер массива во время выполнения в C? Вставка имени и номера в конец связанного списка Фортран производные типы, содержащие указатели для доступа из C Язык OpenMPI C scanf не прекращает принимать входные данные (Mac OS X 10.10) GNU Readline: как очистить строку ввода? Распечатайте массив, не зная размера выделять память в ядре пользователя из ядра Неопределенные символы для архитектуры x86_64 с использованием FFTW Найти количество блокировок задач на семафоре POSIX

Диапазон адресов виртуального адресного пространства Linux

Я на 32-битной машине. Из того, что я понимаю, адрес пространства пользователя находится в диапазоне от 0x00000000 до 0xbfffffff , а диапазон ядра от 0xc0000000 до 0xffffffff .

Но когда я использовал pmap для просмотра распределения памяти процесса, я вижу, что библиотека загружается примерно в 0xf7777777 . См. Прилагаемый скриншот. Означает ли это, что эти библиотеки загружаются в пространство ядра? И когда я использовал mmap() , я получил адрес от 0xe0000000 . Итак, mmap() получил память из пространства ядра?

введите описание изображения здесь

Я на 32-битной машине. Из того, что я понимаю, адрес пространства пользователя находится в диапазоне от 0x00000000 до 0xbfffffff, а диапазон ядра от 0xc0000000 до 0xffffffff.

Не совсем. Ядро памяти начинается с 0xC0000000 , но ему не нужно заполнять весь ГБ. Фактически, он заполняет виртуальный адрес 0xF7FFFFFF . Это охватывает 896MB физической памяти. Виртуальные адреса 0xF8000000 и выше используются в качестве 128MB windows для ядра для отображения любой области физической памяти за пределом 896MB .

Все пользовательские процессы используют одну и ту же карту памяти для виртуальных адресов 0xC0000000 и выше, поэтому, если kernel ​​не использует весь свой виртуальный объем GB, оно может повторно использовать его часть для сопоставления обычно используемых разделяемых библиотек, чтобы каждый процесс мог их видеть.