लिनुस टोरवाल्ड्स का अनुकरण करना: स्क्रैच से अपना ऑपरेटिंग सिस्टम बनाना (VI)

खैर, थोड़ी सी कोष्ठक के बाद हम ट्यूटोरियल की हमारी श्रृंखला जारी रखते हैं। यदि हम पिछले कोड पर लौटते हैं, तो हमारे पास विभाजन का ISR शून्य होना चाहिए। अब हमें बाकी ISR में भरना होगा जिसके लिए हमने एक संदेश (पहले 32) पोस्ट किया था। खैर अब हम प्रोग्रामिंग रुकावटों को जारी रखने जा रहे हैं, हम आईआरक्यू भी करने जा रहे हैं अनुरोधों को बाधित करता है। ये IRQ हार्डवेयर डिवाइसों जैसे कीबोर्ड, चूहों, प्रिंटर आदि द्वारा उत्पन्न होते हैं। प्रारंभ में पहले 8 आईआरक्यू स्वचालित रूप से आईडीटी पदों के लिए 8 से 15. तक मैप किए जाते हैं क्योंकि हमने अपवादों के लिए पहले 32 का उपयोग किया है अब हमें उन्हें फिर से तैयार करना होगा। हम 32 से 45 तक IRQ डालेंगे। इसके लिए हमें पहले IRQ को फिर से तैयार करना होगा:

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

अब हम IRQ को स्थापित करने के लिए एक फंक्शन बनाते हैं:

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

अस्मा का वाक्य एसटीआई हम IRQ सक्रिय करते हैं। खैर अब हम 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);
}

इसके साथ ही हमारे पास पहले से ही आईआरक्यू सक्रिय होना चाहिए, भले ही वे अभी भी कुछ भी न करें। अगले अध्याय में हम देखेंगे कि इन आईआरक्यू जैसे घड़ी या कीबोर्ड से डेटा कैसे प्राप्त किया जाए।

आगामीडिवल-आईआरक्यू


और इसी के साथ आज की पोस्ट समाप्त करता है। जैसा कि आप देख सकते हैं कि मैं अन्य मुद्दों के कारण नियमित रूप से कम लिखता हूं। यहां तक ​​कि मैं तब तक जारी रखूंगा जब तक कि मेरे पास अधिक पूर्ण ऑपरेटिंग सिस्टम नहीं है


22 टिप्पणियाँ, तुम्हारा छोड़ दो

अपनी टिप्पणी दर्ज करें

आपका ईमेल पता प्रकाशित नहीं किया जाएगा। आवश्यक फ़ील्ड के साथ चिह्नित कर रहे हैं *

*

