A ’dèanamh atharrais air Linus Torvalds: Cruthaich an siostam obrachaidh agad fhèin bhon toiseach (IV)

Fàilte air ais chun t-sreath dhreuchdan seo leis an tiotal "Emulating Linus Torvalds". An-diugh chì sinn an GDT. An toiseach feumaidh sinn faicinn dè a th ’anns an GDT. A rèir Wikipedia:

Tha Clàr tuairisgeul cruinne or GDT na structar dàta air a chleachdadh le Intel x86-family pròiseasairean a ’tòiseachadh leis an 80286 gus feartan nan diofar raointean cuimhne a chaidh a chleachdadh aig àm cur an gnìomh a ’phrògraim a mhìneachadh, a’ gabhail a-steach seòladh a ’bhunait, meud agus sochairean ruigsinneachd leithid gnìomh agus sgrìobhadh

Is e an rud a bhiodh air eadar-theangachadh Clàr Tuairisgeul Cruinneil, structar dàta a chaidh a chleachdadh ann am pròiseasairean Intel x86 bho 80286 gus feartan diofar raointean cuimhne a chleachdadh nuair a chaidh am prògram a thoirt gu buil.

Ann an geàrr-chunntas, ma tha sinn a ’cleachdadh pròiseasar Intel x86, feumaidh sinn GDT a mhìneachadh airson cleachdadh ceart de chuimhne. Chan eil sinn a ’dol a dhèanamh mòran toinnte agus tha sinn a’ dol a mhìneachadh 3 inntrigidhean sa chlàr:

  • Inntrigeadh NULL, riatanach airson a h-uile clàr.
  • Tiogaid airson na h-earrainn dàta, cleachdaidh sinn a ’char as àirde, a tha ann an 32 buillean 4 GB.
  • Tiogaid airson na h-earrainn code, cleachdaidh sinn a ’char as àirde, a tha ann an 32 buillean 4 GB.

Mar a chì thu, cleachdaidh dàta agus còd an aon àite. Glè mhath, a-nis tha sinn a ’dol a bhuileachadh. Airson seo cleachdaidh sinn dà structar, bidh a ’chiad fhear os cionn a bhith a’ toirt a-steach comharradh gu fìor dhàta an GDT againn. Agus an dàrna fear bidh sreath le inntrigidhean GDT. Bheir sinn mìneachadh dhaibh an toiseach

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

Is dòcha gu bheil thu air mothachadh __attribute __ ((pacaichte) neònach) aig deireadh nan structaran. Tha seo ag innse don GCC gun a bhith a ’dèanamh na structaran as fheàrr oir is e na tha sinn ag iarraidh an dàta a thoirt seachad mar a tha e don phròiseasar. A-nis tha sinn a ’dol a dhèanamh gnìomh gus an GDT a stàladh. Mus bu chòir dhuinn a bhith air na structaran ainmeachadh, a-nis tha sinn gu bhith gan tòiseachadh.

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

Mar sin bidh sinn a ’faighinn togail air a’ phuing a thèid chun bhòrd 3-steach againn.

Ma chuireas tu ri chèile le bhith a ’cleachdadh 64 buillean is dòcha gum fàillig e an seo. Tha seo air sgàth gu bheil comharran air siostaman 64-bit gu follaiseach 64-bit agus tha sinn a ’cleachdadh seòrsaichean 32-bit an seo. Is dòcha gun cuidich cleachdadh an roghainn -m32 airson a-nis
A-nis tha sinn a ’mìneachadh gnìomh cumanta gus an dàta a chuir a-steach

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

Agus is e 3 uair a chanas sinn ris bhon ghnìomh stàlaidh

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

Mu dheireadh feumaidh sinn innse don phròiseasar gu bheil GDT againn, gus an urrainn dha a luchdachadh, agus sa chùis againn nuair a bhios tu a ’luchdachadh an kernel le GRUB, cuir thairis an GRUB GDT. Gus an GDT a luchdachadh tha stiùireadh ann an asm ris an canar lgdt (no lgdtl a rèir an t-siostaim), tha sinn a ’dol a chleachdadh.

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

Uill aon uair ‘s gu bheil sinn deiseil den seo bidh GDT aig an t-siostam againn mu thràth. Anns an ath chaibideil chì sinn an IDT, clàr glè choltach ris an GDT ach le briseadh a-steach. Tha mi air cuid de theachdaireachdan inbhe is dearbhaidh a chuir leis an GDT agus mar sin tha NextDivel a-nis a ’coimhead mar seo:

An ath-Divel-GDT


Tha susbaint an artaigil a ’cumail ri na prionnsapalan againn de moraltachd deasachaidh. Gus aithris a dhèanamh air mearachd cliog an seo.

5 bheachd, fàg do chuid fhèin

Fàg do bheachd

Seòladh-d cha tèid fhoillseachadh.

*

*

  1. Uallach airson an dàta: Miguel Ángel Gatón
  2. Adhbhar an dàta: Smachd air SPAM, riaghladh bheachdan.
  3. Dìleab: Do chead
  4. Conaltradh an dàta: Cha tèid an dàta a thoirt do threas phàrtaidhean ach a-mhàin fo dhleastanas laghail.
  5. Stòradh dàta: Stòr-dàta air a chumail le Occentus Networks (EU)
  6. Còraichean: Aig àm sam bith faodaidh tu am fiosrachadh agad a chuingealachadh, fhaighinn air ais agus a dhubhadh às.

  1.   saeron thuirt

    Is dòcha gu bheil structar 64-bit nas freagarraiche airson na h-amannan sin, tha e na chùl-raon airson leantainn air adhart a ’cleachdadh an 8086.

    1.    AdrianArroyoStreet thuirt

      Tha mi air a bhith a ’coimhead airson fiosrachadh mu GDT ann an x86_64 agus tha mi a’ smaoineachadh gu bheil e a ’leantainn an t-seann mhodail le bratach sònraichte. Tha seòladh 32-bit fhathast air a chleachdadh. A-nis chan eil fios agam gu cinnteach ciamar a nì mi e gu ceart. Nithean ceanglaichean:
      http://wiki.osdev.org/Entering_Long_Mode_Directly
      http://f.osdev.org/viewtopic.php?f=1&t=16275

  2.   geronimo thuirt

    A ’chiad rud fìor mhath na tabhartasan agad, ach tha mi a’ smaoineachadh gum bu chòir an tiotal a bhith
    "Emulating Richard Stallman" no co-dhiù tha mi a ’smaoineachadh sin ,,,
    Tapadh leibh!

    1.    abimaelmartell thuirt

      Chruthaich Linus an kernel Linux, chruthaich Stallman GNU a tha nan innealan agus òrdughan Unix.

      Tha an tiotal iomchaidh oir tha thu a ’cruthachadh niuclas.

      Tapadh leibh!

  3.   Ruby thuirt

    Mòran taing airson mo cheistean gu lèir a fhreagairt agus a bhith foighidneach, chan eil fios agam ach air na rudan bunaiteach mar neach-cruinneachaidh agus chan eil fios agam cha mhòr mu dheidhinn C, ach is toil leam e, a-nis tha mi beagan troimh-chèile leis an GDT, feuch am faic mi a bheil mi tuigsinn.

    Bidh an GDT a ’dol a dh’ iarraidh na ‘tuairisgeulan’ cruinneil a gheibh prògram sam bith an-còmhnaidh, agus tha na tuairisgeulan sin a ’comharrachadh nan earrannan far a bheil e (am prògram) gu bhith air a chur gu bàs? no tha e air dhòigh eile.