Manahaka an'i Linus Torvalds: Mamorona rafitra fiasao anao avy eo am-boalohany (II)

Tongasoa eto amin'ny lahatsoratra iray hafa momba ny fomba hamoronana ny rafitra fiasanay manokana, amin'ity tranga ity NextDivel.

Raha miverina amin'ny kaody ny voalohany amin'ny faran'ny zava-drehetra tokony ho namorona zavatra toy izao isika:

ManarakaDivel-1

Raha marina izany dia afaka manohy ihany isika. Hampiasa ny rafitra sy ny rafitra ananako ao amin'ny GitHub aho (http://github.com/AdrianArroyoCalle/next-divel) satria mahazo aina kokoa ho ahy sy ho anao izy io. Araka ny ahitanao ny lahatsoratra dia lahatsoratra ifotony, tsy manintona izy. Mety ho toa zavatra tsy mahazatra. Saingy hoy ny fitenenana, ny manandrana loko, ary amin'ny rafitra fiasanay dia hisy loko. Ny loko voalohany azontsika apetraka dia ireo izay mamaritra ny karatra VGA ary 0 izy ireo:

  1. mainty
  2. Azul
  3. Verde
  4. Cyan
  5. Rojo
  6. Magenta
  7. Brown
  8. Volondavenona maivana
  9. Volondavenona mainty
  10. Blue manga
  11. Maitso maivana
  12. Cyan mazava
  13. Mena mena
  14. Magenta maivana
  15. Mavo volontany
  16. Blanco

Hofaritantsika amina lohapeo ireo loko ireo mba hananany mora kokoa ary angamba amin'ny ho avy dia lasa anisan'ny rafitra API. Noho izany dia mamorona ny fisie ND_Colors.hpp amin'ny NextDivel izahay.

#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

Mandritra izany fotoana izany dia hamaritantsika asa vaovao hanoratana eo amin'ny efijery amin'ny fomba milamina kokoa (tsia, mbola tsy hampiditra printf isika, fantatro fa tadiavinao izany). Hanao rakitra sy lohateniny izahay ho an'ny andiana fiasa mifandraika amin'ny efijery (ND_Screen.cpp sy ND_Screen.hpp). Amin'izy ireo dia hamorona fiasa izahay mba: hanova ny lokon'ny litera sy ny ao ambadika, hanoratra fehezanteny sy litera, manadio ny efijery ary mihetsika manodidina ny efijery. Manohy mampiasa ny efijery VGA izahay fa izao dia hampiasa bytes vitsivitsy hanome ny loko. Ny ND_Screen.cpp dia toa:

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

Ny lohateny dia ho tena fototr'izany ka tsy ampidiriko eto, fa asongadino ny famaritana ny karazana ND_SIDE

typedef enum ND_SIDE{
ND_SIDE_BACKGROUND,
ND_SIDE_FOREGROUND
} ND_SIDE;

Lazao ihany koa fa mampiasa ny lohateny ND_Types.hpp izahay, ity lohateny ity dia mamaritra karazana fototra ho an'ny uint8_t, uint16_t, sns mifototra amin'ny char sy int. Raha ny marina ity lohateny ity dia ilay ao amin'ny fenitra C99 ary raha ny marina ny ND_Types.hpp ahy dia kopia / apetaka amin'ilay rakitra avy amin'ny Linux, mba hahafahanao mifanakalo azy ireo ary tsy hisy zavatra hitranga (misy famaritana ihany, tsy misy fiasa).

Mba hitsapana raha mandeha ity kaody ity dia hanova ny teboka fidirana C an'ny kernel isika:

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

Ary raha manaraka ireo dingana ireo isika dia hahazo an'io valiny io

ManarakaDivel-3

Noho ireo fiasa noforoninay ireo dia afaka manomboka manao GUI kely isika, toy ny tahotra kernel izay hasehontsika isaky ny misy lesoka tsy azo sitranina. Toy izao:

ManarakaDivel-4

Ary ity GUI kely ity dia nataonay tamin'ny alàlan'ireto fiasa ireto ihany:

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

Ary eto ny lahatsoratra. Ampahatsiahiviko anao ny torolàlana hanangonana ny rafitra amin'ny 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

Ary manararaotra misaotra anao aho noho ny fandraisanao tsara ny lahatsoratra voalohany.


Ny atin'ny lahatsoratra dia manaraka ny fitsipiky ny etika fanonta. Raha hitatitra tsindry diso eto.

5 hevitra, avelao ny anao

Avelao ny hevitrao

Ny adiresy email dia tsy ho namoaka. Mitaky saha dia marika amin'ny *

*

*

  1. Tompon'andraikitra amin'ny data: Miguel Ángel Gatón
  2. Tanjon'ny angona: Control SPAM, fitantanana hevitra.
  3. Legitimation: Ny fanekenao
  4. Fifandraisana momba ny angona: Tsy hampitaina amin'ny antoko fahatelo ny angona raha tsy amin'ny adidy ara-dalàna.
  5. Fitehirizana angona: Database nomen'ny Occentus Networks (EU)
  6. Zo: Amin'ny fotoana rehetra, azonao atao ny mametra, mamerina ary mamafa ny mombamomba anao.

  1.   F3niX dia hoy izy:

    Ry namako tena tsara, na izany aza, mamono ny satroko amin'ny fahatakarana ny kaody amin'ny c ++ aho.

    Fiarahabana.

  2.   pandacriss dia hoy izy:

    tsara ireto entana ireto. Nataony izay hahaliana ahy ny fahombiazan'ny processeur ambany indray.
    Angamba raha manam-potoana aho dia manomboka milalao amin'ny divel manaraka.
    Elaela aho tsy nandefa lahatsoratra. efa ilaina

  3.   Jon mitroka dia hoy izy:

    Tsara izany, izany no fomba.

  4.   Miguel dia hoy izy:

    Efa ela aho no te hahafantatra ny fomba fananganana rafitra miasa.

    Miandry ny lahatsoratrao manaraka. mahafaly

  5.   Giuliano dia hoy izy:

    Sakaiza mahafinaritra!
    Manana olana iray fotsiny aho, afaka misy mandefa rakitra C amin'ity ohatra ity amiko?
    Mandefa ahy hatrany ny lesoka ao amin'ny terminal