Kwaikwayon Linus Torvalds: Createirƙiri tsarin aikinku daga karce (IV)

Barka da sake dawowa cikin wannan jerin sakonnin mai taken "Yin koyi da Linus Torvalds". A yau zamu ga GDT. Da farko dole ne mu ga menene GDT. A cewar Wikipedia:

The Teburin Shafin Duniya or GDT tsarin bayanai ne wanda ake amfani dashi Intel x86-mai sarrafa iyali wanda ya fara da 80286 don ayyana halaye na wurare daban-daban na ƙwaƙwalwar da aka yi amfani da su yayin aiwatar da shirin, gami da adireshin tushe, girman da damar samun dama kamar aiwatarwa da rubutu

Abin da aka fassara zai zama Table Descriptor na Duniya, tsarin bayanai da aka yi amfani da su a cikin Intel x86 masu sarrafawa tun daga 80286 don ayyana halaye na wurare daban-daban na ƙwaƙwalwar da aka yi amfani da su yayin aiwatar da shirin.

A takaice, idan muna amfani da Intel x86 processor, dole ne mu ayyana GDT don amfanin ƙwaƙwalwar ajiya daidai. Ba za mu yi wahala da yawa ba kuma za mu bayyana abubuwan shigar 3 a cikin tebur:

  • Shigar da NULL, ana buƙata don kowane tebur.
  • Tikiti don sashe data, za mu yi amfani da matsakaicin, wanda a cikin 32 ragowa 4 GB ne.
  • Tikiti don sashe code, za mu yi amfani da matsakaicin, wanda a cikin 32 ragowa 4 GB ne.

Kamar yadda kake gani, bayanai da lambar za suyi amfani da sarari iri ɗaya. Yayi, yanzu zamu aiwatar dashi. Don wannan zamuyi amfani da tsari guda biyu, na farko zai kasance mai kula da ƙunshin bayanai zuwa ainihin bayanan GDT ɗin mu. Kuma na biyu zai zama tsararru tare da shigarwar GDT. Bari mu bayyana su da farko

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));

Wataƙila kun lura da sha'awar __wajan __ ((cike)) a ƙarshen tsarin. Wannan yana gaya wa GCC kada ta inganta tsarin saboda abin da muke so shine mika bayanai kamar yadda yake ga mai sarrafawa. Yanzu zamuyi aiki don girka GDT. Kafin ya kamata mu bayyana tsarin, yanzu za mu fara su.

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;
}

Don haka zamu iya gina maɓallin da ke zuwa teburin mu na shigar da abubuwa 3.

Idan ka tara amfani da rago 64 zai iya faduwa anan. Wannan saboda masu nuni akan tsarin 64-bit a bayyane suke 64-bit kuma muna amfani da nau'ikan 32-bit anan. Amfani da zaɓi -m32 na iya taimakawa a yanzu
Yanzu muna ayyana aiki na gama gari don sanya bayanai a cikin abubuwan shigarwa

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;
}

Kuma muna kiran sa sau 3 daga aikin girkawa

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 */

A ƙarshe, dole ne mu gaya wa mai sarrafawa cewa muna da GDT, don ta iya ɗora shi, kuma a wurinmu lokacin ɗora kernel tare da GRUB, sake rubuta GRUB GDT. Don ɗora GDT akwai umarni a cikin asm da ake kira lgdt (ko lgdtl ya danganta da rubutun), za mu yi amfani da shi.

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"
);

To da zarar mun gama wannan tsarin namu zai riga ya sami GDT. A babi na gaba zamu ga IDT, tebur mai kama da GDT amma tare da katsewa. Na sanya wasu matsayi da sakonnin tabbaci tare da GDT don haka NextDivel yanzu yayi kama da wannan:

NextDivel-GDT


5 comments, bar naka

Bar tsokaci

Your email address ba za a buga. Bukata filayen suna alama da *

*

*

  1. Wanda ke da alhakin bayanan: Miguel Ángel Gatón
  2. Manufar bayanan: Sarrafa SPAM, sarrafa sharhi.
  3. Halacci: Yarda da yarda
  4. Sadarwar bayanan: Ba za a sanar da wasu bayanan ga wasu kamfanoni ba sai ta hanyar wajibcin doka.
  5. Ajiye bayanai: Bayanin yanar gizo wanda Occentus Networks (EU) suka dauki nauyi
  6. Hakkoki: A kowane lokaci zaka iyakance, dawo da share bayanan ka.

  1.   Saron m

    Zai yiwu tsarin 64-bit yafi dacewa da waɗannan lokutan, baya baya ne don ci gaba da amfani da 8086.

    1.    AdrianArroyoStreet m

      Na kasance ina neman bayanai akan GDT a cikin x86_64 kuma ina tsammanin ya bi tsohuwar ƙirar tare da tuta ta musamman. Har yanzu ana amfani da adreshin mai ɗan bit 32. Yanzu ban san ainihin yadda zan yi shi daidai ba. Wasu hanyoyin:
      http://wiki.osdev.org/Entering_Long_Mode_Directly
      http://f.osdev.org/viewtopic.php?f=1&t=16275

  2.   geronimo m

    Na farko yana da kyau gudummawar ku, amma ina ganin taken yakamata ya kasance
    "Koyi Richard Stallman" ko kuma a'a ina ganin haka ,,,
    gaisuwa

    1.    abimaelmartell m

      Linus ya ƙirƙiri kwayar Linux, Stallman ya ƙirƙiri GNU waɗanda sune kayan aikin Unix da umarni.

      Take ya dace saboda kana ƙirƙirar cibiya.

      Na gode!

  3.   Ruby m

    Na gode matuka da amsa dukkan tambayoyina da kuma yin haƙuri, kawai nasan asalin a matsayin mai haɗawa kuma ban san komai game da C ba, amma ina son shi sosai, yanzu na ɗan rikice da GDT, bari mu gani ko na fahimta.

    GDT zai sami 'masu siffantawa' na duniya waɗanda kowane shiri zai iya samun damar su koyaushe, kuma waɗannan masu bayanin suna nuna sassan inda (shirin) za a aiwatar? ko kuma akasin haka.