עמיאַלייטינג Linus Torvalds: שאַפֿן דיין אייגענע אָפּערייטינג סיסטעם פֿון קראַצן (II)

ברוכים הבאים צו אן אנדער פּאָסטן וועגן ווי צו שאַפֿן אונדזער אייגענע אָפּערייטינג סיסטעם, אין דעם פאַל NextDivel.

אויב מיר גיין צוריק צו די קאָד פון די ערשטער פּאָסטן אין די סוף פון אַלץ מיר זאָל האָבן קומען מיט עפּעס ווי דאָס:

ווייַטערדיוועל-1

אויב דאָס איז ריכטיק מיר קענען פאָרזעצן. איך וועל נוצן די סיסטעם און סטרוקטור אַז איך האָבן אויף גיטהוב (http://github.com/AdrianArroyoCalle/next-divel) ווייַל עס איז מער באַקוועם פֿאַר מיר און איר. ווי איר קענען זען די טעקסט איז אַ יקערדיק טעקסט, עס איז נישט אַטראַקטיוו. עס קען ויסקומען ווי עפּעס ומגעוויינטלעך. אָבער, ווי דער זאגן גייט, צו טעם פארבן, און אין אונדזער אָפּערייטינג סיסטעם עס וועט זיין פארבן. די ערשטע פארבן וואָס מיר וועלן שטעלן קענען זיין די וואָס דעפינירן די VGA קאַרדס און זיי זענען 0:

  1. שוואַרץ
  2. אַזול
  3. גרין
  4. סיאַן
  5. רויט
  6. מאַגענטאַ
  7. ברוין
  8. ליכט גרוי
  9. טונקל גרוי
  10. ליכט בלוי
  11. ליכט גרין
  12. סייאַן קלאָר
  13. ליכט רויט
  14. ליכט מאַגענטאַ
  15. ליכטיג ברוין
  16. בלאַנקאָ

מיר וועלן דעפינירן די פארבן אין אַ כעדער צו זיין מער האַנטיק און טאָמער אין דער צוקונפֿט ווערן טייל פון די סיסטעם אַפּי. אַזוי מיר מאַכן די טעקע ND_Colors.hpp אין די NextDivel אַרייַננעמען.

#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

אין דער זעלביקער צייט מיר וועלן דעפינירן נייַע פאַנגקשאַנז צו שרייַבן אויף דעם עקראַן אין אַ מער באַקוועם וועג (ניין, מיר וועלן נישט ינסטרומענט פּרינטף נאָך, איך וויסן אַז איר ווילט עס). מיר וועלן שאַפֿן אַ טעקע און די כעדער פֿאַר אַ סכום פון פאַרשטעלן-פֿאַרבונדענע פאַנגקשאַנז (ND_Screen.cpp און ND_Screen.hpp). אין זיי מיר מאַכן פאַנגקשאַנז צו: טוישן די קאָליר פון די אותיות און די הינטערגרונט, שרייַבן זאצן און אותיות, ריין די פאַרשטעלן און מאַך אַרום די פאַרשטעלן. מיר פאָרזעצן צו נוצן די VGA סקרינז, אָבער איצט מיר נוצן אַ ביסל ביטעס וואָס געבן די קאָליר. 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;
}

די כעדער וועט זיין זייער יקערדיק, אַזוי איך טאָן ניט אַרייַננעמען עס דאָ, אָבער איך הויכפּונקט די דעפֿיניציע פון ​​די ND_SIDE טיפּ

typedef enum ND_SIDE{
ND_SIDE_BACKGROUND,
ND_SIDE_FOREGROUND
} ND_SIDE;

