Kudayasho Linus Torvalds: Abuur nidaam aad ku shaqeyso oo ka soo bilaw (II)

Ku soo dhowow qoraal kale oo ku saabsan sida loo abuuro nidaam hawlgal u gaar ah, kiiskan NextDivel.

Haddii aan dib ugu noqono koodhka boostada kowaad dhamaadka wax walba waxay ahayd inaan la nimaadno wax sidan oo kale ah:

Wareega-1

Haddii tani sax tahay waan sii wadi karnaa. Waxaan isticmaali doonaa nidaamka iyo qaabdhismeedka aan ku haysto GitHub (http://github.com/AdrianArroyoCalle/next-divel) maadaama ay aniga iyo idinkaba raaxo badan tahay. Sida aad u aragto qoraalka waa qoraal aasaasi ah, ma ahan wax soo jiidasho leh. Waxay umuuqataa wax aan caadi aheyn. Laakiin sida loo yiri, dhadhanka midabada, iyo nidaamkayaga qalliinka waxaa ku jiri doona midabbo. Midabada ugu horeysa ee aan awoodno inaan dhigno waxay noqon doonaan kuwa qeexaya kaararka VGA waana 0:

  1. negro
  2. Azul
  3. Verde
  4. Cyan
  5. Rojo
  6. Magenta
  7. Marrón
  8. Cawl khafiif ah
  9. Cawl madow
  10. Buluug khafiif ah
  11. Cagaar khafiif ah
  12. Cyan cade
  13. Casaan khafiif ah
  14. Iftiin magenta
  15. Midab khafiif ah
  16. White

Waxaan ku qeexi doonnaa midabadan madax si loo helo waxtar badan oo laga yaabo in mustaqbalka qayb ka noqdo nidaamka API. Sidaas awgeed waxaan u abuureynaa faylka ND_Colors.hpp ee NextDivel ku dar.

#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

Isla mar ahaantaana waxaan qeexi doonnaa shaqooyin cusub si aan ugu qorno shaashadda qaab raaxo leh (maya, ma fulinayno daabacaadda wali, waan ogahay inaad rabto). Waxaan u abuuri doonnaa feyl iyo cinwaankiisaba howlo laxiriira shaashada (ND_Screen.cpp iyo ND_Screen.hpp). Dhexdooda waxaan ku abuureynaa shaqooyin: badal midabka xarfaha iyo asalka, ku qoro jumlado iyo xarfaha, nadiifi shaashadda kuna wareego shaashadda. Waxaan sii wadeynaa adeegsiga shaashadaha VGA laakiin hadda waxaan isticmaali doonaa xoogaa bytes ah oo midabka siin doona. ND_Screen.cpp wuxuu u ekaan lahaa:

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

Madaxa wuxuu noqon doonaa mid aad u aasaasi ah sidaa darteed anigu kuma soo daro halkan, laakiin muuji qeexitaanka nooca ND_SIDE

typedef enum ND_SIDE{
ND_SIDE_BACKGROUND,
ND_SIDE_FOREGROUND
} ND_SIDE;

Sidoo kale sheeg in aan isticmaalno madaxa ND_Types.hpp, madaxan ayaa qeexaya qaar ka mid ah noocyada aasaasiga ah ee uint8_t, uint16_t, iwm. oo ku salaysan char iyo int. Dhab ahaantii madaxan waa kan ku jira halbeegga C99, xaqiiqdiina ND_Types.hpp-gayga waa koobi/koji faylka desde Linux, si aad u beddelato iyaga oo waxba ma dhici doonaan (waxaa jira qeexitaanno kaliya, hawlo ma jiraan).

Si loo tijaabiyo haddii koodhkani shaqeynayo waxaan wax ka beddeleynaa barta laga soo galo C ee kernel:

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

Hadana haddii aan raacno talaabooyinkan waxaan heli doonnaa natiijadan

Wareega-3

Thanks to shaqooyinkan aan abuurnay, waxaan bilaabi karnaa inaan sameysano GUI yar yar, sida argagax yar yar oo aan soo bandhigi doono markasta oo uu jiro qalad aan lagaran karin. Wax sidan oo kale ah:

Wareega-4

Iyo GUI-daan yar waxaan ku sameynay kaliya shaqooyinkan:

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

Iyo ilaa halkan boostada. Waxaan ku xasuusinayaa tilmaamaha lagu ururinayo nidaamka 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

Anigana waxaan uga faa'iideysanayaa fursaddan inaan kaaga mahadceliyo soo dhaweynta wanaagsan ee uu sameeyay qoraalkii ugu horreeyay.


Ka tag faalladaada

cinwaanka email aan la daabacin doonaa. Beeraha loo baahan yahay waxaa lagu calaamadeeyay la *

*

*

  1. Masuul ka ah xogta: Miguel Ángel Gatón
  2. Ujeedada xogta: Xakamaynta SPAM, maaraynta faallooyinka.
  3. Sharci: Oggolaanshahaaga
  4. Isgaarsiinta xogta: Xogta looma gudbin doono dhinacyada saddexaad marka laga reebo waajibaadka sharciga ah.
  5. Kaydinta xogta: Macluumaadka ay martigelisay Shabakadaha Occentus (EU)
  6. Xuquuqda: Waqti kasta oo aad xadidi karto, soo ceshan karto oo tirtiri karto macluumaadkaaga.

  1.   f3niX dijo

    Saaxiib aad u fiican, xitaa sidaas darteed waxaan dilayaa koofiyadeyda fahamka koodhka ku jira c ++.

    Thanks.

  2.   pandacriss dijo

    waxyaabahaani waa kuwo fiican. Waxay iga garteen xiisaha aan u qabo waxqabadka heerka hoose ee processor-rada mar labaad.
    laga yaabee hadaan waqti haysto inaan bilaabi doono la ciyaarista ciyaarta xigta.
    Maqaal dheer maan dirin. horeyba loogu baahnaa

  3.   Jon burrows dijo

    Waa hagaag, taasi waa jidka.

  4.   Miguel dijo

    Waxaan muddo dheer doonayay inaan ogaado sida loo dhiso nidaamka hawlgalka.

    Sugitaanka boostadaada xigta. Farxad

  5.   Giuliano dijo

    Saaxiib weyn!
    Kaliya hal dhibaato ayaan qabaa, qof ma ii soo gudbin karaa faylka C ee tusaalahan?
    Had iyo jeer waxay ii soo dirtaa khaladaadka ku jira xarunta