এমুলেটিং লিনাস টোরভাল্ডস: স্ক্র্যাচ থেকে আপনার নিজস্ব অপারেটিং সিস্টেম তৈরি করুন (II)

এই ক্ষেত্রে নেক্সটডিভেল, কীভাবে আমাদের নিজস্ব অপারেটিং সিস্টেম তৈরি করবেন সে সম্পর্কে অন্য একটি পোস্টে আপনাকে স্বাগতম।

আমরা যদি কোডটিতে ফিরে যাই প্রথম পোস্ট সবকিছুর শেষে আমাদের এই জাতীয় কিছু নিয়ে আসা উচিত ছিল:

নেক্সটডিভেল-১

এটি সঠিক হলে আমরা চালিয়ে যেতে পারি। আমি গিটহাবের যে সিস্টেম এবং কাঠামো ব্যবহার করেছি তা ব্যবহার করতে যাচ্ছি (http://github.com/AdrianArroyoCalle/next-divel) কারণ এটি আমার এবং আপনার পক্ষে আরও স্বাচ্ছন্দ্যযুক্ত। আপনি দেখতে পাচ্ছেন যে পাঠ্যটি একটি মূল পাঠ্য, এটি আকর্ষণীয় নয়। এটি সাধারণের বাইরে কিছু মনে হতে পারে। তবে এই কথাটি যেহেতু, রঙের স্বাদ নিতে, এবং আমাদের অপারেটিং সিস্টেমে রঙ থাকবে। আমরা যে প্রথম রঙগুলি রাখতে সক্ষম হতে চলেছি সেগুলি হ'ল যা ভিজিএ কার্ডগুলি সংজ্ঞায়িত করে এবং তারা 0:

  1. কালো
  2. নীল
  3. ভার্দে
  4. সায়ান
  5. লাল
  6. ম্যাজেন্টা রঙ্
  7. কটা
  8. হালকা ধূসর
  9. গাঢ় ধূসর
  10. হালকা নীল
  11. হালকা সবুজ
  12. সায়ান পরিষ্কার
  13. লাল আলো
  14. হালকা ম্যাজেন্টা
  15. হালকা বাদামী
  16. ব্লাঙ্কো

আমরা আরও রঙিন করতে এই রঙগুলি একটি শিরোনামে সংজ্ঞায়িত করতে যাচ্ছি এবং সম্ভবত ভবিষ্যতে সিস্টেম API এর অংশ হয়ে উঠবে। সুতরাং আমরা নেক্সটডাইভেল অন্তর্ভুক্ত অন্তর্ভুক্ত এনডি_আরবোর্ড। Hp ফাইলটি তৈরি করি।

#ifndef ND_COLOR_HPP
#define ND_COLOR_HPP
typedef enum ND_Color{
ND_COLOR_BLACK = 0,
ND_COLOR_BLUE = 1,
ND_COLOR_GREEN = 2,
ND_COLOR_CYAN = 3,
ND_COLOR_RED = 4,
ND_COLOR_MAGENTA = 5,
ND_COLOR_BROWN = 6,
ND_COLOR_LIGHT_GREY = 7,
ND_COLOR_DARK_GREY = 8,
ND_COLOR_LIGHT_BLUE = 9,
ND_COLOR_LIGHT_GREEN = 10,
ND_COLOR_LIGHT_CYAN = 11,
ND_COLOR_LIGHT_RED = 12,
ND_COLOR_LIGHT_MAGENTA = 13,
ND_COLOR_LIGHT_BROWN = 14,
ND_COLOR_WHITE = 15
} ND_Color;
#endif

একই সাথে আমরা আরও আরামদায়ক উপায়ে স্ক্রিনে লিখতে নতুন ফাংশনগুলি সংজ্ঞায়িত করতে যাচ্ছি (না, আমরা এখনও প্রিন্টফ প্রয়োগ করতে যাচ্ছি না, আমি জানি আপনি এটি চাচ্ছেন) are আমরা স্ক্রিন-সম্পর্কিত ফাংশনগুলির একটি সেট (ND_Screen.cpp এবং ND_Screen.hpp) এর জন্য একটি ফাইল এবং এর শিরোনাম তৈরি করব। সেগুলিতে আমরা এতে ফাংশন তৈরি করতে যাচ্ছি: বর্ণগুলি এবং পটভূমির রঙ পরিবর্তন করুন, বাক্যাংশ এবং বর্ণগুলি লিখুন, স্ক্রিনটি পরিষ্কার করুন এবং স্ক্রিনের চারপাশে স্থানান্তরিত করুন। আমরা ভিজিএ স্ক্রিনগুলি ব্যবহার চালিয়ে যাচ্ছি তবে এখন আমরা কয়েকটি বাইট ব্যবহার করব যা রঙটি দেবে। ND_Screen.cpp দেখতে দেখতে এমন হবে:

/**
* @file ND_Screen.cpp
* @author Adrián Arroyo Calle
* @brief Implements four easy functions for write strings directly
*/
#include <ND_Types.hpp>
#include <ND_Color.hpp>
#include <ND_Screen.hpp>
uint16_t *vidmem= (uint16_t *)0xB8000;
ND_Color backColour = ND_COLOR_BLACK;
ND_Color foreColour = ND_COLOR_WHITE;
uint8_t cursor_x = 0;
uint8_t cursor_y = 0;
/**
* @brief Gets the current color
* @param side The side to get the color
* */
ND_Color ND::Screen::GetColor(ND_SIDE side)
{
if(side==ND_SIDE_BACKGROUND){
return backColour;
}else{
return foreColour;
}
}
/**
* @brief Sets the color to a screen side
* @param side The side to set colour
* @param colour The new colour
* @see GetColor
* */
void ND::Screen::SetColor(ND_SIDE side, ND_Color colour)
{
if(side==ND_SIDE_BACKGROUND)
{
backColour=colour;
}else{
foreColour=colour;
}
}
/**
* @brief Puts the char on screen
* @param c The character to write
* */
void ND::Screen::PutChar(char c)
{
uint8_t attributeByte = (backColour << 4) | (foreColour & 0x0F);
uint16_t attribute = attributeByte << 8; uint16_t *location; if (c == 0x08 && cursor_x) { cursor_x--; }else if(c == '\r') { cursor_x=0; }else if(c == '\n') { cursor_x=0; cursor_y=1; } if(c >= ' ') /* Printable character */
{
location = vidmem + (cursor_y*80 + cursor_x);
*location = c | attribute;
cursor_x++;
}
if(cursor_x >= 80) /* New line, please*/
{
cursor_x = 0;
cursor_y++;
}
/* Scroll if needed*/
uint8_t attributeByte2 = (0 /*black*/ << 4) | (15 /*white*/ & 0x0F);
uint16_t blank = 0x20 /* space */ | (attributeByte2 << 8); if(cursor_y >= 25)
{
int i;
for (i = 0*80; i < 24*80; i++)
{
vidmem[i] = vidmem[i+80];
}
// The last line should now be blank. Do this by writing
// 80 spaces to it.
for (i = 24*80; i < 25*80; i++)
{
vidmem[i] = blank;
}
// The cursor should now be on the last line.
cursor_y = 24;
}
}
/**
* @brief Puts a complete string to screen
* @param str The string to write
* */
void ND::Screen::PutString(const char* str)
{
int i=0;
while(str[i])
{
ND::Screen::PutChar(str[i++]);
}
}
/**
* @brief Cleans the screen with a color
* @param colour The colour to fill the screen
* */
void ND::Screen::Clear(ND_Color colour)
{
uint8_t attributeByte = (colour /*background*/ << 4) | (15 /*white - foreground*/ & 0x0F);
uint16_t blank = 0x20 /* space */ | (attributeByte << 8);
int i;
for (i = 0; i < 80*25; i++)
{
vidmem[i] = blank;
}
cursor_x = 0;
cursor_y = 0;
}
/**
* @brief Sets the cursor via software
* @param x The position of X
* @param y The position of y
* */
void ND::Screen::SetCursor(uint8_t x, uint8_t y)
{
cursor_x=x;
cursor_y=y;
}

শিরোনামটি খুব বেসিক হবে সুতরাং আমি এটিকে এখানে অন্তর্ভুক্ত করব না তবে এনডিএসআইডিআইডি ধরণের সংজ্ঞাটি হাইলাইট করব

typedef enum ND_SIDE{
ND_SIDE_BACKGROUND,
ND_SIDE_FOREGROUND
} ND_SIDE;

এছাড়াও উল্লেখ করুন যে আমরা ND_Types.hpp হেডার ব্যবহার করি, এই হেডারটি char এবং int-এর উপর ভিত্তি করে uint8_t, uint16_t ইত্যাদির জন্য কিছু মৌলিক প্রকার নির্ধারণ করে। আসলে এই হেডারটি C99 স্ট্যান্ডার্ডের একটি এবং আসলে আমার ND_Types.hpp ফাইলটির একটি কপি/পেস্ট desde Linux, তাই আপনি তাদের বিনিময় করতে পারেন এবং কিছুই হবে না (শুধুমাত্র সংজ্ঞা আছে, কোন ফাংশন নেই)।

এই কোডটি কাজ করে কিনা তা পরীক্ষা করার জন্য আমরা কার্নেলের সি এন্ট্রি পয়েন্টটি সংশোধন করতে যাচ্ছি:

ND::Screen::Clear(ND_COLOR_WHITE);
ND::Screen::SetColor(ND_SIDE_BACKGROUND,ND_COLOR_WHITE);
ND::Screen::SetColor(ND_SIDE_FOREGROUND,ND_COLOR_GREEN);
ND::Screen::PutString("NextDivel\n");
ND::Screen::SetColor(ND_SIDE_FOREGROUND,ND_COLOR_BLACK);
ND::Screen::PutString("Licensed under GNU GPL v2");

এবং যদি আমরা এই পদক্ষেপগুলি অনুসরণ করি তবে আমরা এই ফলাফলটি পেতে পারি

নেক্সটডিভেল-১

আমরা তৈরি এই ফাংশনগুলির জন্য ধন্যবাদ, আমরা ছোট জিইউআই তৈরি করতে শুরু করতে পারি, যেমন একটি কার্নেল আতঙ্ক যা আমরা প্রতিবার একটি অপ্রাপ্তযোগ্য ত্রুটি দেখাতে দেখাব। এটার মতো কিছু:

নেক্সটডিভেল-১

এবং এই সামান্য জিইউআই আমরা কেবল এই ফাংশন দিয়ে তৈরি করেছি:

void ND::Panic::Show(const char* error)
{
ND::Screen::Clear(ND_COLOR_RED);
ND::Screen::SetColor(ND_SIDE_BACKGROUND, ND_COLOR_WHITE);
ND::Screen::SetColor(ND_SIDE_FOREGROUND, ND_COLOR_RED);
ND::Screen::SetCursor(29,10); //(80-22)/2
ND::Screen::PutString("NextDivel Kernel Error\n");
ND::Screen::SetCursor(15,12);
ND::Screen::PutString(error);
}

এবং এখানে পোস্ট। আমি আপনাকে সিস্টেমটি 0 থেকে সংকলনের নির্দেশাবলী স্মরণ করিয়ে দিচ্ছি:

git clone http://github.com/AdrianArroyoCalle/next-divel
cd next-divel
mkdir build && cd build
cmake ..
make
make DESTDIR=next install
chmod +x iso.sh
./iso.sh
qemu-system-i386 nextdivel.iso

এবং আমি প্রথম পোস্টটি যে চমৎকার অভ্যর্থনা জানাতে ধন্যবাদ জানাতে এই সুযোগটি গ্রহণ করছি।


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

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

*

*

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

  1.   f3niX তিনি বলেন

    দুর্দান্ত বন্ধু, তবুও আমি কোডটি সি ++ তে বুঝতে পেরে আমার হেলমেটটি হত্যা করছি।

    গ্রিটিংস।

  2.   প্যান্ডাক্রিস তিনি বলেন

    এই আইটেম দুর্দান্ত। প্রসেসরের নিম্ন-স্তরের পারফরম্যান্স সম্পর্কে তারা আমার কৌতুহলকে আরও একবার স্পষ্ট করে তুলেছে।
    আমার যদি সময় থাকে তবে আমি পরের ডাইভেল দিয়ে খেলতে শুরু করব।
    আমি একটি দীর্ঘ সময় জন্য একটি নিবন্ধ প্রেরণ না। ইতিমধ্যে প্রয়োজন

  3.   জন বুড়ো তিনি বলেন

    ঠিক আছে, এটাই পথ।

  4.   মিগুয়েল তিনি বলেন

    অপারেটিং সিস্টেম কীভাবে তৈরি করা যায় তা আমি দীর্ঘদিন জানতে চেয়েছিলাম।

    আপনার পরবর্তী পোস্টের জন্য অপেক্ষা করছি। চিয়ার্স

  5.   giuliano তিনি বলেন

    মহান বন্ধু!
    আমার কেবল একটি সমস্যা আছে, কেউ কি আমাকে উদাহরণের একটি সি ফাইল পাস করতে পারেন?
    এটি সর্বদা আমাকে টার্মিনালে ত্রুটি প্রেরণ করে