Emulating Linus Torvalds: Cruthaigh do chóras oibriúcháin féin ón tús (IV)

Fáilte ar ais chuig an tsraith post seo dar teideal "Emulating Linus Torvalds". Inniu feicfimid an GDT. Ar dtús ní mór dúinn a fheiceáil cad é an GDT. De réir Wikipedia:

An Tábla Tuairiscithe Domhanda or GDT is struchtúr sonraí a úsáideann Intel x86próiseálaithe -amamacha ag tosú leis an 80286 d’fhonn tréithe na réimsí cuimhne éagsúla a úsáideadh le linn chur i bhfeidhm an chláir a shainiú, lena n-áirítear seoladh an bhoinn, méid agus pribhléidí rochtana mar inrite agus in-inúsáidteacht

Is é a bheadh ​​i gceist le Tábla Tuairiscithe Domhanda, struchtúr sonraí a úsáideadh i bpróiseálaithe Intel x86 ó 80286 chun tréithe réimsí cuimhne éagsúla a úsáideadh le linn chur i bhfeidhm an chláir a shainiú.

I mbeagán focal, má tá próiseálaí Intel x86 á úsáid againn, ní mór dúinn GDT a shainiú chun cuimhne a úsáid i gceart. Nílimid chun mórán casta a dhéanamh agus táimid chun 3 iontráil sa tábla a shainiú:

  • Iontráil NULL, riachtanach do gach tábla.
  • Ticéad don rannóg dáta, úsáidfimid an t-uasmhéid, arb é 32 GB i 4 ghiotán é.
  • Ticéad don rannóg cód, úsáidfimid an t-uasmhéid, arb é 32 GB i 4 ghiotán é.

Mar a fheiceann tú, úsáidfidh sonraí agus cód an spás céanna. Ceart go leor, anois táimid chun é a chur i bhfeidhm. Chuige seo úsáidfimid dhá struchtúr, beidh an chéad cheann i gceannas ar phointeoir a bheith ann maidir le fíor-shonraí ár GDT. Agus an dara ceann beidh sraith leis na hiontrálacha GDT. Déanaimis iad a shainiú ar dtús

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

B’fhéidir gur thug tú __attribute aisteach ((pacáilte)) faoi deara ag deireadh na struchtúr. Insíonn sé seo don GCC gan na struchtúir a bharrfheabhsú toisc gurb é atá uainn ná na sonraí a chur ar aghaidh mar atá chuig an bpróiseálaí. Anois táimid chun feidhm a dhéanamh chun an GDT a shuiteáil. Sula mba cheart dúinn na struchtúir a dhearbhú, táimid chun iad a thionscnamh anois.

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 caithfimid an pointeoir a thógáil a théann chuig ár dtábla 3-ionchur.

Má thiomsaíonn tú trí ghiotán is dóichí go dteipfidh ort anseo. Tá sé seo toisc gur léir go bhfuil leideanna ar chórais 64-giotán 64-giotán agus táimid ag úsáid cineálacha 64-giotán anseo. D’fhéadfadh sé go gcabhródh úsáid na rogha -m32 as seo amach
Anois sainímid feidhm choiteann chun na sonraí a chur sna hionchuir

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 tugaimid é 3 huaire ón bhfeidhm suiteála

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

Faoi dheireadh, ní mór dúinn a rá leis an bpróiseálaí go bhfuil GDT againn, ionas gur féidir leis é a luchtú, agus inár gcás agus an t-eithne á luchtú le GRUB, déan an GRUB GDT a fhorscríobh. Chun an GDT a luchtú tá treoir in asm ar a dtugtar lgdt (nó lgdtl ag brath ar an gcomhréir), táimid chun é a úsáid.

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

Bhuel tar éis dúinn é seo a chríochnú beidh GDT ag ár gcóras cheana féin. Sa chéad chaibidil eile feicfimid an IDT, tábla an-chosúil leis an GDT ach le cur isteach. Chuir mé roinnt teachtaireachtaí stádais agus dearbhaithe leis an GDT agus mar sin tá an chuma ar NextDivel anois:

NextDivel-GDT


Cloíonn ábhar an ailt lenár bprionsabail eitic eagarthóireachta. Chun earráid a thuairisciú cliceáil anseo.

5 trácht, fág mise

Fág do thrácht

Ní thabharfar do sheoladh r-phoist a fhoilsiú. Réimsí riachtanacha atá marcáilte le *

*

*

  1. Freagrach as na sonraí: Miguel Ángel Gatón
  2. Cuspóir na sonraí: SPAM a rialú, bainistíocht trácht.
  3. Legitimation: Do thoiliú
  4. Na sonraí a chur in iúl: Ní chuirfear na sonraí in iúl do thríú páirtithe ach amháin trí oibleagáid dhlíthiúil.
  5. Stóráil sonraí: Bunachar sonraí arna óstáil ag Occentus Networks (EU)
  6. Cearta: Tráth ar bith is féidir leat do chuid faisnéise a theorannú, a aisghabháil agus a scriosadh.

  1.   Saeron a dúirt

    B’fhéidir go bhfuil struchtúr 64-giotán níos oiriúnaí do na hamanna seo, is moill é leanúint ar aghaidh ag úsáid an 8086.

    1.    AdrianArroyoStreet a dúirt

      Bhí mé ag lorg faisnéise ar GDT i x86_64 agus sílim go leanann sé an tsamhail sean le bratach speisialta. Úsáidtear seoladh 32-giotán fós. Anois níl a fhios agam go díreach conas é a dhéanamh i gceart. Roinnt naisc:
      http://wiki.osdev.org/Entering_Long_Mode_Directly
      http://f.osdev.org/viewtopic.php?f=1&t=16275

  2.   geronimo a dúirt

    Ar dtús báire, tá do chuid ranníocaíochtaí an-mhaith, ach is dóigh liom gur cheart go mbeadh an teideal
    "Emulating Richard Stallman" nó ar a laghad sílim mar sin ,,,
    Maidir is

    1.    abimaelmartell a dúirt

      Chruthaigh Linus an eithne Linux, chruthaigh Stallman GNU arb iad uirlisí agus orduithe Unix iad.

      Tá an teideal oiriúnach mar tá núicléas á chruthú agat.

      Beannachtaí!

  3.   Ruby a dúirt

    Go raibh míle maith agat as mo chuid ceisteanna go léir a fhreagairt agus as a bheith foighneach, mar thionól níl a fhios agam ach na buneilimintí agus mar C beagnach rud ar bith, ach is maith liom go leor é, anois táim beagáinín mearbhall leis an GDT, féach an dtuigim.

    Beidh na ‘tuairiscí’ domhanda ag an GDT ar féidir le haon chlár rochtain a fháil orthu i gcónaí, agus díríonn na tuairiscí seo ar na codanna ina bhfuil (an clár) le cur i gcrích? nó tá a mhalairt.