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

ښه ، د یو څه لنډ قاموس وروسته موږ د خپلو لارښوونو لړۍ سره دوام ورکوو. که موږ پخوانۍ کوډ ته بیرته لاړ شو موږ باید د صفر لخوا د برخې ISR ولرو. اوس موږ باید د ISR پاتې برخې ډکې کړو د کوم لپاره چې موږ پوسټ کړې وه (لومړی 32). ښه اوس موږ د برنامو مداخلو ته دوام ورکوو ، موږ د IRQ ترسره کوو چې ورته هم پیژندل کیږي مداخلې غوښتنې. دا IRQs د هارډویر وسیلو لخوا تولید شوي لکه کی بورډونه ، موږکان ، پرنټرونه ، او نور. په پیل کې لومړی 8 IRQs په اتوماتيک ډول د IDT پوستونو ته له 8 څخه تر 15 پورې نقشه کیږي. له هغه وخته چې موږ د استثنا لپاره لومړي 32 کارولی اوس موږ یې بیا ځای په ځای کوو. موږ به IRQ له 32 څخه تر 45 پورې وساتو. د دې لپاره موږ باید لومړی IRQs بیا جوړ کړئ:

void ND::IRQ::Remap(int pic1, int pic2)
{
#define PIC1 0x20
#define PIC2 0xA0
#define ICW1 0x11
#define ICW4 0x01
/* send ICW1 */
ND::Ports::OutputB(PIC1, ICW1);
ND::Ports::OutputB(PIC2, ICW1);
/* send ICW2 */
ND::Ports::OutputB(PIC1 + 1, pic1); /* remap */
ND::Ports::OutputB(PIC2 + 1, pic2); /* pics */
/* send ICW3 */
ND::Ports::OutputB(PIC1 + 1, 4); /* IRQ2 -> connection to slave */
ND::Ports::OutputB(PIC2 + 1, 2);
/* send ICW4 */
ND::Ports::OutputB(PIC1 + 1, ICW4);
ND::Ports::OutputB(PIC2 + 1, ICW4);
/* disable all IRQs */
ND::Ports::OutputB(PIC1 + 1, 0xFF);
}

اوس موږ د IRQs نصبولو لپاره فعالیت جوړ کوو:

void ND::IRQ::Install()
{
ND::Screen::SetColor(ND_SIDE_FOREGROUND,ND_COLOR_BLACK);
ND::Screen::PutString("\nInstalling IRQ...");
ND::IRQ::Remap(0x20,0x28);
ND::IDT::SetGate(32,(unsigned)ND::IRQ::IRQ1,0x08,0x8E);
ND::IDT::SetGate(33,(unsigned)ND::IRQ::IRQ2,0x08,0x8E);
ND::IDT::SetGate(34,(unsigned)ND::IRQ::IRQ3,0x08,0x8E);
ND::IDT::SetGate(35,(unsigned)ND::IRQ::IRQ4,0x08,0x8E);
ND::IDT::SetGate(36,(unsigned)ND::IRQ::IRQ5,0x08,0x8E);
ND::IDT::SetGate(37,(unsigned)ND::IRQ::IRQ6,0x08,0x8E);
ND::IDT::SetGate(38,(unsigned)ND::IRQ::IRQ7,0x08,0x8E);
ND::IDT::SetGate(39,(unsigned)ND::IRQ::IRQ8,0x08,0x8E);
ND::IDT::SetGate(40,(unsigned)ND::IRQ::IRQ9,0x08,0x8E);
ND::IDT::SetGate(41,(unsigned)ND::IRQ::IRQ10,0x08,0x8E);
ND::IDT::SetGate(42,(unsigned)ND::IRQ::IRQ11,0x08,0x8E);
ND::IDT::SetGate(43,(unsigned)ND::IRQ::IRQ12,0x08,0x8E);
ND::IDT::SetGate(44,(unsigned)ND::IRQ::IRQ13,0x08,0x8E);
ND::IDT::SetGate(45,(unsigned)ND::IRQ::IRQ14,0x08,0x8E);
ND::IDT::SetGate(46,(unsigned)ND::IRQ::IRQ15,0x08,0x8E);
ND::IDT::SetGate(47,(unsigned)ND::IRQ::IRQ16,0x08,0x8E);
ND::Screen::SetColor(ND_SIDE_FOREGROUND,ND_COLOR_GREEN);
ND::Screen::PutString("done");
asm volatile("sti");
}

