অনুকরণ লিনাস টরভাল্ডস: 0 (ভি) থেকে আপনার নিজস্ব অপারেটিং সিস্টেম তৈরি করুন

এই পঞ্চম কিস্তিতে আমরা জিডিটি-র মত একইভাবে একটি টেবিল দেখতে পাব তাত্ত্বিকভাবে এবং ব্যবহারে, আমরা আইডিটি উল্লেখ করি। আইডিটি মানে বিঘ্নিত বিবরণ সারণী y হ'ল একটি টেবিল যা ব্যবহৃত হওয়া বাধা হ্যান্ডেল করতে ব্যবহৃত হয়। উদাহরণস্বরূপ, কেউ 0 দ্বারা বিভাজন করে, প্রসেসিংয়ের দায়িত্বে ফাংশন বলা হয়। এই ফাংশনগুলি হ'ল আইএসআর (বিঘ্নিত পরিষেবার রুটিনগুলি)। সুতরাং আসুন আইডিটি তৈরি করুন এবং কিছু আইএসআর যুক্ত করি।

প্রথমে আমরা IDT এর সাথে সম্পর্কিত কাঠামোগুলি ঘোষণা করতে চলেছি:

struct Entry{
uint16_t base_low;
uint16_t sel;
uint8_t always0;
uint8_t flags;
uint16_t base_high;
} __attribute__((packed));
struct Ptr{
uint16_t limit;
uint32_t base;
} __attribute__((packed));

আপনি যদি এটি জিডিটির সাথে তুলনা করেন তবে দেখা যাবে, পিটিআর কাঠামোটি অভিন্ন এবং এন্ট্রিটি বেশ অনুরূপ। সুতরাং একটি এন্ট্রি স্থাপন (সেটগেট) স্থাপন এবং ইনস্টল (ইনস্টল) এর কাজগুলি খুব একই রকম।

void ND::IDT::SetGate(uint8_t num,uint32_t base,uint16_t sel, uint8_t flags)
{
idt[num].base_low=(base & 0xFFFF);
idt[num].base_high=(base >> 16) & 0xFFFF;
idt[num].sel=sel;
idt[num].always0=0;
idt[num].flags=flags;
}

ইনস্টল করুন:

idtptr.limit=(sizeof(struct ND::IDT::Entry)*256)-1;
idtptr.base=(uint32_t)&idt;
ND::Memory::Set(&idt,0,sizeof(struct ND::IDT::Entry)*256);
ND::IDT::Flush();

আমরা যদি দেখি যে ইনস্টল ফাংশনটি এনডি :: মেমরি :: সেট ফাংশনটি ব্যবহার করে যা আমরা অন্য পোস্টে ঘোষণা করেছিলাম। আমরা কীভাবে এখনও সেটগেটে কোনও কল করি না এবং আমরা এনডি :: আইডিটি :: ফ্লাশকে কল করি তাও আমরা উপলব্ধি করতে পারি, এই ফাংশনের জন্য আমরা আবার অ্যাসটি অস্থির বিবৃতি ব্যবহার করি:

asm volatile("lidtl (idtptr)");

যদি সবকিছু ঠিকঠাক হয় এবং আমরা একটি নান্দনিক ব্যবস্থা করি তবে এটি দেখতে এইরকম হওয়া উচিত:

নেক্সটডাইভেল-আইডিটি

ঠিক আছে, এখন আমরা বাধা দিয়ে আইডিটি পূরণ করা শুরু করতে যাচ্ছি। এখানে আমি কেবল একটি তৈরি করতে যাচ্ছি তবে বাকীগুলির জন্য এটি একই হবে। আমি শূন্য বিরতি দিয়ে বিভাজন করতে যাচ্ছি। আপনি যেমন গণিতে ভাল জানেন, একটি সংখ্যা 0 দ্বারা ভাগ করা যায় না যদি এটি প্রসেসরে ঘটে তবে একটি ব্যতিক্রম উত্পন্ন হয় যেহেতু এটি চালিয়ে যেতে পারে না। আইডিটি-তে তালিকার প্রথম বাধা (0) এই ইভেন্টের সাথে মিলে যায়।

আমরা এটি আইডিটির ইনস্টল ফাংশনের মধ্যে মেমরি সেটিংস এবং ফ্লাশের মধ্যে যুক্ত করব:

ND::IDT::SetGate(0,(unsigned)ND::ISR::ISR1,0x08,0x8E);

কলব্যাক ফাংশনটি এনডি :: আইএসআর :: আইএসআর 1 হতে চলেছে যা বেশ সহজ যদিও আমাদের অবশ্যই এএসএম ব্যবহার করতে হবে:

void ND::ISR::ISR1()
{
asm volatile(
"cli \n"
"pushl 0 \n"
"pushl 0 \n"
"jmp ND_ISR_Common \n"
);
}

এনডি_আইএসআর_কমন আমরা সি ভাষায় এটি একটি ফাংশন হিসাবে সংজ্ঞায়িত করব files ফাইলগুলি সংরক্ষণ এবং পাঠযোগ্যতার উন্নতি করতে আমরা বহিরাগত «সি« {} ব্যবহার করতে পারি:

