Ядро ОС Linux

       

чтобы через сегментный регистр задать


Селектор сегмента загружается в сегментный регистр (cs, ds и т.д.), чтобы через сегментный регистр задать один из обычных сегментов в системе как один адрес.

Формат селектора сегмента: 15 3 2 1 0 индекс TI RPL

TI - индикатор таблицы:

0 означает, что индексы селектора относятся к GDT 1 означает, что индексы селектора относятся к LDT

RPL - привилегированный уровень. Linux использует только два привилегированных уровня

0 означает ядро 1 означает пользователя

Примеры:

Сегмент кода ядра:

TI = 0, индекс = 1, RPL = 0 поэтому сектор = 0х08 (GDT[1])

Сегмент данных пользователя

TI = 1, индекс = 2, RPL = 3 поэтому сектор = 0х17 (LDT[2])

Cелекторы, используемые в Linux:

TI index RPL selector segment 0 1 0 0x08 код ядра GDT[1] 0 2 0 0x10 данные/стек ядра GDT[2] 0 3 0 ??? ??? GDT[3] 1 1 3 0x0F код пользователя LDT[1] 1 2 3 0x17 данные/стек пользователя LDT[2]

Селекторы для сегментов системы не предназначены для прямой загрузки в сегментные регистры. Напротив, должны быть загружены TR или LDTR.

На входе системного вызова:

  • ds и es устанавливаются на сегмент данных ядра (0х10)
  • fs устанавливается на сегмент данных пользователя (0х17) и используется для доступа к данным, на которые указывают аргументы системного вызова
  • Указатель на вершину и сегмент стека автоматически устанавливаются в ss0 по прерыванию и старые значения восстанавливаются при возврате из системного вызова.



  • Содержание раздела