Записи TSS для коммутации стека - PullRequest
0 голосов
/ 04 апреля 2020

Я прочитал, что TSS содержит информацию о регистрах и т. Д. c. Прямо сейчас я пытаюсь осуществить переход с ядра на пользовательский режим и обратно. Я прочитал руководство по Intel 80386 и искал этот ресурс: http://www.brokenthorn.com/Resources/OSDev23.html для общего рабочего процесса. Они делают это:

void install_tss (uint32_t idx, uint16_t kernelSS, uint16_t kernelESP) {

    //! install TSS descriptor
    uint32_t base = (uint32_t) &TSS;
    gdt_set_descriptor (idx, base, base + sizeof (tss_entry),
        I86_GDT_DESC_ACCESS|I86_GDT_DESC_EXEC_CODE|I86_GDT_DESC_DPL|I86_GDT_DESC_MEMORY,
        0);

    //! initialize TSS
    memset ((void*) &TSS, 0, sizeof (tss_entry));

    TSS.ss0 = kernelSS;
    TSS.esp0 = kernelESP;

    TSS.cs=0x0b;
    TSS.ss = 0x13;
    TSS.es = 0x13;
    TSS.ds = 0x13;
    TSS.fs = 0x13;
    TSS.gs = 0x13;

    //! flush tss
    flush_tss (idx * sizeof (gdt_descriptor));
}

Я не совсем понимаю, почему RPL = 3

В моем случае, когда я нахожусь в режиме пользователя и хочу использовать шлюз-ловушка для перехода в режим ядра, сегмент cs в шлюзе-ловушке будет иметь RPL 0 (последние 2 бита 16-битного сегмента), а запись GDT, соответствующая сегменту cs, также будет иметь DPL 0. И я прочитал что межуровневый переключатель привилегий переключает стеки (только ??), глядя на TSS. Я предполагаю, что приведенный выше фрагмент кода должен иметь TSS.ss = 0x10.

Примечание: мы предполагаем, что classi c 0x08 = код ядра, 0x10 = данные ядра, .... Структура GDT здесь

1 Ответ

3 голосов
/ 04 апреля 2020

Структура TSS имеет много полей, которые используются для переключения аппаратных задач (например, TSS.ss, где содержимое регистра ss будет сохранено / загружено, если произойдет переключение аппаратной задачи), плюс несколько полей. которые используются для переключения задачи на более высокий уровень привилегий (например, (e.g. TSS.ss0` для переключения на CPL = 0).

Вы просматриваете поля, которые используются для переключения аппаратной задачи ( что, как правило, не стоит беспокоиться, потому что вместо этого быстрее переключать программные задачи), и я предполагаю, что кто-то добавил туда значения «совместимых с аппаратным переключателем задач» (даже если они не используются), чтобы избежать неинициализированных значений.

Вместо этого вы хотите просмотреть поля TSS.esp0 и TSS.ss0 TSS, которые являются единственными 2 полями TSS, которые имеют значение для переключения на CPL = 0 (и могут быть единственными 2 поля TSS, которые вы когда-либо использовали).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...