Я прочитал, что 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 здесь