د asm جمله سټ موږ IRQs فعال کوو. ښه اوس موږ د ISR ورته ورته شی سره ځو. د IRQ لومړني دندې:

void ND::IRQ::IRQ1()
{
asm volatile(
"cli \n"
"pushl 0\n"
"pushl 32\n"
"jmp ND_IRQ_Common"
);
}

یوه ګډه برخه (ورته ISR):

extern "C"
void ND_IRQ_Common()
{
asm volatile(
"pusha \n"
"push %ds\n"
"push %es\n"
"push %fs\n"
"push %gs\n"
"movw $0x10, %ax \n"
"movw %ax, %ds \n"
"movw %ax, %es \n"
"movw %ax, %fs \n"
"movw %ax, %gs \n"
"movl %esp, %eax \n"
"push %eax \n"
"movl $ND_IRQ_Handler, %eax \n"
"call *%eax \n"
"popl %eax \n"
"popl %ds \n"
"popl %es \n"
"popl %fs \n"
"popl %gs \n"
"popa \n"
"addl 8, %esp \n"
"iret \n"
);
}

او یو اصلي سمبالوونکی:

extern "C"
void ND_IRQ_Handler(struct regs* r)
{
void (*handler)(struct regs *r);
if(r->int_no >= 40)
{
ND::Ports::OutputB(0xA0,0x20);
}
ND::Ports::OutputB(0x20,0x20);
}

پدې سره موږ باید دمخه IRQ فعال کړو حتی که دوی لاهم هیڅ ونه کړي. په راتلونکي فصل کې به موږ وګورو چې د دې IRQs لکه ساعت یا کی بورډ څخه ډاټا ترلاسه کول څنګه دي.

NextDivel-IRQ
او پدې سره د نن ورځې پوسټ پای ته رسي. لکه څنګه چې تاسو اوس لیدلی شئ زه د نورو مسلو له امله لږ منظم لیکم. حتی حتی زه به دوام ورکړم تر هغه چې زه نور بشپړ عملیاتي سیسټم ولرم


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

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

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

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

*

