Emulimi i Linus Torvalds: krijoni sistemin tuaj operativ nga e para (VII)

Mirësevini në një postim tjetër rreth si të krijojmë sistemin tonë operativ (Artikujt e mëparshëm në seri: 1, 2, 3, 4, 5 y 6) Ka kaluar një kohë e gjatë që nga postimi i fundit, kryesisht për shkak të një defekti që kam gjetur në atë që kemi sot. Do ta shohim si të trajtohet ora në arkitekturat x86.

Më parë ne kishim aktivizuar IRQ në një mënyrë të përgjithshme, por kishte një problem të vogël pasi që nuk i aktivizuam ato në mënyrë korrekte dhe kaluam të dhëna shtesë. Më në fund e rregullojmë karlosorta dhe unë dhe unë mund të vazhdojmë të komentojmë se si të vazhdojmë.

Epo, ora është një IRQ, posaçërisht e para. Për ta konfiguruar ne do të përdorim funksionin që kemi përcaktuar më parë për të instaluar në mënyrë gjenerike IRQ, ND_IRQ_InstallHandler.

int ND_TIMER_TICKS = 0; void ND :: Timer :: Faza (int hz) {int pjestuesi = 1193180 / hz; ND :: Portet :: OutputB (0x43,0x36); ND :: Portat :: OutputB (0x40, pjesëtues & 0xFF); ND :: Portat :: OutputB (0x40, pjesëtuesi >> 8); } void ND :: Kohëmatësi :: Prit (int ticks) {etiket e gjata të pa nënshkruara; etiket = ND_TIMER_TICKS + këpusha; ndërsa (ND_TIMER_TICKS <eticks) {void ND :: Timer :: Setup () {ND :: Screen :: SetColor (ND_SIDE_FOREGROUND, ND_COLOR_BLACK); ND :: Ekrani :: PutString ("\ nKohëmatësi i konfigurimit ..."); ND_IRQ_InstallHandler (0, & ND_Timer_Handler); ND :: Ekrani :: SetColor (ND_SIDE_FOREGROUND, ND_COLOR_GREEN); ND :: Ekrani :: PutString ("bërë"); } i pavlefshëm "C" i jashtëm ND_Timer_Handler (rregullat e strukturës * r) {ND_TIMER_TICKS ++; nëse (ND_TIMER_TICKS% 18 == 0) {// ND :: Ekrani :: SetColor (ND_SIDE_FOREGROUND, ND_COLOR_BROWN); // ND :: Ekrani :: PutString ("\ nNjë sekondë më shumë"); DUHET T D BOJM A NJ SC ekran freskues}}

Kodi funksionon si më poshtë: sistemi i inicializimit bën thirrje ND :: Kohëmatësi :: Konfigurimi, e cila bën thirrje ND_IRQ_InstaloniDrejtuesin për të futur në pozicionin e parë, IRQ0, një funksion kthyes kur ndodh ngjarja, dmth ND_Timer_Handler që rrit ticks. Ndërsa kemi vendosur shpejtësinë e orës në 18 Hz, siç do ta shohim më vonë, nëse do ta ndanim me 18 dhe do të na jepte një numër të plotë, do të kishte kaluar një sekondë.

Funksioni ND :: Kohëmatësi :: Faza Kjo na ndihmon për të rregulluar shpejtësinë e kohëmatës, ai numër ekstravagant është 1.19 MHz që është një vlerë e zakonshme. Epo, ne duhet ta quajmë këtë funksion nëse duam të ndryshojmë shpejtësinë e kohëmatës, si parazgjedhje shkon në 18,22 Hz, një vlerë e veçantë që dikush duhet ta ketë vendosur brenda IBM dhe ka mbetur deri më sot.

Funksioni ND :: Kohëmatësi :: Prisni është shumë e thjeshtë, thjesht prisni me një lak ndërsa deri në ticks e nevojshme për të vazhduar.

Në imazh mund të shohim se nëse heqim komentin brenda kodit ND_Timer_Handler do të marrim këtë:

Sekonda në NextDivel

Në kapitullin tjetër do të shohim se si të lexojmë futjen e tastierës dhe të bëjmë pak predhë për të bashkëvepruar me sistemin tonë. Si gjithmonë, kodi është në dispozicion në GitHub nën licencë GNU GPL v2.


Lini komentin tuaj

Adresa juaj e emailit nuk do të publikohet. Fusha e kërkuar janë shënuar me *

*

*

  1. Përgjegjës për të dhënat: Miguel Ángel Gatón
  2. Qëllimi i të dhënave: Kontrolloni SPAM, menaxhimin e komenteve.
  3. Legjitimimi: Pëlqimi juaj
  4. Komunikimi i të dhënave: Të dhënat nuk do t'u komunikohen palëve të treta përveç me detyrim ligjor.
  5. Ruajtja e të dhënave: Baza e të dhënave e organizuar nga Occentus Networks (BE)
  6. Të drejtat: Në çdo kohë mund të kufizoni, rikuperoni dhe fshini informacionin tuaj.

  1.   Nuhu dijo

    Një seri shumë interesante e udhëzimeve, personalisht nuk kisha parë shumë rreth krijimit të një shpërndarjeje Linux nga e para, dhe madje edhe më pak në Spanjisht dhe kaq e plotë. Unë mendoj se ju mund të mësoni shumë nga kjo dhe sa më shpejt që të kem kohë shpresoj të jem në gjendje t'i bëj këto mësime.
    E vetmja gjë që unë kërkoj është që ju të mos dekurajoheni dhe të përfundoni tutorialin, pasi që unë kam gjetur shumë mësime të mira që nuk kanë mbaruar kurrë.
    Përshëndetje dhe faleminderit :).

    1.    udhëtar dijo

      Nuk është një shpërndarje linux, është një bërthamë.

    2.    desikoder dijo

      Ju jeni gabim. Krijimi i një distro linux nuk nënkupton programimin e asgjë, për shembull, në një linux nga e para nuk programoni, ajo që bëni është të instaloni (bazuar në përpilimin), paketat themelore që përbëjnë një distro. Kjo është shumë e ndryshme. Po krijon sistemin tuaj operativ. Nuk ka asnjë lidhje me linux. Kjo është ajo që bëri torvalds në kohën e tij frymëzuar nga minix, dhe me atë diskutim të nxehtë dhe popullor midis torvalds dhe andrew s. tanenbaum në bërthamë monolit vs mikrokernel.

      Përshëndetje!

  2.   illukki dijo

    Faleminderit che. Deri më tani nuk i kam kushtuar shumë vëmendje postimit tuaj por jam në një projekt kështu që do t'i hedh një vështrim atyre.
    Përshëndetje.

  3.   udhëtar dijo

    Vlen të përmendet se mund të përdoren gjuhë të tjera, të tilla si Objektivi-C (++), C ++, D ose Rust.

    1.    AdrianArroyoStreet dijo

      Kjo është në C ++, jo C. Sidoqoftë, është e vështirë të shohësh ndryshimet pasi që shumë operatorë C ++ kërkojnë mbështetjen e bibliotekës, siç janë operatorët e rinj dhe fshini. Do të ishte shumë interesante të bëhej një sistem operativ në Rust. Në të vërtetë ekziston një kanal IRC kushtuar sistemeve operative në Rust (# ndryshk-osdev në irc.mozilla.net). Kushdo që përpilon në kodin e makinës ia vlen vërtet, përfshirë Java nëse përdorim GCJ.

      1.    udhëtar dijo

        Po, me të vërtetë, Rust është një gjuhë shumë interesante për sistemet operative, sepse jo vetëm që është më e lehtë për tu mësuar se C ose C ++ (vazhdon akoma me ndryshime të vazhdueshme, por është edhe më e lehtë), por është shumë më e sigurt.

  4.   udhëtar dijo

    Në vitet 70-të ishte mjaft e zakonshme të programohej direkt në pajisje, pa OS.

  5.   Christopher dijo

    Shkëlqyeshëm ... tani thjesht duhet të kuptoj: 3 ...

  6.   mmm dijo

    Pershendetje Faleminderit shumë për këto artikuj. Por, nëse nuk kam njohuri programimi, nuk mendoj se duhet ta bëj, apo jo? Dua të them, nëse jo do të ishte një "e mirë, dhe tani çfarë kopjoj dhe ngjis?" ... sa keq, gjithmonë doja të dija të programoja kaq shumë dhe asgjë, unë jam më shumë një gomar!

    1.    desikoder dijo

      Mos e fajëso veten, nuk je gomar. Si fillim, jo ​​të gjithë programuesit dinë të shkruajnë një bërthamë, është një detyrë shumë e thjeshtë dhe në praktikë është më e madhe. Për shembull, këtu autori krijon drejtues gjenerikë për tastierën dhe ekranin, duke manipuluar ekranin e ekranit, e cila është një metodë që nuk përdoret fare sot. Tty në linux sot janë shumë, shumë komplekse, dhe nuk varen nga arkitektura x86 që ka një grup ekrani në dispozicion. Për më tepër, shumica e kodit në C varet nga arkitektura, kur idealja është të bësh kodin e arkitekturës në asembler dhe që kodi C të funksionojë në çdo procesor. Sidoqoftë, unë nuk e heq autorin, sepse një bërthamë fiton karakteristikat që ne sot i konsiderojmë normale në një bërthamë linux, për shembull, nuk është një detyrë e lehtë dhe të jeni të sigurt se një person i vetëm është absolutisht i paaftë për ta bërë atë. Për diçka, projektet e mëdha si linux, gcc, glibc, etj., Nuk janë bërë nga një person i vetëm, por ka shumë bashkëpunëtorë.

      Gjithashtu, nëse doni të filloni programimin, keni mjaft udhëzues në internet, megjithëse duhet të jeni të kujdesshëm dhe të zgjidhni udhëzuesit e mirë. Unë fillova programimin në linux duke u hedhur në pishinë me kokën time dhe pa ujë (domethënë, me gjuhën e dashur C), edhe pse tani kam disa nocione themelore të python (e cila është gjithashtu një gjuhë shumë e mirë). Ka disa libra C, në të cilët ju hiqni dorë në faqen 6 nga dhimbja e kokës që keni, por më shumë sesa librat, këto gjëra merren nga përvoja. Ndodh si me modelin e rrjetit OSI. Dokumentacioni në lidhje me modelin osi është absolutisht e pamundur të kuptohet për të sapoardhurin, por nëse gjeni një sit me një shpjegim të mirë të shtresave të rrjetit, shpejt merrni konceptet për t'u marrë me dokumente teknike siç janë RFC-të.

      Me pak fjalë, ka faqe dhe manuale të mira atje, është çështje që të merremi me të dhe të gjeni material të mirë.

      të fala

  7.   Falas_DOM dijo

    Përshëndetje, pas të gjitha përpjekjeve për të zgjidhur "gabimin: nuk u gjet asnjë titull multiboot." dhe «gabim ju duhet të ngarkoni më parë bërthamën», pasi nuk gjeta askund zgjidhjen e problemit të artikullit të parë, që disa si unë e kishin ... këtu është zgjidhja, nëse punon për dikë ...

    Unë nuk e di nëse teoria ime për shkakun e gabimit është e saktë, por gjithsesi, pyetja është që kur përpiloni skedarët në një sistem operativ 32-bit, nuk e gjeneroi gabimin, por pasi që unë kam një operativ 64-bit sistemi (Gnu / Linux Debian 7), dhe se gjatë përpilimit dhe testimit mora gabimin e "nuk u gjet koka me shumë boot", dhe ka një dyshim, atëherë për mendimin tim gabimi është për shkak të mjedisit ose arkitekturës së sistemit operativ në të cilën ne jemi duke përpiluar skedarët tanë ... dhe mirë ajo që kam bërë është të përpiloj skedarët e mi, duke specifikuar mjedisin 32-bit ose arkitekturën ..
    * sudo si -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 -freestanding
    E çuditshme është se unë kam disa dyshime hahaha, atëherë sistemi operativ që po krijojmë hap pas hapi është për një arkitekturë x86 apo jam gabim ajajaj aj.

    PS: dikush të më ndihmojë me dyshimin, dhe të justifikojë disa gabime drejtshkrimore ose shprehjen time të keqe, dhe mirë që unë nuk jam perfekt kështu që «Përsosmëria ka çmimin e saj» .... Dhe më e rëndësishmja, imitoni një sistem operativ 32-bit, zgjidhje të shenjtë H .Hahaha

    1.    martin villalba dijo

      Gjeniu! Unë me të vërtetë dëshiroja ta bëja këtë tutorial dhe u tërhoqa në fillim me atë gabim haha

  8.   Oscar dijo

    Urime, është një kontribut i shkëlqyeshëm. Tani e tutje unë ndaj me ju që puna juaj e mirë përmes meje dhe të tjerëve do të zgjatet;

    të fala