Ukulingisa i-Linus Torvalds: Dala uhlelo lwakho lokusebenza kusuka ekuqaleni (IV)

Siyakwamukela futhi kulolu chungechunge lwezikhala ezinesihloko esithi "Ukulingisa i-Linus Torvalds". Namuhla sizobona i-GDT. Okokuqala kufanele sibone ukuthi yini i-GDT. Ngokuya ngeWikipedia:

The Ithebula le-Global Descriptor or I-GDT isakhiwo sedatha esisetshenziswe ngu Intel x86Amaprosesa omndeni aqala nge- 80286 ukuze uchaze izici zezindawo ezahlukahlukene zememori ezisetshenziswe ngesikhathi kwenziwa uhlelo, kufaka phakathi ikheli lesisekelo, usayizi namalungelo okufinyelela njengokusebenzisa nokusebenza

Okuhumushiwe kungaba yi-Global Descriptor Table, isakhiwo sedatha esisetshenziswe kuma-processor we-Intel x86 kusukela ngo-80286 ukuchaza izici zezindawo zememori ezahlukahlukene ezisetshenziswe ngesikhathi kwenziwa uhlelo.

Ngokufingqa, uma sisebenzisa iprosesa ye-Intel x86, kufanele sichaze i-GDT yokusetshenziswa okulungile kwememori. Ngeke senze inkinga enkulu futhi sizochaza okufakiwe okungu-3 etafuleni:

  • Ukufakwa kwe-NULL, kuyadingeka kuwo wonke amatafula
  • Ithikithi lesigaba idatha, Sizosebenzisa okuphezulu, okuku-32 bits okungu-4 GB.
  • Ithikithi lesigaba Ikhodi, Sizosebenzisa okuphezulu, okuku-32 bits okungu-4 GB.

Njengoba ukwazi ukubona, idatha nekhodi kuzosebenzisa isikhala esifanayo. Kulungile, manje sizoyisebenzisa. Kulokhu sizosebenzisa izakhiwo ezimbili, owokuqala uzophatha ukuqukethe isikhombi semininingwane yangempela ye-GDT yethu. Futhi owesibili kuzoba uhlu oluningi nokufakiwe kwe-GDT. Ake sizichaze kuqala

struct Entry{
uint16_t limit_low;
uint16_t base_low;
uint8_t base_middle;
uint8_t access;
uint8_t granularity;
uint8_t base_high;
} __attribute__((packed));
struct Ptr{
uint16_t limit;
uint32_t base;
} __attribute__((packed));

Kungenzeka ukuthi uqaphele i- __attribute __ enelukuluku (ekugcineni) yezakhiwo. Lokhu kutshela i-GCC ukuthi ingazisebenzisi ngokwanele izakhiwo ngoba esikufunayo ukwedlulisa idatha njengoba injalo neprosesa. Manje sizokwenza umsebenzi ukufaka i-GDT. Ngaphambi kokuthi simemezele izakhiwo, manje sizoziqala.

struct ND::GDT::Entry gdt[3];
struct ND::GDT::Ptr gp;
void ND::GDT::Install()
{
gp.limit=(sizeof(struct ND::GDT::Entry)*3)-1;
gp.base=(uint32_t)&gdt;
}

Ngakho-ke sakha i-pointer eya etafuleni lethu lokufaka okungu-3.

Uma uhlanganisa usebenzisa izingcezu ezingama-64 kungenzeka zehluleke lapha. Lokhu kungenxa yokuthi izikhombisi ezinhlelweni ezingama-64-bit ngokusobala zingama-64-bit futhi sisebenzisa izinhlobo ezingama-32-bit lapha. Sebenzisa inketho -m32 kungasiza okwamanje
Manje sichaza umsebenzi ojwayelekile wokufaka idatha kokufakwayo

void ND::GDT::SetGate(int num, uint32_t base, uint32_t limit, uint8_t access,uint8_t gran)
{
gdt[num].base_low=(base & 0xFFFF);
gdt[num].base_middle=(base >> 16) & 0xFF;
gdt[num].base_high=(base >> 24) & 0xFF;
gdt[num].limit_low=(limit & 0xFFFF);
gdt[num].granularity=(limit >> 16) & 0x0F;
gdt[num].granularity |= (gran & 0xF0);
gdt[num].access=access;
}

