Emulant Linus Torvalds: feu-vos vostre sistema operatiu des de 0 (VII)

Benvinguts a un altre post sobre com crear el nostre propi sistema operatiu (Articles anteriors de la sèrie: 1, 2, 3, 4, 5 y 6). Ha passat molt de temps des de l'últim post, degut principalment a un error que vaig trobar en el que ens toca avui. veurem com manejar el rellotge en arquitectures x86.

Anteriorment havíem activat els IRQ de manera genèrica, però hi va haver un petit problema ja que no els activábamos correctament i passàvem dades extra. Finalment ho solucionem carlosorta i jo i us puc seguir comentant com seguir.

Bé, el rellotge és un IRQ, concretament el primer. Per configurar-usarem la funció que definim anteriorment per instal·lar de manera genèrica els IRQ, la ND_IRQ_InstallHandler.

int ND_TIMER_TICKS = 0; void ND :: Timer :: Phase (int hz) {int divisor = 1193180 / hz; ND :: Ports :: OutputB (0x43,0x36); ND :: Ports :: OutputB (0x40, divisor & 0xFF); ND :: Ports :: OutputB (0x40, divisor >> 8); } Void ND :: Timer :: Wait (int ticks) {unsigned long eticks; eticks = ND_TIMER_TICKS + ticks; while (ND_TIMER_TICKS <eticks) {void ND :: Timer :: Setup () {ND :: Screen :: setColor (ND_SIDE_FOREGROUND, ND_COLOR_BLACK); ND :: Screen :: PutString ( "\ nSetup timer ..."); ND_IRQ_InstallHandler (0, & ND_Timer_Handler); ND :: Screen :: setColor (ND_SIDE_FOREGROUND, ND_COLOR_GREEN); ND :: Screen :: PutString ( "done"); } Extern "C" void ND_Timer_Handler (struct regs * r) {ND_TIMER_TICKS ++; if (ND_TIMER_TICKS% 18 == 0) {// ND :: Screen :: setColor (ND_SIDE_FOREGROUND, ND_COLOR_BROWN); // ND :: Screen :: PutString ( "\ none more second"); WE SHOULD DO A REFRESH SCREEN}}

El codi s'executa de la següent manera: el sistema d'inicialització crida a ND :: Timer :: Setup, Que crida a ND_IRQ_InstallHandler per inserir en la primera posició, el IRQ0, una funció de callback quan l'esdeveniment es produeixi, aquesta és ND_Timer_Handler que augmenta els paparres. Com hem posat la velocitat de el rellotge a 18 Hz, com veurem més endavant, si ho dividiésemos entre 18 i ens donés sencer hauria passat un segon.

la funció ND :: Timer :: Phase ens serveix per ajustar la velocitat de l' temporitzador, Aquest nombre tan extravagant és 1.19 MHz que és un valor comú. Bé, aquesta funció la haurem de cridar si volguéssim canviar la velocitat de l' temporitzador, Per defecte va a 18,22 Hz, un valor peculiar que va haver de decidir algú dins IBM i s'ha quedat fins als nostres dies.

la funció ND :: Timer :: Wait és bastant simple, només espera amb un bucle mentre fins que s'hagin assolit els paparres necessaris per continuar.

A la imatge podem comprovar que si descomentem el codi dins de l'ND_Timer_Handler obtenim això:

Segons en NextDivel

En el següent capítol veurem com llegir l'entrada de el teclat i fer un petit petxina per interactuar amb el nostre sistema. Com sempre, el codi està disponible en GitHub sota la llicència GNU GPL v2.


Deixa el teu comentari

La seva adreça de correu electrònic no es publicarà. Els camps obligatoris estan marcats amb *

*

*

  1. Responsable de les dades: Miguel Ángel Gatón
  2. Finalitat de les dades: Controlar l'SPAM, gestió de comentaris.
  3. Legitimació: El teu consentiment
  4. Comunicació de les dades: No es comunicaran les dades a tercers excepte per obligació legal.
  5. Emmagatzematge de les dades: Base de dades allotjada en Occentus Networks (UE)
  6. Drets: En qualsevol moment pots limitar, recuperar i esborrar la teva informació.

  1.   Noè va dir

    Molt interessant sèrie de tutorials, en el personal no havia vist molts sobre la creació d'una distribució Linux des de zero, i encara menys en espanyol i tan complets. Crec que es poden aprendre moltes coses amb això i quan tingui temps espero poder realitzar aquests tutorials.
    L'únic que demano és que no et desanimis i acabis el tutorial, ja que he trobat molts bons tutorials que mai són acabats.
    Salutacions i gràcies :).

    1.    roader va dir

      No és una distribució linux, és un nucli 😛.

    2.    desikoder va dir

      T'equivoques. Crear una distro linux no implica programar res, per exemple, en un linux from scratch tu no programes, el que fas és anar instal·lant (a força de compilar), paquets bàsics que formen una distro. Això és molt diferent. És crear el teu propi sistema operatiu. No té res a veure amb linux. És el que Torvalds va fer al seu dia inspirant-se en minix, i amb aquella acalorada i popular discussió entre Torvalds i andrew s. Tanenbaum sobre nucli MONOLITICO vs microkernel.

      Salutacions!

  2.   illukki va dir

    Gràcies che. Fins ara no li havia prestat molta atenció als teus post però camino en un projecte així que els vaig a tirar un ull.
    Salutacions.

  3.   roader va dir

    Digne d'esmentar que es poden utilitzar altres llenguatges, com Objective-C (++), C ++, D o Rust.

    1.    AdrianArroyoCarrer va dir

      Aquest està en C ++, no en C. No obstant això és difícil veure les diferències ja que molts operadors de C ++ requereixen un suport d'una llibreria, com l'operador new i el delete. Seria molt interessant fer un sistema operatiu a Rust. De fet hi ha un canal a IRC dedicat als sistemes operatius a Rust (# rust-osdev a irc.mozilla.net). Realment val qualsevol que compili a codi màquina, inclòs Java si fem servir GCJ.

      1.    roader va dir

        Si, en efecte, Rust és un llenguatge molt interessant per a sistemes operatius, per que, no només és més fàcil d'aprendre que C o C ++ (encara segueix amb canvis continus, però més fàcil és), sinó que, és molt més segur.

  4.   roader va dir

    En els 70 era bastant comú programar directament sobre el maquinari, sense SO.

  5.   Christopher va dir

    Excel·lent ... ara només em cal entendre: 3 ...

  6.   mmm va dir

    Hola. Moltes gràcies per aquests articles. Peero, si no tinc coneixements en programació com que millor no ho faig no? dic, sinó seria un «bo, i ara què copio i pego?» ... quina llàstima, sempre em va donar tantes ganes de saber programar i res, sóc més burro!

    1.    desikoder va dir

      No et culpis, no ets cap ruc. Per començar, no tots els programadors saben escriure un nucli, és una tasca molt poc senzilla, i que en la pràctica és més gran. Per exemple aquí l'autor crea uns drivers genèrics per al teclat i la pantalla, manipulant l'array de pantalla, la qual cosa és un mètode que a dia d'avui no s'usa en absolut. Els tty en linux a dia d'avui són molt, però que molt complexos, i no depenen que en l'arquitectura x86 hagi una matriu de pantalla a la seva disposició. A més, molt del codi en C depèn de l'arquitectura, quan l'ideal és fer en assemblador el codi de l'arquitectura i que el codi C funcioni en qualsevol processador. No obstant això, no li trec mèrit a l'autor, perquè que un nucli Adquira les característiques que avui dia considerem normals en un nucli linux, per ejempo, no és una tasca fàcil, i tingues per segur que una sola persona és absolutament incapaç de realitzar-la. Per alguna cosa els grans projectes com linux, gcc, glibc, etc, no els fa una sola persona sinó que hi ha molts col·laboradors.

      A més, si vols començar a programar tens per la web bastants guies, tot i que cal anar amb compte, i seleccionar les guies bones. Jo vaig començar a programar en linux tirant-me a la piscina de cap i sense aigua (és a dir, amb l'estimat llenguatge C), tot i que ara tinc algunes nocions bàsiques de python (que també és molt bon llenguatge). Hi ha alguns llibres de C en els quals abandones a la pàgina 6 com a molt de el mal de cap que t'entra, però més que llibres aquestes coses s'adquireixen per experiència. Passa com amb el model OSI de xarxa. La documentació sobre el model osi és absolutament impossible d'entendre per al que s'inicia, però si trobes un lloc amb una bona explicació de les capes de xarxa enganxes ràpidament els conceptes com per manejar-te amb documents tècnics com els RFC.

      En definitiva, que hi ha bones webs i manuals per aquí, és qüestió de posar-s'hi i donar amb bon material.

      Salutacions

  7.   Free_DOM va dir

    Hola, depues de tant intent de solucionar el «error: no multiboot header found.» i «error you need to load the nucli first», ja que no trobava per enlloc la solució de el problema del primer article, que alguns com jo tenien ... aca li deixo la solució, si a algú li serveix ...

    No se si la meva teoria de la causa de l'error sigui la correcta però en fi, la qüestió és que a l'compilar els arxius en un sistema operatiu de 32bits, no em generava l'error, però com jo tinc un sistema operatiu de 64bits (GNU / Linux Debian 7), i que a l'compilar i provar em tirava l'error de «no multiboot header found», i d'hi ha el dubte, entonce al meu parer l'error es deu a l'entorn o arquitectura de sistema operatiu en el qual estem compilant els nostres arxius ... i bo el que vaig fer és compilar els meus arxius, especificant l'entorn o arquitectura de 32bits ..
    * Suo es -o kernel.o -c kernel.asm -32
    * Suo gcc -o NextKernel_Main.o -c NextKernel_Main.c -nostdlib -fPIC -ffreestanding -m32
    * Suo gcc -m32 -o START.ELF kernel.o NextKernel_Main.o -Tlink.ld -nostdlib -fPIC -ffreestanding
    El rar és que em quedo algunes dubte jajajja, entonce el sistema operatiu que estem creant pas a pas és per a una arquitectura de x86 o m'estic equivocant ajajaj ....

    PD: algú que m'ajudi amb el dubte, i disculpin alguns errors ortogràfic o la meva mala expressió, i bo no sóc perfecte aixi que «La perfecció té el seu preu» ... I el més important, Emulate un sistema operatiu de 32bits, santa solució ... .jajajaj

    1.    Martin Villalba va dir

      Geni! Tenia moltes ganes de fer aquest Estatut i em bajonie a el principi amb aquest error jaja

  8.   Oscar va dir

    Felicitacions, és un excel·lent aportació. Des de ja et comparteixo que el teu bon treball mitjançant la meva persona i altres (as) es farà estès;

    Salutacions