extern "C"
void ND_ISR_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_ISR_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"
);
}

এএসএম-এ এই কোডটি বোঝা কিছুটা কঠিন হতে পারে তবে এটি হ'ল কারণ আমরা বাধা দ্বারা উত্পন্ন ডেটা অ্যাক্সেস করতে সি-তে একটি কাঠামো ঘোষণা করতে যাচ্ছি। স্পষ্টতই, আপনি যদি এটি না চান, আপনি কেবল এনডি :: আইএসআর :: আইএসআর 1 বা এর মতো কিছুতে কর্নেল প্যানিক কল করতে পারেন। কাঠামোর একটি আকার আছে যা:

struct regs{
uint32_t ds;
uint32_t edi, esi, ebp, esp, ebx, edx, ecx, eax;
uint32_t int_no, err_code;
uint32_t eip, cs, eflags, useresp, ss;
};

এবং পরিশেষে আমরা এনডি_আইএসআর_হ্যান্ডলার ফাংশনটি তৈরি করি (একটি সি লিঙ্কের সাথেও) যেখানে আমরা একটি কার্নেল আতঙ্ক এবং ত্রুটির একটি তালিকাতে থাকা আমাদের অনুসারে ত্রুটির একটি ছোট বিবরণ প্রদর্শন করি।

extern "C"
void ND_ISR_Handler(struct regs *r)
{
if(r->int_no < 32) { ND::Panic::Show(exception_messages[r->int_no]);
for(;;);
}
}

ভাল এবং এর সাথে আমরা ইতিমধ্যে এই বাধাকে পরিচালনা করতে সক্ষম হয়েছি। বাকী বাধাগুলির সাথে এটি একই রকম হবে কেবল ব্যতীত এমন কিছু রয়েছে যেগুলি পরামিতি দেয় এবং আমরা এটি পেতে রেগ কাঠামোটি ব্যবহার করব। তবে, আপনি ভাবতে পারেন যে এটি কীভাবে কার্যকর হয় তা আমরা কীভাবে জানি। এটি কাজ করে কিনা তা পরীক্ষা করার জন্য, আমরা এনডি :: আইডিটি :: ইনস্টল () এর পরে একটি সাধারণ লাইন প্রবর্তন করতে যাচ্ছি:

int sum=10/0;

যদি আমরা এটি সংকলন করি তবে এটি আমাদের একটি সতর্কতা দেবে এবং যদি আমরা এটি কার্যকর করার চেষ্টা করি তবে আমরা একটি দুর্দান্ত পর্দা পেয়ে যাব:

নেক্সটডাইভেল-আইএসআর


এবং এর সাথে এই পোস্টটি শেষ হয়, আমি মনে করি এটি সর্বাধিক বিস্তৃত তবে বেশ কার্যকর।


আপনার মন্তব্য দিন

আপনার ইমেল ঠিকানা প্রকাশিত হবে না। প্রয়োজনীয় ক্ষেত্রগুলি দিয়ে চিহ্নিত করা *

*

*

  1. ডেটার জন্য দায়বদ্ধ: মিগুয়েল অ্যাঞ্জেল গাটান
  2. ডেটার উদ্দেশ্য: নিয়ন্ত্রণ স্প্যাম, মন্তব্য পরিচালনা।
  3. আইনীকরণ: আপনার সম্মতি
  4. তথ্য যোগাযোগ: ডেটা আইনি বাধ্যবাধকতা ব্যতীত তৃতীয় পক্ষের কাছে জানানো হবে না।
  5. ডেটা স্টোরেজ: ওসেন্টাস নেটওয়ার্কস (ইইউ) দ্বারা হোস্ট করা ডেটাবেস
  6. অধিকার: যে কোনও সময় আপনি আপনার তথ্য সীমাবদ্ধ করতে, পুনরুদ্ধার করতে এবং মুছতে পারেন।

  1.   মেসোডেবলার তিনি বলেন

    আমি এলএফএসে স্যুইচ করেছি, এটি আরও ক্রমাগত।

  2.   এলিওটাইম 3000 তিনি বলেন

    পবিত্র ... যাইহোক, টিউটোরিয়ালগুলি ভাল।

  3.   sc তিনি বলেন

    খুব ভাল, আমি প্রথম থেকেই এটি অনুসরণ করে আসছি। আপনি কি প্রতিটি ট্রেলারে কোডগুলি সংযুক্ত করতে পারবেন?

    1.    অ্যাড্রিয়ানআরয়েও স্ট্রিট তিনি বলেন

      গিটহাবটিতে আপনার কাছে সমস্ত উত্স কোড উপলব্ধ রয়েছে: http://github.com/AdrianArroyoCalle/next-divel সেখান থেকে আপনি একটি জিপ, একটি টিএআরজেড ডাউনলোড করতে পারেন বা কেবল গিট ব্যবহার করতে পারেন।

  4.   nuanced তিনি বলেন

    হাহাহাহা খুব ভাল! অনুমোদন! 🙂