Futhi sikubiza izikhathi ezi-3 kusuka emsebenzini wokufaka

ND::GDT::SetGate(0,0,0,0,0); /* NULL segmente entry */
ND::GDT::SetGate(1,0,0xFFFFFFFF,0x9A,0xCF); /* 4 GiB for Code Segment */
ND::GDT::SetGate(2,0,0xFFFFFFFF,0x92,0xCF); /* 4 GiB for Data segment */

Ekugcineni, kufanele sitshele iprosesa ukuthi sine-GDT, ukuze ikwazi ukuyilayisha, kuthi uma silayisha i-kernel ne-GRUB, bhala kabusha i-GRUB GDT. Ukulayisha i-GDT kunemiyalo ku-asm ebizwa nge-lgdt (noma i-lgdtl ngokuya nge-syntax), sizoyisebenzisa.

asm volatile("lgdtl (gp)");
asm volatile(
"movw $0x10, %ax \n"
"movw %ax, %ds \n"
"movw %ax, %es \n"
"movw %ax, %fs \n"
"movw %ax, %gs \n"
"movw %ax, %ss \n"
"ljmp $0x08, $next \n"
"next: \n"
);

Uma sesiqedile lolu hlelo lwethu seluzoba ne-GDT. Esahlukweni esilandelayo sizobona i-IDT, itafula elifana ncamashi ne-GDT kepha elinokuphazamiseka. Ngibeke imiyalezo ethile yesimo nokuqinisekisa nge-GDT ngakho-ke i-NextDivel manje ibukeka kanjena:

OlandelayoDivel-GDT


Amazwana ayi-5, shiya okwakho

Shiya umbono wakho

Ikheli lakho le ngeke ishicilelwe. Ezidingekayo ibhalwe nge *

*

*

  1. Ubhekele imininingwane: Miguel Ángel Gatón
  2. Inhloso yedatha: Lawula Ugaxekile, ukuphathwa kwamazwana.
  3. Ukusemthethweni: Imvume yakho
  4. Ukuxhumana kwemininingwane: Imininingwane ngeke idluliselwe kubantu besithathu ngaphandle kwesibopho esisemthethweni.
  5. Isitoreji sedatha: Idatabase ebanjwe yi-Occentus Networks (EU)
  6. Amalungelo: Nganoma yisiphi isikhathi ungakhawulela, uthole futhi ususe imininingwane yakho.

  1.   i-saeron kusho

    Mhlawumbe isakhiwo esingu-64-bit sizifanele lezi zikhathi, kungukubuyela emuva ukuqhubeka nokusebenzisa i-8086.

    1.    AdrianArroyoStreet kusho

      Kade ngifuna imininingwane ku-GDT ku-x86_64 futhi ngicabanga ukuthi ilandela imodeli yakudala nefulegi elikhethekile. Kusetshenziswa ikheli elingu-32-bit. Manje angazi kahle ukuthi ngikwenze kanjani kahle. Ezinye izixhumanisi:
      http://wiki.osdev.org/Entering_Long_Mode_Directly
      http://f.osdev.org/viewtopic.php?f=1&t=16275

  2.   i-geronimo kusho

    Owokuqala omuhle kakhulu umnikelo wakho, kepha ngicabanga ukuthi isihloko kufanele sibe
    "Ukulingisa uRichard Stallman" noma okungenani ngicabanga kanjalo ,,,
    Phendula ngokucaphuna

    1.    umabhebhana kusho

      ILinus idale i-Linux kernel, uStallman udale i-GNU okungamathuluzi nemiyalo ye-Unix.

      Isihloko kufanelekile ngoba udala i-nucleus.

      Ngikufisela okuhle!

  3.   Ruby kusho

    Ngiyabonga kakhulu ngokuphendula yonke imibuzo yami nokubekezela, ngazi kuphela okuyisisekelo njengesihlanganisi futhi angazi cishe lutho ngo-C, kepha ngiyathanda kakhulu, manje sengididekile ne-GDT, ake sibheke ukuthi qonda.

    I-GDT izoba 'nezincazelo' zomhlaba ezingatholwa yinoma yiluphi uhlelo, futhi lezi zincazelo zikhomba ezigabeni lapho (lolu hlelo) luzokwenziwa khona? noma kungenjalo.