इमुलेटिंग लिनस टोरवाल्ड्स: स्क्रॅचपासून आपली स्वतःची ऑपरेटिंग सिस्टम तयार करा (III)

आमची ऑपरेटिंग सिस्टम कशी तयार करावी यासाठी आम्ही पोस्टची ही मालिका सुरू ठेवतो. आज आपण एका विषयावर लक्ष केंद्रित करणार नाही परंतु आम्ही आतापासून काही उपयुक्त कार्ये परिभाषित करणार आहोत. प्रथम आपण कार्ये पूर्ण करणार्या 3 फंक्शन्सची व्याख्या करणार आहोत मेमकपी, मेमसेट y memcmp:

void* ND::Memory::Set(void* buf, int c, size_t len)
{
unsigned char* tmp=(unsigned char*)buf;
while(len--)
{
*tmp++=c;
}
return buf;
}
void* ND::Memory::Copy(void* dest,const void* src, size_t len)
{
const unsigned char* sp=(const unsigned char*)src;
unsigned char* dp=(unsigned char*)dest;
for(;len!=0;len--) *dp++=*sp++;
return dest;
}
int ND::Memory::Compare(const void* p1, const void* p2, size_t len)
{
const char* a=(const char*)p1;
const char* b=(const char*)p2;
size_t i=0;
for(;i<len;i++)
{
if(a[i] < b[i]) return -1; else if(a[i] > b[i])
return 1;
}
return 0;
}

ते सर्व स्वत: ची अंमलबजावणी करीत आहेत. ही कार्ये मी एका छोट्या सी लायब्ररीतून घेतली आहेत, अंमलबजावणी सहसा सर्व ऑपरेटिंग सिस्टममध्ये समान असते. आता आपण 3 सिम्युलेटेड फंक्शन्स करणार आहोत परंतु स्ट्रिंग्समध्ये बदल करण्यासाठी. ते त्यांचे कार्य पूर्ण करतील strcpy, strcat y strcmp.

size_t ND::String::Length(const char* src)
{
size_t i=0;
while(*src--)
i++;
return i;
}
int ND::String::Copy(char* dest, const char* src)
{
int n = 0;
while (*src)
{
*dest++ = *src++;
n++;
}
*dest = '';
return n;
}
int ND::String::Compare(const char *p1, const char *p2)
{
int i = 0;
int failed = 0;
while(p1[i] != '' && p2[i] != '')
{
if(p1[i] != p2[i])
{
failed = 1;
break;
}
i++;
}
if( (p1[i] == '' && p2[i] != '') || (p1[i] != '' && p2[i] == '') )
failed = 1;
return failed;
}
char *ND::String::Concatenate(char *dest, const char *src)
{
int di = ND::String::Length(dest);
int si = 0;
while (src[si])
dest[di++] = src[si++];
dest[di] = '';
return dest;
}

आम्ही आता काही अत्यंत मनोरंजक कार्ये करीत आहोत. या फंक्शन्सद्वारे आम्ही हार्डवेअर पोर्ट वाचू आणि लिहू शकतो. हे सहसा एएसएम सह केले जाते आणि सूचनांशी संबंधित (x86 वर) केले जाते in y बाहेर. सी कडून एएसएम सहजपणे कॉल करण्यासाठी, सूचना वापरा asm, धोक्यात आहे की ते पोर्टेबल नाही हे आवश्यक आहे. या वाक्यात आम्ही जोडतो अस्थिर जेणेकरून जीसीसी तो मजकूर ऑप्टिमाइझ करण्याचा प्रयत्न करीत नाही. दुसरीकडे, एएसएम सूचनांमध्ये पॅरामीटर्स स्वीकारण्याचा एक उत्सुक मार्ग आहे, परंतु मला असे वाटते की उदाहरणे पाहून ते अधिक चांगले समजले.

