Ядро ОС Linux

       

Макросы, используемые при установке дескрипторов


В sched.h и system.h определены несколько ассемблерных макросов для простого доступа и установки дескрипторов. Каждый вход TSS и LDT занимает 8 байт.

Манипулирование GDT дескрипторами системы:

  • _TSS(n)

    _LDT(n) предоставляют индекс в GDT для n-ой задачи.

  • _LDT(n) загружается в поле ldt структуры tss_struct при распараллеливании.
  • _set_tssldt_desc(n, addr, limit, type)

    ulong*n указывает на вход GDT для установки (см. fork.c).

  • База сегмента (TSS или LDT) устанавливается в 0хс0000000 + addr. Вот специфичные экземпляры описанного выше, где ltypy ссылается на байт, содержащий P, DPL, S, и тип:

    set_ldt_desc(n,addr) ltype=0x82

    P=1, DPL=0, S=0, type=2 означает вход LDT. limit=23=? пространство для 3 дескрипторов сегмента

    set_ldt_desc(n,addr) ltype=0x89

    P=1, DPL=0, S=0, type=9 означает доступный 80386 TSS limit=231 пространство для 1 tss_struct

  • load_TR(n), load_ldt(n) загружает дескрипторы для задачи с номером n в регистр задачи и ldt регистр.
  • ulong get_base(struct desk_struct ldt) берет базу из дескриптора
  • ulong get_limit (ulong segment) берет ограничение (размер) из селектора сегмента. Возвращает размер сегмента в байтах.
  • set_base(struct desk_struct ldt, ulong base), set_base(struct desk_struct ldt, ulong limit)

    Установит базу и ограничения для дескрипторов (4К неделимых сегментов). Ограничением здесь является действительно существующий размер сегмента в байтах.

  • _set_seg_desc(gate_addr, type, dpl, base, limit)
  • Значения по умолчанию 0х00408000 = ? D=1,P=1,G=0 В данный момент рабочий размер 32 бита и максимальный размер 1М. gate_addr должен быть (ulong*)



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