*

  1. डेटा के लिए जिम्मेदार: मिगुएल elngel Gatón
  2. डेटा का उद्देश्य: नियंत्रण स्पैम, टिप्पणी प्रबंधन।
  3. वैधता: आपकी सहमति
  4. डेटा का संचार: डेटा को कानूनी बाध्यता को छोड़कर तीसरे पक्ष को संचार नहीं किया जाएगा।
  5. डेटा संग्रहण: ऑकेंटस नेटवर्क्स (EU) द्वारा होस्ट किया गया डेटाबेस
  6. अधिकार: किसी भी समय आप अपनी जानकारी को सीमित, पुनर्प्राप्त और हटा सकते हैं।

  1.   aitor_cz कहा

    बहुत बहुत धन्यवाद एड्रियन, जैसे ही मेरे पास कुछ समय होगा (अब मैं काफी व्यस्त हूं, अन्य चीजों के साथ भी एक ऑपरेटिंग सिस्टम के साथ) मैं कदम से ट्यूटोरियल कदम का परीक्षण करना शुरू कर दूंगा।

  2.   माणिक कहा

    तुत के लिए बहुत-बहुत धन्यवाद।

  3.   sasuke कहा

    एक प्रश्न मैं इन प्रोग्रामिंग भाषाओं पर आधारित एक परियोजना कर रहा हूं
    * Html5
    * सीएसएस 3
    *जावा
    मेरा सवाल यह है कि मैं चाहूंगा कि यह परियोजना क्रियान्वित हो, ताकि उपयोगकर्ता इसे लिनक्स और विंडोज़ जैसे ऑपरेटिंग सिस्टम में उपयोग करें, क्या आप मुझे बता सकते हैं कि मैं यह कैसे करता हूं

    1.    AdrianArroyoStreet कहा

      इसका इससे कोई लेना-देना नहीं है लेकिन मैं फिर भी आपको जवाब देता हूं। मुझे लगता है कि यह HTML5, CSS3 और जावास्क्रिप्ट जावा नहीं होगा, क्योंकि HTML5 और जावा मोटे तौर पर साथ हैं। HTML5 के साथ आप वेबसाइट बना सकते हैं जैसा कि इंटरनेट से एक्सेस किया जाता है। यदि आप इसे स्थानीय बनाना चाहते हैं तो आप इसे फ़ायरफ़ॉक्स ओएस और क्रोम ओएस ऐप के रूप में पैकेज कर सकते हैं। यदि आप चाहते हैं कि प्रत्येक ऑपरेटिंग सिस्टम में एक निष्पादन योग्य XUL धावक पर एक नज़र है, जो कि जीयूएलओ इंजन के साथ XUL (और तत्व के अंदर HTML5) को निष्पादित करने का एक उपकरण है।

    2.    मिट्टी का पेरेज़ कहा

      जावा फ्रेम या पैनल एक बहुत अच्छा विकल्प है, मैंने जावा फ्रेम कक्षाओं में वेब ब्राउज़र के रूप में उपयोग करते हुए विंडो में कुछ निष्पादन योग्य एप्लिकेशन बनाए हैं, लेकिन किसी भी पृष्ठ के लिए उपयोग करने के बजाय मैं इसे कोड में एक सीधा रास्ता देता हूं और php के साथ मैं जावा वाक्य निष्पादित करता हूं। स्टील की देखभाल करने वाले .jar के माध्यम से। यद्यपि मैं एड्रियन जावा के रूप में HTML5, CSS3 और जावास्क्रिप्ट का उपयोग करने की सलाह दूंगा, क्योंकि यह Html5 के साथ घातक है और इसने मुझे सिरदर्द में ला दिया

  4.   पगड़ी कहा

    कैसे अपनी खुद की प्रोग्रामिंग भाषा बनाने के लिए एक ट्यूटोरियल अच्छा होगा

  5.   इवान कहा

    ऑपरेटिंग सिस्टम बनाने के तरीके पर लेखों की यह श्रृंखला बहुत अच्छी है, आप कई चीजें सीखते हैं। मैं अगली प्रविष्टि का इंतजार कर रहा हूं, मैं पहले से ही ओएस में एक कीबोर्ड रखना चाहता हूं। मैं git कोड के साथ गड़बड़ कर रहा हूं, और मैं इसे 0x60 और 0x64 पोर्ट के साथ काम करने में सक्षम नहीं कर पाया हूं। हालांकि मुझे लगा कि कीबोर्ड के लिए एक रुकावट है जो आपको दबाया गया कुंजी देता है।

    1.    AdrianArroyoStreet कहा

      आप वास्तव में बिना किसी रुकावट के कीबोर्ड इनपुट प्राप्त कर सकते हैं, लेकिन आपको एनडी :: पोर्ट्स :: इनपुटबी पर पोर्ट 0x60 के साथ पढ़ना होगा। हालाँकि ऐसा करने का आदर्श तरीका IRQ में बाधा है। मैं वर्तमान में इसे करने की कोशिश कर रहा हूं और इस वजह से इसे जारी रखने में थोड़ा अधिक समय लग रहा है।

      1.    Carlosorta कहा

        हाय एड्रियन, मैं कोड की जांच कर रहा हूं और मैं प्रभावित हूं कि यह क्या करता है और इसने कितनी अच्छी तरह से मुझे कुछ चीजों को समझने में मदद की है।

        मेरे पास कुछ छोटे सवाल हैं कि यह कैसे काम करता है और स्रोत वह है जो मुझे आपके GIT से मिला है:

        1.- IRQ के भाग में, आपने उल्लेख किया है कि IDT के 0 से 32 तक के पद अपवादों के लिए और IRQ के लिए 32 (0x20) से 45 (0x2D) के लिए उपयोग किए गए थे, लेकिन IRQ कुल मिलाकर 16 है, रीमैपिंग 0x20 से 0x30 तक नहीं होगी?

        2.- आईआरक्यू भाग में, ध्यान दें कि सेटगेट्स को आईडीटी अनुभाग में भेजा गया था; जब आप उन्हें अलग करते हैं, तो ध्यान दें कि यह अब 0 से विभाजन के अपवाद का उत्पादन नहीं करता है, इसलिए प्रत्येक संशोधन के लिए आईडीटी फ्लश () को जोड़ना आवश्यक है। टाइमर और 0 के बीच विभाजन को सेट करते समय IDT क्यों बदल जाता है?

        3.- मैं कुछ प्रिटिंग के साथ कोड को ट्रेस करने की कोशिश कर रहा था कि यह क्या कर रहा है (ताकि कदम से कदम डिबगिंग न हो) के संकेत के रूप में लेने के लिए और मुझे एहसास हुआ कि कोई आईआरक्यू काम नहीं कर रहा है, क्या मुझे कुछ और रजिस्टर करना है IRQ में बाधा उत्पन्न हुई?

        1.    Carlosorta कहा

          मैं यह बताना भूल गया कि मुझे जानकारी के साथ ये लिंक मिले हैं:
          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

          IRQ को संभालने के लिए स्पष्ट रूप से, यह ध्यान रखना आवश्यक है कि अगर, PIC, APIC, IOAPIC किस प्रकार के हैंडलर का उपयोग किया जाता है। । ।आदि। क्या IRQ प्रबंधन को गतिशील बनाने का कोई तरीका है या आपको भाग्य आज़माने की ज़रूरत है?

  6.   Carlosorta कहा

    शुभ दोपहर एड्रियन।

    मैंने देखा कि मुझे आईआरक्यू के साथ समस्याएं थीं और यही कारण है कि कोड को उन्नत नहीं किया जा सका, मैंने परियोजना की एक प्रति ली और मैंने इसका विश्लेषण करना शुरू किया; मैंने रुकावट बनाने के क्षण में, स्ट्रक्चर रेज के रिकॉर्ड को प्रिंट करने के लिए स्क्रीन प्रिंटिंग के लिए एक फ़ंक्शन जोड़ा; मुझे कई चीजें मिलीं, उनमें से एक रजिस्ट्री चल रही है और मुझे अभी भी पता नहीं चल पाया है कि क्यों; परीक्षण के लिए कीबोर्ड इंटरप्ट के लिए टाइमर की बाधा को बदलें और इसे वह करना चाहिए, लेकिन मुझे समस्या नहीं मिल रही है, क्या आप मेरी मदद कर सकते हैं और इस अच्छे पद को जारी रख सकते हैं? 😀

    मैं लिंक छोड़ता हूं (इसमें कुछ संशोधन हैं क्योंकि मैं माएजिया का उपयोग करता हूं और मैं ग्रब 2 का उपयोग करता हूं, मैं इसका परीक्षण करने के लिए वर्चुअलबॉक्स का उपयोग कर रहा हूं)
    https://www.mediafire.com/?93psrgaoozatse8

    आपकी चौकस प्रतिक्रिया की प्रतीक्षा की जा रही है और यदि आपके कोई प्रश्न हैं या कुछ चाहिए तो मैं ent की मदद करना चाहूंगा

    1.    Carlosorta कहा

      मैं यह उल्लेख करना भूल गया कि मैंने कर्नेलपैनिक की भी जाँच की है क्योंकि ISR काम नहीं करता है और मुझे स्टैक के शीर्ष पर एक ही समस्या है एक मान फ़िल्टर किया जा रहा है और मुझे नहीं पता कि यह मेरा संकलक है या कोई समस्या है, मैं Mageia 4.8.2 के साथ GCC 4 का उपयोग करें

    2.    AdrianArroyoStreet कहा

      मुझे वास्तव में पसंद है कि आप परियोजना में मेरी मदद करें। मैं वास्तव में टाइमर में फंस गया और मुझे समझ में नहीं आता कि यह काम क्यों नहीं करता है। मैंने काफी कुछ चीजों को संशोधित करने वाले परीक्षण किए और यह कारगर नहीं हुआ। वर्तमान में मैं कोड संपादित नहीं कर सकता (मैं छुट्टी पर हूं) लेकिन मैं जल्द से जल्द इसे देखूंगा। मैं आपको इस समस्या के बारे में जानकारी के साथ एक लिंक देता हूं जो कुछ सामान्य प्रतीत होता है: http://wiki.osdev.org/I_Cant_Get_Interrupts_Working

      अपवादों के बारे में, मुझे लगता है कि मुझे याद है कि आपको उन्हें सक्रिय करने के लिए ASM में "sti" को कॉल करना होगा, हालांकि यह स्पष्ट है कि कहीं न कहीं कुछ गड़बड़ है।

      1.    Carlosorta कहा

        आपके उत्तर के लिए धन्यवाद और हां, वास्तव में। इंटरप्ट्स विफल हो रहे थे, लेकिन स्टैक में कोड डालने और एक कास्टिंग समस्या थी, मैं लिंक की जांच करूंगा और मैं परीक्षण करूंगा। अगर मैं इसे हल करता हूं तो मैं आपको बता दूंगा और नहीं तो मैं आपको प्रगति की सूचना दूंगा। हैप्पी छुट्टियाँ 🙂

      2.    Carlosorta कहा

        इकट्ठे कोड को देखने का कोई तरीका नहीं होगा? क्या कुछ अजीब हो रहा है और मुझे क्या मिल रहा है? इस स्क्रीन को देखें (मैंने लिंक को अंत में रखा है), यह आईआरक्यू 2 फ़ंक्शन (कीबोर्ड) के बाद से कुछ अजीब है ) यह स्टैक को 0 और 0x20 (32, इसलिए इसे फिट करने के लिए फिट करता है) में प्रवेश करता है, फिर पुशाल (32-बिट जीपीआर रजिस्टर) के बाद विभाजन रजिस्टर और उसके बाद स्टैक के शीर्ष और फिर आईआरक्यू हैंडलर कहते हैं। मैंने प्रत्येक स्टैक को देखना शुरू कर दिया और जाहिर तौर पर यह क्रम में है लेकिन अगर आप वीएम का आउटपुट देख सकते हैं तो आप देख सकते हैं कि यह एक और तत्व को ढेर कर देता है, मुझे यह नहीं मिल रहा है, मुझे पता है कि यह एक 0x10 और संरचना है आदेश से बाहर हो जाता है। यह रिकॉर्ड संरचना है।

        संरचना regs {
        uint32_t gs, fs, es, ds; / * पिछले सेकंड को धकेल दिया * /
        uint32_t edi, esi, ebp, esp, ebx, edx, ecx, eax; / * 'पुशल' द्वारा धकेला गया * /
        uint32_t int_no, mis_code; /* एरर कोड */
        uint32_t eip, cs, eflags, useresp, ss; / * ब्रेक पर ढेर हो गया * /
        };

        यह मुझे एक कैन दे सकता है जो शीर्ष पर एक और तत्व डालता है और मुझे यह नहीं मिल रहा है कि यह कहाँ स्टैक्ड है यदि जाहिरा तौर पर सब कुछ स्टैक्ड है जैसा कि होना चाहिए। क्या आपके पास कोई विचार है जो यह हो सकता है?

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

  7.   Carlosorta कहा

    काम करने के लिए कीबोर्ड इंटरप्ट प्राप्त करें लेकिन टाइमर इंटरप्ट नहीं; त्रुटि उस तरह से थी जिसे संकलित किया गया था, मैंने अंतिम ऑब्जेक्ट को देखने के लिए objdump का उपयोग किया और यह पता चला कि "asm वाष्पशील" का उपयोग करके भी दर्ज किए गए प्रत्येक फ़ंक्शन को पुश पुश ईबप, मूव एबप, एस्प के साथ किया गया था। फिर शुरुआती स्टैक को पुनर्स्थापित करने के लिए बस इसमें एक पॉपल ईबप जोड़ें और यह बिना असफलता के तर्कों को पारित कर देगा। यहां मैं उन लोगों के लिए कोड संलग्न करता हूं जो इसे जांचना चाहते हैं और यदि आप यह पता लगा सकते हैं कि टाइमर द्वारा व्यवधान क्यों उत्पन्न नहीं हुआ है, तो मुझे यह जानना अच्छा लगेगा और मैं एक लिंक संलग्न करता हूं जहां वे मल्टीटास्किंग के बारे में बात करते हैं http://www.jamesmolloy.co.uk/tutorial_html/9.-Multitasking.html
    अगला डिवेल
    https://www.mediafire.com/?kmo83dxyzc7c3cz

    1.    AdrianArroyoStreet कहा

      मैं समझ गया। यह एक और जगह पर एक बग था जिसने टाइमर तस्वीर के सक्रियण को प्रभावित किया, विशेष रूप से आईआरक्यू रीमैप में दो लाइनें थीं जिन्हें मुझे संशोधित करना था। इस तथ्य के लिए धन्यवाद कि मैं एक वेबसाइट पर एक कोड देख सकता हूं जो उस बिंदु पर कुछ अलग था और क्लिक करें! परिवर्तन की तर्ज पर था:
      ND :: पोर्ट्स :: आउटपुटबी (PIC1 + 1, 0xFF);
      ND :: पोर्ट्स :: आउटपुटबी (PIC2 + 1, 0xFF);

      आपको 0xFF से मान बदलना था (मैं कहूंगा कि यह अक्षम को इंगित करता है) को 0x00 (मैं कहूंगा कि यह सक्षम इंगित करता है) हालांकि मैं वास्तव में निश्चित नहीं हूं, लेकिन यह काम करता है। मैंने GitHub पर कोड अपडेट किया है। इस समस्या के कारण मुझे थोड़ी बहुत जो परियोजना छोड़नी पड़ी, उसकी मदद करने के लिए बहुत-बहुत धन्यवाद। एच

      1.    Carlosorta कहा

        आपका स्वागत है, मैं इस विषय पर अगले अपडेट का इंतजार करूंगा और आप मेरे लिए कुछ भी Y (Y) पर भरोसा कर सकते हैं

      2.    Carlosorta कहा

        कीबोर्ड स्ट्रिंग कैप्चर रूटीन बदलें; क्योंकि यह कुंजी को जारी करने के क्षण में पढ़ रहा है और यह बफर में 0 को मापता है, जिससे रीडिंग में समस्या आती है और अंत में '\ n' इसे इसे »में बदल देता है ताकि सही प्रिंटिंग काम करे

  8.   मिट्टी का पेरेज़ कहा

    नमस्कार, मैंने आपकी पूरी पोस्ट पढ़ी, हालाँकि व्यवहार में यह 2 पोस्ट से अधिक नहीं है, यह वास्तव में बहुत अच्छा है, सब कुछ बचा लो, लेकिन मुझे इसे समझने के लिए c ++ और पॉज़िक्स का अध्ययन करने की आवश्यकता होगी क्योंकि मैं "c" के बारे में जानता हूँ ( मैं उस प्रोग्रामिंग भाषा पर मोहित हो गया) लेकिन यद्यपि c ++ c OO है, मैंने वास्तव में उस पर कभी काम नहीं किया है, मुझे कुछ ट्यूटोरियल पढ़े हैं और फिर मैं इसे बहुत ही रोचक और एक प्रश्न देता हूं, क्या विंडो स्टार्टअप लिनक्स के समान है?

    1.    AdrianArroyoStreet कहा

      विंडोज में बूट करना इस अर्थ में समान है कि यह एक x86 प्रोसेसर के साथ सिस्टम को बूट करने का तरीका है और इस पर निर्मित ऑपरेटिंग सिस्टम बहुत कम प्रभाव डालता है। हम वास्तव में वैसे भी खुद को बूट नहीं कर रहे हैं, यह हमारे लिए GRUB शुरू कर रहा है। GRUB, लिनक्स को बूट करने के लिए डिज़ाइन किया गया है, विंडोज बूट कर सकता है और इस मामले में NextDivel।

      1.    भिगो दिया कहा

        ठीक है धन्यवाद, इसका मतलब है कि मैं जो करना चाहता हूं वह संभव है मैं पहले से ही c ++ का अध्ययन कर रहा हूं और मैंने कुछ एप्लिकेशन बनाए हैं और आपके सिस्टम को एक पेनड्राइव पर स्थापित किया है और मैं इसे और अधिक विस्तार से पढ़ रहा हूं यह एक बहुत अच्छी पोस्ट है