Emulation Linus Torvalds: Kreye pwòp sistèm opere ou nan grate (II)

Byenveni nan yon lòt pòs sou kòman yo kreye pwòp sistèm opere nou an, nan ka sa a NextDivel.

Si nou tounen nan kòd la nan premye pòs nan fen tout bagay nou ta dwe vini ak yon bagay tankou sa a:

NextDivel-1

Si sa kòrèk nou ka kontinye. Mwen pral sèvi ak sistèm lan ak estrikti ke mwen genyen sou GitHub (http://github.com/AdrianArroyoCalle/next-divel) kòm li pi alèz pou mwen ak ou. Kòm ou ka wè tèks la se yon tèks debaz, li pa atire. Li ka sanble tankou yon bagay soti nan òdinè a. Men, jan li di a ale, nan gou koulè, ak nan sistèm opere nou an pral gen koulè. Koulè yo an premye ke nou yo pral kapab mete yo pral sa yo ki defini kat yo VGA ak yo se 0:

  1. Nwa
  2. Azoul
  3. Green
  4. Syan
  5. Wouj
  6. Magenta
  7. Marrón
  8. Limyè gri
  9. Gri nwa
  10. Limyè ble
  11. Limyè vèt
  12. Cyan klè
  13. Limyè wouj
  14. Limyè magenta
  15. Limyè mawon
  16. Blanco

Nou pral defini koulè sa yo nan yon header gen li plis sou la men e petèt nan tan kap vini an vin yon pati nan sistèm API la. Se konsa, nou kreye dosye a ND_Colors.hpp nan NextDivel a gen ladan yo.

#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

An menm tan an nou pral defini nouvo fonksyon yo ekri sou ekran an nan yon fason pi konfòtab (non, nou pa yo pral aplike printf ankò, mwen konnen ou vle li). Nou pral kreye yon dosye ak header li yo pou yon seri fonksyon ki gen rapò ak ekran (ND_Screen.cpp ak ND_Screen.hpp). Nan yo nou pral kreye fonksyon nan: chanje koulè a ​​nan lèt yo ak background nan, ekri fraz ak lèt, netwaye ekran an ak deplase nan ekran an. Nou kontinye lè l sèvi avèk ekran VGA yo men kounye a nou pral sèvi ak kèk bytes ki pral bay koulè a. ND_Screen.cpp ta sanble:

/**
* @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;
}

Tèt la pral trè debaz Se konsa, mwen pa enkli li isit la, men mete aksan sou definisyon an nan kalite ND_SIDE la

typedef enum ND_SIDE{
ND_SIDE_BACKGROUND,
ND_SIDE_FOREGROUND
} ND_SIDE;

Tou mansyone ke nou fè pou sèvi ak header la ND_Types.hpp, header sa a defini kèk kalite debaz pou uint8_t, uint16_t, elatriye ki baze sou char ak int. Aktyèlman header sa a se youn nan estanda C99 la e an reyalite ND_Types.hpp mwen se yon kopi / keratin nan dosye ki soti nan Linux, kidonk, ou ka chanje yo e pa gen anyen ki ta rive (gen sèlman definisyon, pa gen fonksyon).

Pou teste si kòd sa a ap travay nou pral modifye pwen antre C nan Kernel la:

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

Men, si nou swiv etap sa yo nou ta jwenn rezilta sa a

NextDivel-3

Mèsi a fonksyon sa yo ke nou te kreye, nou ka kòmanse fè ti entèfas, tankou yon panik Kernel ke nou pral montre chak fwa gen yon erè irevokabl. Yon bagay tankou sa a:

NextDivel-4

Ak sa a entèfas ti kras nou te fè l 'sèlman ak fonksyon sa yo:

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

Ak jiska isit la post la. Mwen fè ou sonje nan enstriksyon yo konpile sistèm lan soti nan 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

Apre sa, mwen pran opòtinite sa a di ou mèsi pou resepsyon an ekselan ke premye pòs la te gen.


Kontni an nan atik la respekte prensip nou yo nan etik editoryal. Pou rapòte yon erè klike sou isit la.

5 kòmantè, kite ou

Kite kòmantè ou

Adrès imèl ou pa pral dwe pibliye. Jaden obligatwa yo make ak *

*

*

  1. Responsab pou done yo: Miguel Ángel Gatón
  2. Objektif done yo: Kontwòl SPAM, jesyon kòmantè.
  3. Lejitimasyon: konsantman ou
  4. Kominikasyon nan done yo: done yo pa pral kominike bay twazyèm pati eksepte pa obligasyon legal.
  5. Done depo: baz done anime pa rezo Occentus (Inyon Ewopeyen)
  6. Dwa: Nenpòt ki lè ou ka limite, refè ak efase enfòmasyon ou yo.

  1.   F3niX diro

    Excellent zanmi, menm si mwen touye kas mwen an konprann kòd la nan c ++.

    Bonjou.

  2.   pandakris diro

    atik sa yo se gwo. Yo te pike kiryozite mwen sou pèfòmans nan nivo ki ba nan processeurs yo yon lòt fwa ankò.
    petèt si mwen gen tan mwen pral kòmanse jwe ak pwochen-divel.
    Mwen pa voye yon atik depi lontan. deja bezwen

  3.   Jon burrows diro

    Oke, se fason sa.

  4.   Miguel diro

    Mwen te lontan vle konnen ki jan yo bati yon sistèm opere.

    Ap tann pou pwochen pòs ou. concerne

  5.   julian diro

    Gran zanmi!
    Mwen jis gen yon sèl pwoblèm, èske yon moun ka pase m 'yon dosye C nan egzanp sa a?
    Li toujou voye m 'erè nan tèminal la