Kopiante Linus Torvalds: kreu vian propran operaciumon de nulo (VII)

Bonvenon al alia afiŝo pri kiel krei nian propran operaciumon (Antaŭaj artikoloj en la serio: 1, 2, 3, 4, 5 y 6). Pasis longa tempo de la lasta afiŝo, ĉefe pro cimo, kiun mi trovis en tio, kion ni havas hodiaŭ. Ni vidos kiel pritrakti la horloĝon sur x86-arkitekturoj.

Antaŭe ni aktivigis la IRQojn senmarke, sed estis eta problemo, ĉar ni ne aktivigis ilin ĝuste kaj ni transdonis kromajn datumojn. Ni finfine riparas ĝin karlosorta kaj mi kaj mi povas plu komenti kiel daŭrigi.

Nu, la horloĝo estas IRQ, specife la unua. Por agordi ĝin ni uzos la funkcion, kiun ni antaŭe difinis, por generike instali la IRQ-ojn, la ND_IRQ_InstallHandler.

int ND_TIMER_TICKS = 0; malplena ND :: Tempigilo :: Fazo (int hz) {int dividanto = 1193180 / hz; ND :: Havenoj :: EligoB (0x43,0x36); ND :: Havenoj :: EligoB (0x40, dividanto & 0xFF); ND :: Havenoj :: EligoB (0x40, divizoro >> 8); } void ND :: Timer :: Atendu (int tiktakoj) {sensignaj longaj etiketoj; eticks = ND_TIMER_TICKS + tiktakoj; while (ND_TIMER_TICKS <etiketoj) {void ND :: Timer :: Setup () {ND :: Screen :: SetColor (ND_SIDE_FOREGROUND, ND_COLOR_BLACK); ND :: Ekrano :: PutString ("\ nSetup-tempigilo ..."); ND_IRQ_InstallHandler (0, & ND_Timer_Handler); ND :: Ekrano :: SetColor (ND_SIDE_FOREGROUND, ND_COLOR_GREEN); ND :: Ekrano :: PutString ("farita"); } 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 :: Ekrano :: PutString ("\ nUnu plian sekundon"); NI DEVU FARI FRESKAN ekranon}}

La kodo funkcias jene: la komenca sistemo vokas ND :: Tempilo :: Agordo, kiu vokas ND_IRQ_InstallHandler por enmeti en la unuan pozicion, la IRQ0, revokfunkcion kiam la evento okazas, tio estas ND_Timer_Handler tio pliigas la tokoj. Ĉar ni fiksis la horloĝan rapidon al 18 Hz, kiel ni vidos poste, se ni dividus ĝin per 18 kaj donus al ni entjeron, sekundo pasus.

La funkcio ND :: Tempigilo :: Fazo Ĝi helpas nin ĝustigi la rapidon de la temporizilo, tiu ekstravaganca nombro estas 1.19 MHz kiu estas komuna valoro. Nu, ni nomu ĉi tiun funkcion se ni volas ŝanĝi la rapidon de la temporizilo, defaŭlte ĝi iras al 18,22 Hz, aparta valoro, kiun iu certe decidis IBM kaj ĝi restis ĝis hodiaŭ.

La funkcio ND :: Tempigilo :: Atendu ĝi estas sufiĉe simpla, nur atendu per buklo dum ĝis la tokoj necesa por daŭrigi.

En la bildo ni povas vidi, ke se ni komentas la kodon ene de la ND_Timer_Handler, ni ricevas ĉi tion:

Sekundoj en NextDivel

En la sekva ĉapitro ni vidos kiel legi klavaran enigon kaj iom krei ŝelo interagi kun nia sistemo. Kiel ĉiam, la kodo estas havebla en GitHub sub la permesilo GNU GPL v2.


La enhavo de la artikolo aliĝas al niaj principoj de redakcia etiko. Por raporti eraron alklaku Ĉi tie.

14 komentoj, lasu la viajn

Lasu vian komenton

Via retpoŝta adreso ne estos eldonita. Postulita kampojn estas markita per *

*

