د لیونس تورالډز تقلید کول: له چارتچ څخه خپل عملیاتي سیسټم رامینځته کړئ (IV)

د "ایملینګ لینوس تورالډز" په نوم پوسټونو دې لړۍ ته بیرته ښه راغلاست. نن ورځ موږ به GDT وګورو. لومړی موږ باید وګورو چې GDT څه شی دی. د ویکیپیډیا په وینا:

د نړېوال توضیحي میز or GDT د ډاټا جوړښت دی چې د لخوا کارول کیږي Intel x86- فامیلي پروسیسرونه د 80286 د برنامې پلي کولو پرمهال د حافظې د مختلفو ساحو ځانګړتیاوې تعریف کولو لپاره ، د اساس پته ، اندازه او د لاسرسي امتیازات لکه د اعدام کولو او لیکلو وړتیا په شمول

هغه څه چې ژباړل شوي به د ګلوبل ډیسکریکټر جدول وي ، د ډیټا جوړښت د 86 راهیسې د انټیل x80286 پروسسرو کې کارول شوی ترڅو د برنامې پلي کولو پرمهال د مختلف حافظې ساحو ځانګړتیاوې تعریف کړي.

په لنډیز کې ، که موږ د Intel x86 پروسیسر کاروو ، موږ باید د حافظې د سمې کارونې لپاره GDT تعریف کړو. موږ ډیر پیچلتیا نه کوو او موږ به په جدول کې 3 ننوتنې تعریف کړو:

  • د NULL ننوتل ، د ټولو میزونو لپاره اړین دی.
  • د برخې لپاره ټیکټ معلومات، موږ به اعظمي وکاروو ، کوم چې په 32 ټوټو کې 4 GB دی.
  • د برخې لپاره ټیکټ کوډ، موږ به اعظمي وکاروو ، کوم چې په 32 ټوټو کې 4 GB دی.

لکه څنګه چې تاسو لیدلی شئ ، ډاټا او کوډ به ورته ځای وکاروي. ښه ، اوس موږ دا پلي کوو. د دې لپاره به موږ دوه جوړښتونه وکاروو ، لومړی به زموږ د GDT ریښتیني معلوماتو ته د نښې درلودو مسؤل وي. او دوهم به د GDT ننوتلو سره صف ولري. راځئ چې لومړی یې تعریف کړو

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

تاسو ممکن د جوړښتونو په پای کې عجیب __atribute __ ((بسته شوی)) ولیدل. دا GCC ته وايي چې جوړښتونه مطلوب نه کړي ځکه چې هغه څه چې موږ غواړو د معلوماتو راټولول لکه څنګه چې پروسیسر ته وي. اوس موږ د GDT نصبولو لپاره فعالیت ترسره کوو. مخکې لدې چې موږ باید جوړښتونه اعالن کړی وای ، اوس موږ دا پیل کوو.

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

پدې توګه موږ د نښې رامینځته کولو لپاره ترلاسه کوو چې زموږ د 3 ان پټ میز ته ځي.

که تاسو د 64 ټوټو په کارولو سره تالیف کړئ نو دا به غالبا دلته ناکام شي. دا ځکه چې د 64-bit سیسټمونو کې نښې په څرګند ډول 64-bit دي او موږ دلته 32-bit ډولونه کاروو. د -m32 انتخاب کارول ممکن د اوس لپاره مرسته وکړي
اوس موږ عام معلومات تعریف کوو ترڅو معلومات په معلوماتو کې واړوو

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

او موږ دا د نصب کولو فنکشن څخه 3 ځله تلیفون کوو

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

په نهایت کې موږ باید پروسیسر ته ووایو چې موږ یو GDT لرو ، نو دا دا کولی شي دا پورته کړي ، او زموږ په قضیه کې کله چې د GRUB سره د ډنډ څخه ډډ کول ، GRUB GDT له سره ولیکل شي. د GDT د پورته کولو لپاره دلته په لار کې لارښود شتون لري د lgdt (یا lgdtl په ترکیب پورې اړه لري) ، موږ به یې وکاروو.

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

ښه یوځل چې موږ دا پای ته ورساوه زموږ سیسټم به دمخه GDT ولري. په راتلونکي فصل کې به موږ IDT وګورو ، یو جدول د GDT سره ورته دی مګر د مداخلو سره. ما د GDT سره یو څه حالت او تایید پیغامونه ایښي دي نو NextDivel اوس ورته ښکاري:

NextDivel-GDT


د مقالې مینځپانګه زموږ د اصولو سره سمون لري ایډیټیک اخلاق. د غلطۍ راپور ورکولو لپاره کلیک وکړئ دلته.

5 نظرونه ، خپل پریږدئ

خپله نظر پرېږدئ

ستاسو د بریښنا لیک پته به خپره نه شي.

*

*

  1. د معلوماتو لپاره مسؤل: میګیوانجل ګاتین
  2. د معلوماتو هدف: د سپیم کنټرول ، د نظر مدیریت.
  3. قانونیت: ستاسو رضایت
  4. د معلوماتو راټولول: معلومات به د قانوني مکلفیت پرته دریمې ډلې ته نه لیږدول کیږي.
  5. د معلوماتو ذخیره: ډیټابیس د Occentus شبکې (EU) لخوا کوربه شوی
  6. حقونه: په هر وخت کې تاسو کولی شئ خپل معلومات محدود ، له سره تنظیم او حذف کړئ.

  1.   سییرون dijo

    شاید د 64-بټ جوړښت د دې وختونو لپاره ډیر مناسب وي ، دا د 8086 کارولو ته دوام ورکولو کې ځنډ دی.

    1.    اډریان اریو سټریټ dijo

      زه په x86_64 کې د GDT په اړه معلومات لټوم او زما په اند دا د ځانګړي بیرغ سره زوړ ماډل تعقیبوي. یو 32-bit پته لاهم کارول کیږي. اوس زه دقیقا نه پوهیږم چې دا څنګه سم ترسره کړئ. ځینې ​​لینکونه:
      http://wiki.osdev.org/Entering_Long_Mode_Directly
      http://f.osdev.org/viewtopic.php?f=1&t=16275

  2.   جیرونیمو dijo

    لومړی خورا ښه ستاسو مرستې ، مګر زه فکر کوم سرلیک باید وي
    "ایملینډ ریچارډ سټال مین" یا لږترلږه زه داسې فکر کوم ، ،
    مننه!

    1.    abimaelmartell dijo

      لینوس د لینکس کرنل رامینځته کړ ، سټال مین GNU رامینځته کړ چې د یونیکس وسیلې او حکمونه دي.

      سرلیک مناسب دی ځکه چې تاسو نیوکلیوس رامینځته کوئ.

      مننه!

  3.   ياقوتو dijo

    زما د ټولو پوښتنو ته د ځواب ویلو او صبر کولو لپاره ډیره مننه ، زه یوازې د راټولونکي په توګه اساسات پیژنم او زه د C په اړه شاوخوا هیڅ نه پوهیږم ، مګر زه واقعیا خوښوم ، اوس زه د GDT سره یو څه مغشوش یم ، راځئ وګورو چې ایا زه پوهیدل.

    GDT د نړیوال 'توضیح کونکي' لري چې تل د کوم برنامه لخوا لاسرسی کیدی شي ، او دا توضیح کونکي برخې ته په ګوته کوي چیرې چې (برنامه) اجرا کیږي؟ یا دا بل څه دي.