Emulating Linus Torvalds: Cruthaigh do chóras oibriúcháin féin ón tús (II)

Fáilte chuig post eile maidir le conas ár gcóras oibriúcháin féin a chruthú, sa chás seo NextDivel.

Má théimid ar ais chuig cód na an chéad phost ag deireadh gach rud ba chóir dúinn a bheith ag smaoineamh ar rud éigin mar seo:

NextDivel-1

Má tá sé seo ceart is féidir linn leanúint ar aghaidh. Táim chun an córas agus an struchtúr atá agam ar GitHub a úsáid (http://github.com/AdrianArroyoCalle/next-divel) mar tá sé níos compordaí domsa agus duitse. Mar a fheiceann tú gur téacs bunúsach é an téacs, níl sé tarraingteach. B’fhéidir go bhfuil an chuma air go bhfuil rud éigin as an ngnáth. Ach de réir mar a théann an rá, chun dathanna a bhlaiseadh, agus inár gcóras oibriúcháin beidh dathanna ann. Is iad na chéad dathanna a bheimid in ann a chur ná iad siúd a shainíonn na cártaí VGA agus tá siad 0:

  1. Black
  2. Azul
  3. glas
  4. Cian
  5. Dearg
  6. Mageanta
  7. Brown
  8. Solas liath
  9. Liath dorcha
  10. Gorm gorm
  11. Solas glas
  12. Cian soiléir
  13. Dearg éadrom
  14. Magenta éadrom
  15. Donn éadrom
  16. Blanco

Táimid chun na dathanna seo a shainiú i gceanntásc le go mbeidh siad níos áisiúla agus b’fhéidir sa todhchaí a bheith mar chuid de API an chórais. Mar sin cruthaímid an comhad ND_Colors.hpp sa NextDivel san áireamh.

#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

Ag an am céanna táimid chun feidhmeanna nua a shainiú le scríobh ar an scáileán ar bhealach níos compordaí (níl, nílimid chun printf a chur i bhfeidhm go fóill, tá a fhios agam go bhfuil tú ag iarraidh é). Cruthóimid comhad agus a cheanntásc le haghaidh tacar feidhmeanna a bhaineann le scáileán (ND_Screen.cpp agus ND_Screen.hpp). Iad siúd táimid chun feidhmeanna a chruthú chun: dath na litreacha agus an chúlra a athrú, frásaí agus litreacha a scríobh, an scáileán a ghlanadh agus bogadh timpeall an scáileáin. Leanaimid orainn ag úsáid na scáileáin VGA ach anois úsáidfimid cúpla beart a thabharfaidh an dath. Ba mhaith le 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;
}

Beidh an ceanntásc an-bhunúsach mar sin ní chuirim san áireamh é anseo, ach aibhsigh an sainmhíniú ar an gcineál ND_SIDE

typedef enum ND_SIDE{
ND_SIDE_BACKGROUND,
ND_SIDE_FOREGROUND
} ND_SIDE;

Luaigh freisin go mbainimid úsáid as an gceanntásc ND_Types.hpp, sainmhíníonn an ceanntásc seo roinnt cineálacha bunúsacha le haghaidh uint8_t, uint16_t, srl. Bunaithe ar char agus int. I ndáiríre is é an ceanntásc seo an ceann sa chaighdeán C99 agus i ndáiríre is cóip / greamaigh den chomhad ó Linux é mo ND_Types.hpp, ionas gur féidir leat iad a mhalartú agus ní tharlódh aon rud (níl ann ach sainmhínithe, níl aon fheidhmeanna ann).

Chun a thástáil an n-oibríonn an cód seo táimid chun pointe iontrála C an eithne a mhodhnú:

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

Agus má leanaimid na céimeanna seo gheobhaimis an toradh seo

NextDivel-3

A bhuíochas leis na feidhmeanna seo a chruthaigh muid, is féidir linn tosú ag déanamh GUIanna beaga, mar shampla scaoll eithne a thaispeánfaimid gach uair a bhíonn earráid nach féidir a aisghabháil. Rud éigin mar seo:

NextDivel-4

Agus an GUI beag seo ní dhearna muid ach leis na feidhmeanna seo:

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

Agus suas go dtí seo an post. Meabhraím duit na treoracha chun an córas a chur le chéile ó 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

Agus tapaím an deis seo chun buíochas a ghabháil leat as an bhfáiltiú den scoth a bhí sa chéad phost.


Cloíonn ábhar an ailt lenár bprionsabail eitic eagarthóireachta. Chun earráid a thuairisciú cliceáil anseo.

5 trácht, fág mise

Fág do thrácht

Ní thabharfar do sheoladh r-phoist a fhoilsiú. Réimsí riachtanacha atá marcáilte le *

*

*

  1. Freagrach as na sonraí: Miguel Ángel Gatón
  2. Cuspóir na sonraí: SPAM a rialú, bainistíocht trácht.
  3. Legitimation: Do thoiliú
  4. Na sonraí a chur in iúl: Ní chuirfear na sonraí in iúl do thríú páirtithe ach amháin trí oibleagáid dhlíthiúil.
  5. Stóráil sonraí: Bunachar sonraí arna óstáil ag Occentus Networks (EU)
  6. Cearta: Tráth ar bith is féidir leat do chuid faisnéise a theorannú, a aisghabháil agus a scriosadh.

  1.   F3niX a dúirt

    Cara den scoth, mar sin táim ag marú mo chlogad ag tuiscint an chóid i c ++.

    Beannachtaí.

  2.   pandacriss a dúirt

    tá na míreanna seo go hiontach. Chuir siad mo fhiosracht faoi fheidhmíocht leibhéal íseal na bpróiseálaithe arís.
    b’fhéidir má tá am agam tosóidh mé ag imirt le next-divel.
    Níl alt seolta agam le fada an lá. ag teastáil cheana féin

  3.   Jon burrows a dúirt

    Gach ceart, sin an bealach.

  4.   Miguel a dúirt

    Is fada ó theastaigh uaim a fháil amach conas córas oibriúcháin a dhéanamh.

    Ag fanacht le do chéad phost eile. Cheers

  5.   Giuliano a dúirt

    Cara iontach!
    Níl ach fadhb agam, an féidir le duine comhad i C den sampla seo a thabhairt dom?
    Cuireann sé earráidí chugam sa chríochfort i gcónaí