void ND::Ports::OutputB(uint16_t port, uint8_t value)
{
asm volatile("outb %1, %0" : : "dN"(port), "a"(value));
}
uint8_t ND::Ports::InputB(uint16_t _port)
{
unsigned char rv;
asm volatile("inb %1, %0" : "=a"(rv) : "dN"(_port));
return rv;
}

आणि आतापर्यंत post नंतर, आज आम्ही काही चांगले काम केले नाही परंतु आम्ही कार्ये निश्चित केली आहेत जी भविष्यासाठी उपयुक्त आहेत. मी निश्चित करण्याचे काम करीत असलेल्या-3-बिट वापरकर्त्यांना सूचना द्या किडा जे b 64 बिट मध्ये अचूकपणे संकलित करण्यास प्रतिबंधित करते. पुढील पोस्टमध्ये आपण जीडीटी, एक्स 86 आर्किटेक्चरचा एक महत्त्वाचा घटक पाहू.


आपली टिप्पणी द्या

आपला ई-मेल पत्ता प्रकाशित केला जाणार नाही. आवश्यक फील्ड चिन्हांकित केले आहेत *

*

*

  1. डेटा जबाबदार: मिगुएल Áन्गल गॅटन
  2. डेटाचा उद्देशः नियंत्रण स्पॅम, टिप्पणी व्यवस्थापन.
  3. कायदे: आपली संमती
  4. डेटा संप्रेषण: कायदेशीर बंधन वगळता डेटा तृतीय पक्षास कळविला जाणार नाही.
  5. डेटा संग्रहण: ओकेन्टस नेटवर्क (EU) द्वारा होस्ट केलेला डेटाबेस
  6. अधिकारः कोणत्याही वेळी आपण आपली माहिती मर्यादित, पुनर्प्राप्त आणि हटवू शकता.

  1.   नाव म्हणाले

    आपण बग कसे सोडवायचे यावर टिप्पणी दिली की नाही ते पाहूया, कारण मी पहिल्या भागातून प्रगती केली नाही.

    1.    O_Pixote_O म्हणाले

      मला असे वाटते की त्यांनी पोस्ट 2 च्या टिप्पण्यांमधील त्रुटीवर टिप्पणी केली आहे. मला योग्यरित्या आठवत असेल तर ते ग्रीबमधून काहीतरी आहे असे त्यांना वाटले

  2.   ब्लूस्कुल म्हणाले

    बाय बाय बाय कॉपी?

    1.    ब्लूस्कुल म्हणाले

      बाइट बाईट स्पष्टपणे ..., सलग 2 अपयश यशस्वी होत नाहीत, याची पुष्टी केली.

  3.   रुबीएक्सएनयूएमएक्स म्हणाले

    खूप चांगल्या पोस्टबद्दल तुमचे आभार आणि मी त्याचे अनुसरण करीत आहे, मला काही प्रश्न आहेतः
    १. जेव्हा तुम्ही म्हणता 'एएसएमला सीमधून सोप्या मार्गाने कॉल करण्यासाठी,' एएसएम सूचना वापरली जाते, त्या धोक्यासह ती पोर्टेबल नाही 'असे म्हटले जाते तेव्हा आपण काय म्हणता त्याचा अर्थ असा होतो' की त्या धोक्याने पोर्टेबल नाही. '?

    २. जर एखादी 'प्रोफेशनल' ऑपरेटिंग सिस्टम बनवायची असेल (तर बोलण्यासाठी) हार्डवेअरमध्ये प्रवेश करण्याचा हा भाग असेंबलरमध्ये केला जाईल.

    As. हे असेंबलरमध्ये कसे केले जाईल?

    1.    अ‍ॅड्रियनअरोयोस्ट्रिट म्हणाले

      त्याचे अनुसरण केल्याबद्दल धन्यवाद, मी प्रश्नांची उत्तरे एकेक करून देईन:
      1- ठीक आहे, एएसएम सूचनेची समस्या अशी आहे की ती कोणत्याही सी मानकात अस्तित्त्वात नाही, म्हणून प्रत्येक संकलक हे त्याच्या स्वत: च्या मार्गाने लागू करतो (जर ते अंमलात आणत असेल तर). या प्रकरणात हे जीसीसी आणि क्लंगसह संकलित केले जाऊ शकते (हे या दृष्टीने जीसीसीसारखे दिसते) परंतु आपण इंटेल सी सारख्या इतर कंपाईलरमध्ये (एएसएममध्ये इंटेल सिंटॅक्स वापरत नाही) सक्षम करू शकणार नाही.
      2- व्यावसायिकदृष्ट्या, एक भाग आणि दुसरा भाग आर्किटेक्चर आणि दुसरा सामान्य भाग स्पष्टपणे विभक्त करावा. हे असेंबलरमध्ये करणे आवश्यक नाही (लिनक्सचे ते सी मध्ये आहे)
      - असेंबलरमध्ये हे अगदी सोपे आहे, परंतु आपल्याकडे ते वेगळ्या फाईलमध्ये आहे. दुसरीकडे, युक्तिवाद केल्याने आपण प्रथम ते रजिस्टरकडे पाठविलेच पाहिजे आणि ते अधिक गडबड करू शकेल, त्यानंतर आउटब किंवा इनब म्हणतात आणि हे कार्य जागतिक स्तरावर दृश्यमान म्हणून घोषित केले जाते. तर सी कडून आपल्याला एक शीर्षलेख तयार करावा लागेल जो "बाह्य" कार्य घोषित करेल. एनएएसएम (इंटेल सिंटॅक्स) मध्ये हे असे काहीतरी असेलः
      बाहेर जाणे:
      ईबीपी पुश करा
      Mov ebp, esp

      मोव्हएक्स, [ebp + 12]
      मूव्ह ईडीएक्स, [ebp + 8]

      आउट डीएक्स, अल

      Mov esp, ebp
      पॉप ebp
      नकार

  4.   कमाल म्हणाले

    प्रश्न, आपण कोणता वाक्यरचना वापरता? मला समजत नाही की इतके भिन्न asm xD MASM, FASM, NASM, AT & T ...
    आणि आपल्याकडे वेळ असल्यास, आपण ओळ स्पष्ट करू शकाल:
    asm अस्थिर ("outb% 1,% 0" :: "dN" (पोर्ट), "अ" (मूल्य));

    "एएसएम अस्थिर" पर्यंत मला xD "1,0" द्वारे समजले?
    किंवा ते 1 -> »डीएन» (पोर्ट), 0 -> «ए» (मूल्य) आहे?
    हे नंतरचे असल्यास, "डीएन" म्हणजे काय आणि "ए" काय आहे हे मला समजत नाही ...

    आपल्या योगदानाबद्दल धन्यवाद! अविश्वसनीय !!

    1.    अ‍ॅड्रियनअरोयोस्ट्रिट म्हणाले

      मी वापरत असलेला वाक्यरचना एटी अँड टी आहे जीसीसी अंतर्गत वापरतो तो एनएएसएम मध्ये त्रास न करता करता केला जाऊ शकतो (वाक्यरचना रुपांतर करणे). एएमएम अस्थिर असलेल्या जटिल विधानाबद्दल मी केवळ सांगू शकतो की जीसीसीमुळे हे आहे कारण डेटा कसा पास केला जावा हे जाणून घेण्यासाठी ते काही पॅरामीटर्स वापरतात. उदाहरणार्थ "ए" एक खास x86 ऑपरेंड आहे जो रजिस्टरचे प्रतिनिधित्व करण्यासाठी वापरला जातो. संपूर्ण यादी येथे आहे: http://gcc.gnu.org/onlinedocs/gcc/Constraints.html#Constraints

  5.   charizardfire52 म्हणाले

    बरं, मला खरोखर मदतीची आवश्यकता आहे, मी यात नवीन आहे आणि टर्मिनलमध्ये जे लिहिले आहे त्याचे काय करावे याची मला थोडीशी कल्पना नाही.