דערמאָנען אויך אַז מיר נוצן די ND_Types.hpp כעדער, דעם כעדער דיפיינז עטלעכע יקערדיק טייפּס פֿאַר uint8_t, uint16_t, אאז"ו ו באזירט אויף טשאַר און ינט. אַקטואַללי דעם כעדער איז דער איינער אין די C99 סטאַנדאַרט און אין פאַקט, מיין ND_Types.hpp איז אַ קאָפּיע / פּאַפּ פון די טעקע פֿון Linux, אַזוי איר קענען וועקסל זיי און גאָרנישט וואָלט פּאַסירן (עס זענען בלויז זוך, קיין פאַנגקשאַנז).

צו פּרובירן אויב די קאָד אַרבעט, מיר וועלן צו מאָדיפיצירן די C פּאָזיציע פונט פון די קערן:

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

און אויב מיר נאָכפאָלגן די טריט, מיר וואָלט באַקומען דעם רעזולטאַט

ווייַטערדיוועל-3

דאַנק צו די פאַנגקשאַנז אַז מיר האָבן באשאפן, מיר קענען אָנהייבן צו מאַכן קליין גויס, אַזאַ ווי אַ קערנעל פּאַניק וואָס מיר וועט ווייַזן יעדער מאָל עס איז אַ אַנריוועראַבאַל טעות. עפּעס ווי דאָס:

ווייַטערדיוועל-4

און דאָס ביסל GUI מיר געמאכט עס בלויז מיט די פאַנגקשאַנז:

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

און איך נעמען די געלעגנהייט צו דאַנקען איר פֿאַר די ויסגעצייכנט אָפּטראָג אין דער ערשטער פּאָסטן.


דער אינהאַלט פון דעם אַרטיקל אַדכיר צו אונדזער פּרינציפּן פון לייט עטיקס. צו מעלדונג אַ טעות גיט דאָ.

5 באַמערקונגען, לאָזן דיין

לאָזן דיין באַמערקונג

אייער בליצפּאָסט אַדרעס וועט נישט זייַן ארויס.

*

*

  1. פאַראַנטוואָרטלעך פֿאַר די דאַטן: Miguel Ángel Gatón
  2. ציל פון די דאַטן: קאָנטראָל ספּאַם, קאָמענטאַר פאַרוואַלטונג.
  3. לעגיטימאַטיאָן: דיין צושטימען
  4. קאָמוניקאַציע פון ​​די דאַטן: די דאַטן וועט נישט זיין קאַמיונאַקייטיד צו דריט פּאַרטיעס אַחוץ דורך לעגאַל פליכט.
  5. דאַטן סטאָרידזש: דאַטאַבייס כאָוסטיד דורך Occentus Networks (EU)
  6. רעכט: צו קיין צייט איר קענט באַגרענעצן, צוריקקריגן און ויסמעקן דיין אינפֿאָרמאַציע.

  1.   F3niX דאָס

    ויסגעצייכנט פרייַנד, אפילו אַזוי איך טייטן מיין העלם פֿאַרשטיין די קאָד אין C ++.

    גרעעטינגס.

  2.   פּאַנדאַקריסס דאָס

    די ייטאַמז זענען גרויס. זיי האָבן פּיקיד מיין נייַגעריקייַט וועגן די נידעריק-פאָרשטעלונג פון די פּראַסעסערז ווידער.
    אפֿשר אויב איך האָבן צייַט איך וועט אָנהייבן פּלייינג מיט ווייַטער-דיוועל.
    איך האָב לאַנג נישט געשיקט אַן אַרטיקל. שוין דארף

  3.   דזשאָן בעראָוז דאָס

    גוט, דאָס איז די וועג.

  4.   מיגעל דאָס

    איך האָב לאַנג געוואלט צו בויען אַן אָפּערייטינג סיסטעם.

    ווארטן פֿאַר דיין ווייַטער פּאָסטן. טשעערס

  5.   דזשוליאַן דאָס

    גרויס פרייַנד!
    איך נאָר האָבן איין פּראָבלעם, קענען עמעצער פאָרן מיר אַ C טעקע פון ​​דעם בייַשפּיל?
    עס סענדז מיר שטענדיק ערראָרס אין די וואָקזאַל