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
This was the end of the blog post. You can reach me via email umusasadik at gmail com