Почему базовые адреса из 4 сегментов идентичны в ядре Linux? - PullRequest
1 голос
/ 29 декабря 2010

__ USER_CS, __ KERNEL_CS, __ USER_DS, __ KERNEL_DS, все имеют base = 0x00000000 и предел = 0xfffff. Я не могу понять, что эти линейные адреса будут давать идентичные физические адреса (Я думаю, что я могу ошибаться здесь). Сгенерированный линейный адрес (то есть физический адрес) будет одинаковым во всех случаях, что означает, что структуры пользователя и ядра хранятся в одном и том же месте. Кроме того, объясните мне, как, вопреки всему этому, мы говорим, что структуры ядра хранятся в верхних 1 ГБ, а пользовательские структуры хранятся в нижних 3 ГБ.

Просьба указать мои ошибки в понимании разбиения на страницы и сегментации. Спасибо.

Ответы [ 2 ]

2 голосов
/ 29 декабря 2010

Вы ошибаетесь, полагая, что линейный адрес сопоставляется с физическими адресами в формате 1: 1.Вместо этого происходит то, что таблицы страниц используются для сопоставления линейных адресов с физическими адресами.Каждый процесс имеет свой набор таблиц страниц, обеспечивающих разделение адресов и виртуальную память.В пространстве ядра таблицы страниц первых 3 ГБ указывают на «виртуальные» адреса;последний ГБ отображается в формате 1: 1 с физическими адресами (в некоторых конфигурациях).Защита страниц режима ядра достигается (не) установкой бита доступа USER в записи таблицы страниц.

0 голосов
/ 29 декабря 2010

О какой платформе вы говорите? Для x86 они все разные (от arch/x86/include/asm/segment.h):

#define __KERNEL_CS     (GDT_ENTRY_KERNEL_CS * 8)
#define __KERNEL_DS     (GDT_ENTRY_KERNEL_DS * 8)
#define __USER_DS     (GDT_ENTRY_DEFAULT_USER_DS* 8 + 3)
#define __USER_CS     (GDT_ENTRY_DEFAULT_USER_CS* 8 + 3)

и

  #define GDT_ENTRY_DEFAULT_USER_CS       14
  #define GDT_ENTRY_DEFAULT_USER_DS       15
  #define GDT_ENTRY_KERNEL_BASE   12
  #define GDT_ENTRY_KERNEL_CS             (GDT_ENTRY_KERNEL_BASE + 0)
  #define GDT_ENTRY_KERNEL_DS             (GDT_ENTRY_KERNEL_BASE + 1)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...