*

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

  1.   aitor_cz dijo

    له تاسو څخه ډیره مننه اډرین ، هرڅومره ژر چې زه یو څه وخت ولرم (اوس زه یوڅه بوخت یم ، د نورو شیانو په مینځ کې هم د عملیاتي سیسټم سره) زه به د مرحله په ذریعه د ټیټوریل ازموینه پیل کړم.

  2.   ياقوتو dijo

    د ټیټ څخه ډیره مننه.

  3.   ساسوک dijo

    یوه پوښتنه زه د دې برنامو ژبو پراساس پروژه ترسره کوم
    * HTML5
    * سی ایس 3
    * جاوا
    زما پوښتنه دا ده چې زه غواړم دا پروژه اجرایی شي ، نو دا چې کاروونکي دا په لینکس او وینډوز کې په عملیاتي سیسټمونو کې کاروي ، ایا تاسو راته ویلای شئ چې زه دا څنګه وکړم

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

      دا د دې سره هیڅ تړاو نلري مګر زه تاسو ته ځواب درکوم. زه ګومان کوم چې دا به HTML5 ، CSS3 ، او جاواسکریپټ جاوا نه وي ، ځکه چې HTML5 او جاوا په مرګ سره مخ کیږي. د HTML5 سره تاسو کولی شئ ویب پا createې رامینځته کړئ مخکې لدې چې له انټرنیټ څخه لاسرسی ومومئ. که تاسو غواړئ دا سیمه ایز کړئ نو تاسو کولی شئ دا د فایرفوکس OS او کروم OS ایپ په توګه بسته کړئ. که هغه څه چې تاسو یې غواړئ دا دي چې په هر عملیاتي سیسټم کې د XUL رنر لیدلو لپاره اجرا کونکی شتون لري کوم چې د ګیکو انجن سره د XUL اجرا کولو وسیله ده (او د عنصر دننه HTML5).

    2.    پیرډ پیرز dijo

      د جاوا چوکاټ یا پینل خورا ښه اختیار دی ما ما د وینډوز په توګه د ویب براوزر په توګه د جاوا فریم ټولګیو په کارولو سره ځینې اجرا کونکي ایپسونه رامینځته کړي مګر د هرې پا pageې لپاره د دې پرځای کارولو سره زه دا په کوډ کې مستقیم لاره ورکوم او د پی ایچ پی سره زه جاوا جملې اعداموم. د .j له لارې چې د سټیل پاملرنه کوي. که څه هم زه به د HTML5 ، CSS3 او جاواسکریپټ کارولو وړاندیز وکړم ځکه چې اډریان جاوا وایی ، دا د Html5 سره فټال اخلي او دا زما ډیر سر درد راوړی.

  4.   لرن dijo

    د خپل برنامه کولو ژبه کولو څرنګوالي په اړه لارښود به ښه وي

  5.   ایوان dijo

    د عملیاتي سیسټم رامینځته کولو په اړه د مقالو لړۍ خورا ښه دا ، تاسو ډیری شیان زده کوئ. زه راتلونکي ننوتلو ته سترګې په لار یم ، زه دمخه غواړم په OS کې کی بورډ ولرم. زه د ګیټ کوډ سره شاوخوا ګډا وم ، او زه نشم کولی دا د 0x60 او 0x64 بندرګاه سره کار کولو لپاره ترلاسه کړم. حتی که څه هم ما فکر کاوه چې د کی بورډ لپاره یو مداخله وه چې درته کليمه درکوله.

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

      تاسو کولی شئ په حقیقت کې پرته له مداخلت څخه د کی بورډ آخذه ترلاسه کړئ ، مګر تاسو باید د ND :: بندرونو سره ولولئ: ان پټ 0x60 په بندر کې. په هرصورت د دې کولو غوره لاره د IRQ مداخلو سره ده. زه اوس مهال هڅه کوم چې دا وکړم او د دې له امله ادامه ورکولو ته یو څه ډیر وخت نیسي.

      1.    کارلوسورټا dijo

        سلام اډریان ، زه کوډ ګورم او زه د هغه څه څخه متاثره یم چې دا یې کوي او دا څنګه ما سره مرسته کړې چې په ځینو شیانو پوه شم.

        زه یو څه کوچني پوښتنې لرم چې دا څنګه کار کوي او سرچینه هغه ده چې ما ستاسو د GIT څخه ترلاسه کړې:

        1.- د IRQ برخه کې ، تاسو یادونه وکړه چې د 0 څخه تر 32 پورې د IDT پوستونه د استثنا لپاره او د 32 (0x20) څخه تر 45 (0x2D) پورې د IRQs لپاره کارول شوي و ، مګر IRQs په مجموع کې 16 دي ، پاتې کول به یې 0x20 څخه نه وي ته 0x30 ته؟

        .- د IRQ برخه کې ، یادونه وکړئ چې سیټګیټونه د IDT برخې ته لیږل شوي و؛ کله چې تاسو دوی جلا کړئ ، نو پام وکړئ چې دا نور د 2 لخوا د برخې استثنا نه تولیدوي ، نو د هر ترمیم شوي IDT فلش () اضافه کول اړین دي. د IDT بدلون ولې کله چې د ټایمر تنظیم کول او د 0 ترمینځ څانګې کار کول بندوي؟

        3.- زه هڅه کوم چې د ځینې چاپ سره کوډ ومومم ترڅو د هغه څه په نښه کولو لپاره چې دا اجرا کوي (لدې چې په مرحله کې د ډیبګ کولو مرحله نه وي) او ما احساس وکړ چې هیڅ IRQ کار نه کوي ، ایا زه باید بل څه ثبت کړم؟ د IRQ مداخلو تولید ته؟

        1.    کارلوسورټا dijo

          ما په یاد وساتئ چې ما دا اړیکې د معلوماتو سره وموندلې:
          http://arstechnica.com/civis/viewtopic.php?f=20&t=899001
          http://www.superfrink.net/athenaeum/OS-FAQ/os-faq-pics.html
          http://orga2.exp.dc.uba.ar/data/downloads/clasespracticas/interrupciones2_clase_17.pdf
          http://www.intel-assembler.it/PORTALE/4/231468_8259A_PIC.pdf

          په ښکاره ډول د IRQs اداره کولو لپاره ، دا باید په پام کې ونیول شي چې کوم ډول سمبالونکی کارول کیږي که ، PIC ، APIC ، IOAPIC. . .tc. ایا د IRQ مدیریت متحرک کولو لپاره لاره شتون لري یا تاسو د قسمت هڅه کولو ته اړتیا لرئ؟

  6.   کارلوسورټا dijo

    ماسپخین اډرین.

    ما ولیدل چې زه د IRQs سره ستونزه لرم او له همدې امله کوډ پرمختللی نشو ، ما د پروژې یوه کاپي واخیستله او تحلیل مې پیل کړ؛ ما د سکرین چاپ ته یو فنکشن اضافه کړ ترڅو د سټرک ریګ راجسټ ریکارډونه چاپ کړي ، د مداخلو په وخت کې؛ ما ډیری شیان وموندل ، د دوی ترمینځ چې ریکارډ روان دی او زه لاهم نشم موندلی چې ولې؛ د کیبورډ مداخلې لپاره ټیمر مداخله بدله کړئ او هغه څه وکړئ چې دا باید وکړي مګر زه ستونزه نشم موندلی ، ایا تاسو زما سره مرسته کولی شئ او د دې ښې پوسټ سره دوام ورکړئ؟ 😀

    زه لینک پریږدم (دا یو څه ترمیمونه لري ځکه چې زه میګیا کاروم او زه ګروب 2 کاروم ، زه د دې ازموینې لپاره ورچول بکس کاروم)
    https://www.mediafire.com/?93psrgaoozatse8

    ستاسو د پاملرنې ځواب ته په تمه او که تاسو کومه پوښتنه لرئ یا یو څه ته اړتیا لرئ ، زه غواړم مرسته وکړم 🙂

    1.    کارلوسورټا dijo

      ما په یاد ولرئ چې ما د کیرنیل پیینک هم چیک کړی ځکه چې ISRs کار نه کاوه او زه د ورته سټیک په سر کې ورته ستونزه لرم یو ارزښت لیک کیږي او زه نه پوهیږم چې دا زما تالیف کونکی دی یا کومه ستونزه شتون لري ، زه یې کاروم. GCC 4.8.2 د Mageia 4 سره

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

      زه واقعیا خوښوم چې تاسو زما سره په پروژه کې مرسته وکړئ. زه واقعیا په ټایمر کې پاتې شوی یم او زه نه پوهیږم چې ولې دا کار نه کوي. ما د یو څو شیانو ترمیم کولو آزموینې ترسره کړې او دا کار یې ونه کړ. اوس مهال زه نشم کوډ ایډیټ کولی شم (زه په رخصتۍ کې یم) مګر زه به ژر تر ژره دا ښه نظر واخلم. زه تاسو ته د دې ستونزې په اړه معلوماتو سره لینک درکوم چې داسې بریښي چې یو څه عادي ښکاري: http://wiki.osdev.org/I_Cant_Get_Interrupts_Working

      د استثنااتو په اړه ، زه فکر کوم چې زه په یاد لرم چې تاسو باید د دوی د فعالولو لپاره په ASM کې "سټ" ته زنګ ووهئ که څه هم دا روښانه ده چې دلته کوم غلط شتون لري.

      1.    کارلوسورټا dijo

        ستاسو د ځواب څخه مننه او هو ، واقعیا. مداخلې ناکامې شوې مګر دا په کوډ کې د کوډونو دننه کولو او د کاسټینګ ستونزه وه ، زه به لینک چیک کړم او زه به ازموینې ترسره کړم. که زه دا حل کړم زه به تاسو ته خبر درکړم او که نه نو زه به تاسو ته د پرمختګ خبر ورکړم. خوشحاله رخصتۍ 🙂

      2.    کارلوسورټا dijo

        د راټول شوي کوډ لیدو لپاره هیڅ لاره شتون نلري؟ ایا یو څه عجیب واقع کیږي او زه یې څه نه شم موندلی؟ دې سکرین ته ګورئ (ما لینک په پای کې ایښوده) ، دا د IRQ 2 فنکشن څخه وروسته یو څه عجیب دی (کی بورډ ) دا د 0 او 0x20 ارزښت 32 ته ننوځي (32 ، نو دا د ازموینې لپاره فټ کړئ) بیا پوشال (د 0 بټ GPR راجسټرې) د قطع کولو راجسټرې تعقیبوي او بیا د کڅوړې پورته برخه او بیا د IRQ هینډلر ته زنګ ووهئ. ما د هرې کڅوړې لیدل پیل کړل او ظاهرا دا په ترتیب کې دي مګر که تاسو د VM محصول وینئ تاسو کولی شئ وګورئ چې دا یو بل عنصر ډوبوي ، زه نشم موندلی چیرته ، زه یوازې پوهیږم چې دا 10xXNUMX دی او دی جوړښت له ترتیب بهر دی. دا د ریکارډ جوړښت دی.

        جوړښتونه
        uint32_t gs ، fs ، es ، ds؛ / * سیکس وروستی فشار ورکړ * /
        uint32_t ایډی ، esi ، ebp ، esp ، ebx ، edx ، ecx ، eax؛ / * د 'پشال' لخوا فشار شوی * /
        uint32_t int_no ، تېروتنه کوډ؛ / * د غلطې کوډ * /
        uint32_t eip ، cs ، eflags ، useused ، ss؛ / * په ماتي کې ساتل * /
        };

        دا ماته یو کین راکوي چې یو بل عنصر یې په سر کې راکړ او زه نشم موندلی چیرې چې چیرې چیرې شتون لري که چیرې ظاهرا هرڅه له مینځه یوسي لکه څنګه چې باید وي. ایا تاسو کوم نظر لرئ چې دا څه کیدی شي؟

        http://www.subeimagenes.com/img/sin-titulo-1036729.jpg

  7.   کارلوسورټا dijo

    کي بورډ د کار لپاره مداخله وکړئ مګر د ټایمر مداخله نه؛ تیروت په هغه ډول و چې دا ترتیب شوی دی ، ما د وروستي څیز لیدو لپاره ایجډمپپ وکارول او دا معلومه شوه چې هر فنکشن چې حتی د "asm volatile" په کارولو سره ننوتلی و هم د pushl ebp ، Mov ebp ، esp سره و. بیا یوازې د لومړنۍ ب restoreې بیرته راګرځولو لپاره دې ته یو پاپل ای بی پی اضافه کړئ او دا به پرته له ناکامۍ دلیلونه تیریږي. دلته زه د هغو کسانو لپاره کوډ ضمیم کوم چې غواړي یې وګوري او که تاسو ومومئ چې ولې مداخله د ټایمر لخوا نه رامینځته کیږي ، زه به یې په اړه پوهیدل وغواړم او زه یو لینک ضمیموم چیرته چې دوی د ملټي ټاسک کولو په اړه خبرې کوي. http://www.jamesmolloy.co.uk/tutorial_html/9.-Multitasking.html
    بل ډیویل
    https://www.mediafire.com/?kmo83dxyzc7c3cz

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

      زه پرې ورسېدم. دا په بل سایټ کې یوه بګ وه چې د ټایمر PIC فعالیت یې اغیزمن کړی ، په ځانګړي ډول د IRQ په ریمپ کې دوه لینونه شتون درلود چې ما باید ترمیم کړي. د دې حقیقت څخه مننه چې زه وکولی شم په یوه ویب پا onه کې کوډ وګورم چې پدې مرحله کې یو څه مختلف او کلیک درلود! بدلون د دې کرښو په څنګ کې و:
      ND :: بندرګی :: آؤټ پټ بی (PIC1 + 1، 0xFF)؛
      ND :: بندرګی :: آؤټ پټ بی (PIC2 + 1، 0xFF)؛

      تاسو باید د 0xFF ارزښت بدل کړئ (زه به ووایم چې دا معلولیت په ګوته کوي) زه 0x00 ته وایم (زه به ووایم چې دا د فعال شوي په ګوته کوي) که څه هم زه واقعیا ډاډه نه یم ، مګر دا کار کوي. ما په GitHub کې کوډ تازه کړی دی. ډیره مننه ، له ما سره د دې پروژې په برخه کې د مرستې لپاره چې زه یې د دې ستونزې له امله لږ څه پریښودم ډیره مننه کوم. H

      1.    کارلوسورټا dijo

        تاسو ښه راغلاست ، زه به د موضوع راتلونکي نوي معلومات ته سترګې په لار یم او تاسو د هرڅه لپاره ما حساب کولی شئ 🙂 (Y)

      2.    کارلوسورټا dijo

        د کی بورډ تار نیول کیدنه بدل کړئ؛ ځکه چې دا لوستل کیږي کله چې کیلي خوشې کیږي او دا په بفر کې 0 پورته کوي ، کوم چې په لوستلو کې ستونزې رامینځته کوي او په پای کې '' n 'دې ته یې بدلوي »ترڅو سم چاپ کولو کار وکړي

  8.   پیرډ پیرز dijo

    سلام ، زه ستاسو ټوله پوسټ لولم ، که څه هم په عمل کې دا د 2 پوسټ څخه ډیر نه دی ، دا واقعیا خورا ښه ده ، هرڅه خوندي کړئ ، مګر زه واقعیا د C ++ او پوکس مطالعه کولو ته اړتیا لرم ترڅو پوه شم ځکه چې زه د "c" په اړه پوهیږم (زه د دې برنامه کولو ژبې څخه زړه راښکونکی یم) مګر که څه هم c ++ c OO ما هیڅکله پدې کې واقعیا کار نه دی کړی ، ما په ګوګل کې ځینې درسونه ولولئ او بیا زه دا خورا په زړه پورې او یوه پوښتنه بیرته راګرځوم ، ایا د کړکۍ پیل لینکس سره ورته دی؟

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

      په وینډوز کې بوټینګ په ورته معنی دی چې دا د x86 پروسیسر سره سیسټم بوټ کولو لاره ده او په دې کې جوړ عملیاتي سیسټم لږ تاثیر لري. موږ واقعیا پخپله پخپله بوټ نه کوو ، دا زموږ لپاره GRUB بوټ کوي. GRUB ، د لینکس بوټ کولو لپاره ډیزاین شوی ، کولی شي وینډوز بوټ کړي او پدې حالت کې NextDivel.

      1.    سوډ dijo

        ښه تاسو څخه مننه د دې معنی ده چې څه چې زه یې کول غواړم امکان لري زه دمخه د c ++ مطالعه کوم او ما ځینې اطلاقات رامینځته کړي دي او ستاسو سیسټم یې په ډزو کې نصب کړی دی او زه یې په تفصیل سره مطالعه کوم یو ښه پوسټ دی.