x86 Çalışma Modları
CPU başladığı zaman Real Mode ile başlar sonrasında protected mode'a geçirilmesi için belli işlemlerin yapılması gerekir. Bunlar:
Ringler
Ring 0'da OS seviyesinde işlemler yapılır. Bazı instructionlar sadece Ring 0 seviyesinde çalıştırılabilir. Örneğin
LGDT
,
cli
gibi. Ring 3 seviyesinde user uygulamaları çalışır. Burada işletim sistemini etkileyebilecek instructionların çalıştırılmasına izin verilmez.
Anlık çalışan processin ring bilgisini CS registerının ilk iki bitine bakarak anlayabiliriz. Bu bitler CPL i gösterir.
void GetRingInfo(void) {
xm_u64_t rcs = 0;
__asm__ __volatile__ ("mov %%cs, %0" : "=r" (rcs));
kprintf("%d\n", (xm_s32_t) (rcs & 3));
}
Ring Seviyesini Nasıl Değiştiririz
x86 mimarisinde ring seviyesini değiştirmek için belirli bir instruction yoktur. Bunun yerine interrupt'dan dönüş yaparak ring seviyesini değiştirmek mümkün olmaktadır. Bu işlemi gerçekleştirmek için de
iret
instruction'ını kullanabiliriz.
iret
instruction'ını nı ring seviyesi değiştirmek için kullanacaksak belirli değişkenleri stack'e atmamız gerekecek. bunların listesi:
asm volatile(" \
cli; \
mov %esp, %eax; \
pushl $0x23; \
pushl %eax; \
pushf; \
pushl $0x1B; \
push $1f; \
mov $0x23, %ax; \
mov %ax, %ds; \
mov %ax, %es; \
mov %ax, %fs; \
mov %ax, %gs; \
\
iret; \
1: \
jmp 1b;
");
Referanslar