x86 Ringler

2021-07-14 | Tags: #tubitak #os

x86 Çalışma Modları

  • Real Mode ⇒ direct mapping var, CR0 register'ı boş oluyor, bios subroutine'leri var
  • Unreal Mode
  • Sys Management Mode
  • Protected Mode => segmentation, rignler, virtual memory var, os subroutine
  • Long Mode

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:

  1. PE bitini aktif hale getirmek
  2. GDT (Global Descriptor Table) oluşturmak

Ringler

x86 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.

  • Current privilege level (CPL): Hali hazırda çalışan programın privilege levelini tutuyor.
  • Descriptor privilege level (DPL): segment veya gate'in privilege levelini tutuyor.
  • Requested privilege level (RPL):

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:

  • data selector
  • esp
  • flags
  • code selector
  • devam edilecek adres
 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

  • http://www.jamesmolloy.co.uk/tutorial_html/10.-User%20Mode.html

This was the end of the blog post. You can reach me via email umusasadik at gmail com