*

  1. Respondeculo pri la datumoj: Miguel Ángel Gatón
  2. Celo de la datumoj: Kontrola SPAM, administrado de komentoj.
  3. Legitimado: Via konsento
  4. Komunikado de la datumoj: La datumoj ne estos komunikitaj al triaj krom per laŭleĝa devo.
  5. Stokado de datumoj: Datumbazo gastigita de Occentus Networks (EU)
  6. Rajtoj: Iam ajn vi povas limigi, retrovi kaj forigi viajn informojn.

  1.   Noa diris

    Tre interesa serio de lerniloj, persone mi ne vidis multajn pri kreado de Linuksa distribuo de nulo, kaj eĉ malpli en la hispana kaj tiel kompleta. Mi pensas, ke vi povas lerni multon de ĉi tio kaj tuj kiam mi havos tempon, mi esperas povi fari ĉi tiujn lernilojn.
    Mi nur petas, ke vi ne senkuraĝiĝu kaj finu la lernilon, ĉar mi trovis multajn bonajn lernilojn, kiuj neniam finiĝis.
    Saluton kaj dankon :).

    1.    vojisto diris

      Ĝi ne estas linuksa distribuo, ĝi estas kerno 😛.

    2.    desikoder diris

      Vi malpravas. Krei linux-distro ne implicas programi ion ajn, ekzemple en linux de nulo vi ne programas, kion vi faras estas instali (surbaze de kompilado), bazajn pakojn, kiuj formas distron. Ĉi tio estas tre malsama. Ĝi kreas vian propran operaciumon. Ĝi havas nenion komunan kun linukso. Jen kion torvalds siatempe inspiris per minix, kaj kun tiu varmega kaj populara diskuto inter torvalds kaj andrews. tanenbaum sur monolita kerno kontraŭ mikrokerno.

      Saluton!

  2.   illukki diris

    Dankon che. Ĝis nun mi ne multe atentis vian afiŝon, sed mi estas en projekto, do mi rigardos ilin.
    Salutojn.

  3.   vojisto diris

    Indas mencii, ke aliaj lingvoj povas esti uzataj, kiel Objective-C (++), C ++, D aŭ Rust.

    1.    AdrianArroyoStreet diris

      Ĉi tio estas en C ++, ne C. Tamen, estas malfacile vidi la diferencojn, ĉar multaj C ++-operatoroj postulas bibliotekan subtenon, kiel la nova kaj foriga operatoroj. Estus tre interese krei operaciumon en Rust. Fakte ekzistas IRC-kanalo dediĉita al operaciumoj sur Rust (# rust-osdev ĉe irc.mozilla.net). Ĉiu, kiu kompilas al maŝina kodo, vere indas, inkluzive Java, se ni uzas GCJ.

      1.    vojisto diris

        Jes, efektive, Rust estas tre interesa lingvo por operaciumoj, ĉar ĝi estas ne nur pli facile lernebla ol C aŭ C ++ (ĝi daŭre daŭras per kontinuaj ŝanĝoj, sed ĝi estas pli facila), sed ĝi estas multe pli sekura.

  4.   vojisto diris

    En la 70-aj jaroj estis sufiĉe ofte programi rekte sur la aparataro, sen OS.

  5.   christopher diris

    Bonega ... nun mi nur bezonas kompreni: 3 ...

  6.   mmm diris

    Saluton. Koran dankon pro ĉi tiuj artikoloj. Sed, se mi ne havas programan scion, mi pensas, ke mi ne faru ĝin, ĉu ne? Mi diras, se ne, estus "bona, kaj nun kion mi kopias kaj gluas?" ... kia domaĝo, ke mi ĉiam volis tiom multe scii programi kaj nenion, mi estas pli azeno!

    1.    desikoder diris

      Ne kulpigu vin, vi ne estas azeno. Unue ne ĉiuj programistoj scias kiel verki kernon, ĝi estas tre malgranda simpla tasko, kaj praktike ĝi estas pli granda. Ekzemple, ĉi tie la aŭtoro kreas senmarkajn pelilojn por la klavaro kaj la ekrano, manipulante la ekranan tabelon, kiu estas metodo tute ne uzata hodiaŭ. La tty en linukso hodiaŭ estas tre, tre kompleksa, kaj ne dependas de la ar86itektura arkitekturo havanta ekranan aron je dispono. Krome, multe de la kodo en C dependas de la arkitekturo, kiam la idealo estas krei la arkitekturan kodon en asemblero kaj ke la C-kodo funkcias sur iu ajn procesoro. Tamen mi ne malpliigas la aŭtoron, ĉar kerno akiras la trajtojn, kiujn hodiaŭ ni konsideras normalaj en linukso-kerno, ekzemple, ĝi ne estas facila tasko, kaj estu certaj, ke unu homo absolute ne kapablas fari ĝin. Por io la grandaj projektoj kiel linux, gcc, glibc, ktp, ne estas faritaj de unu homo, sed estas multaj kunlaborantoj.

      Ankaŭ, se vi volas komenci programadon, vi havas sufiĉe multajn gvidilojn en la retejo, kvankam vi devas zorgi kaj elekti la bonajn gvidilojn. Mi komencis programi en linukso saltante en la naĝejon kun mia kapo kaj sen akvo (tio estas, kun la amata C-lingvo), kvankam nun mi havas iujn bazajn nociojn pri pitono (kiu ankaŭ estas tre bona lingvo). Estas iuj C-libroj, en kiuj vi rezignas sur paĝo 6 kiel multe da kapdoloro, sed pli ol libroj, ĉi tiuj aferoj estas akiritaj de sperto. Ĝi okazas kiel ĉe la OSI-retmodelo. La dokumentado pri la osi-modelo estas absolute nekomprenebla por la novulo, sed se vi trovas retejon kun bona klarigo pri la retaj tavoloj, vi rapide ricevas la konceptojn por trakti teknikajn dokumentojn kiel RFC-ojn.

      Resume, ekzistas bonaj retejoj kaj manlibroj tie, temas pri pripensado kaj trovado de bona materialo.

      salutoj

  7.   Libera_DOM diris

    Saluton, post ĉiuj provoj solvi la "eraron: neniu plurnarta kaplinio trovis." kaj «eraro vi bezonas unue ŝarĝi la kernon», ĉar mi ne povis trovi ie ajn la solvon al la problemo de la unua artikolo, kiun iuj kiel mi havis ... jen la solvo, se ĝi funkcias por iu ...

    Mi ne scias, ĉu mia teorio pri la kaŭzo de la eraro ĝustas, sed ĉiuokaze la demando estas, ke kiam vi kompilis la dosierojn en 32-bita operaciumo, ĝi ne generis la eraron, sed ĉar mi havas 64-bitan funkciadon sistemo (Gnu / Linukso Debian 7), kaj ke, kiam mi kompilis kaj testis, mi ricevis la eraron "neniu multbota kaplinio trovita", kaj estas dubo, tiam laŭ mi la eraro ŝuldiĝas al la ĉirkaŭaĵo aŭ arkitekturo de la operaciumo en kiu ni kompilas niajn dosierojn ... kaj bone, kion mi faris, estis kompili miajn dosierojn, specifante la ĉirkaŭaĵon aŭ arkitekturon de 32 bitoj ..
    * sudo kiel -o kernel.o -c kernel.asm -32
    * sudo gcc -o NextKernel_Main.o -c NextKernel_Main.c -nostdlib -fPIC -freestanding -m32
    * sudo gcc -m32 -o START.ELF kernel.o NextKernel_Main.o -Tlink.ld -nostdlib -fPIC -stare staranta
    La stranga afero estas, ke mi havas iujn dubojn, hahaha, tiam la operaciumo, kiun ni kreas paŝon post paŝo, estas por x86-arkitekturo aŭ ĉu mi eraras ajajaj ...

    PS: iu por helpi min pri la dubo, kaj senkulpigi iujn literumajn erarojn aŭ mian malbonan esprimon, kaj nu, mi ne estas perfekta, do «Perfekteco havas sian prezon» .... Kaj plej grave, kopiu 32-bitan operaciumon, sanktan solvon. … .Hahaha

    1.    martin villalba diris

      Geniulo! Mi tre volis fari ĉi tiun lernilon kaj mi ekkomencis kun tiu eraro haha

  8.   oscar diris

    Gratulon, ĝi estas bonega kontribuo. Ekde nun mi dividas kun vi, ke via bona laboro per mi kaj aliaj plilongiĝos;

    salutoj