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.
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:
Zai yiwu tsarin 64-bit yafi dacewa da waɗannan lokutan, baya baya ne don ci gaba da amfani da 8086.
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
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
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!
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.