Paggaya sa Linus Torvalds: lumikha ng iyong sariling operating system mula sa simula (VII)

Maligayang pagdating sa isa pang post tungkol sa kung paano lumikha ng aming sariling operating system (Mga nakaraang artikulo sa serye: 1, 2, 3, 4, 5 y 6). Matagal na mula pa noong huling post, higit sa lahat dahil sa isang bug na nakita ko sa mayroon kami ngayon. Makikita natin kung paano hawakan ang orasan sa x86 na arkitektura.

Dati pinapagana namin ang mga IRQ sa isang generic na paraan, ngunit mayroong isang maliit na problema dahil hindi namin ito aktibo nang tama at nakapasa kami ng labis na data. Sa wakas ayusin namin ito carlosorta at ako at ako ay maaaring magpatuloy sa pagbibigay ng puna kung paano magpatuloy.

Sa gayon, ang orasan ay isang IRQ, partikular ang una. Upang mai-configure ito gagamitin namin ang pagpapaandar na tinukoy namin dati upang pangkalahatang i-install ang mga IRQ, ang ND_IRQ_InstallHandler.

int ND_TIMER_TICKS = 0; walang bisa ND :: Timer :: Phase (int hz) {int divisor = 1193180 / hz; ND :: Mga Port :: OutputB (0x43,0x36); ND :: Mga Port :: OutputB (0x40, divisor & 0xFF); ND :: Ports :: OutputB (0x40, divisor >> 8); } void ND :: Timer :: Maghintay (int ticks) {unsigned long eticks; eticks = ND_TIMER_TICKS + mga tick; habang (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 ("tapos"); } extern "C" walang bisa ND_Timer_Handler (struct regs * r) {ND_TIMER_TICKS ++; kung (ND_TIMER_TICKS% 18 == 0) {// ND :: Screen :: SetColor (ND_SIDE_FOREGROUND, ND_COLOR_BROWN); // ND :: Screen :: PutString ("\ nIsa pang pangalawang"); DAPAT TAYONG GUMAGAWA NG ISANG REFRESH SCREEN}}

Tumatakbo ang code tulad ng sumusunod: mga tawag sa system ng pagpapasimula ND :: Timer :: Pag-setup, na tumatawag ND_IRQ_InstallHandler upang ipasok sa unang posisyon, ang IRQ0, isang function ng callback kapag nangyari ang kaganapan, iyon ay ND_Timer_Handler na nagdaragdag ng ticks. Tulad ng itinakda namin ang bilis ng orasan sa 18 Hz, tulad ng makikita natin sa paglaon, kung hinati natin ito sa 18 at binigyan kami ng isang integer, isang segundo ay lumipas.

Ang pag-andar ND :: Timer :: Phase Tinutulungan tayo nitong ayusin ang bilis ng hronometrahisto, ang labis na bilang na iyon ay 1.19 MHz na isang karaniwang halaga. Kaya, dapat nating tawagan ang pagpapaandar na ito kung nais nating baguhin ang bilis ng hronometrahisto, bilang default pupunta ito sa 18,22 Hz, isang kakaibang halaga na dapat may nagpasya sa loob ng isang tao IBM at ito ay nanatili hanggang ngayon.

Ang pag-andar ND :: Timer :: Maghintay ito ay medyo simple, maghintay lamang sa isang loop habang hanggang sa ticks kailangan magpatuloy.

Sa imahe maaari nating makita na kung hindi natin aayuno ang code sa loob ng ND_Timer_Handler makuha namin ito:

Segundo sa NextDivel

Sa susunod na kabanata makikita natin kung paano basahin ang input ng keyboard at gumawa ng kaunti talukap ng alimango upang makipag-ugnay sa aming system. Tulad ng dati, ang code magagamit sa GitHub sa ilalim ng lisensya GNU GPL v2.


Iwanan ang iyong puna

Ang iyong email address ay hindi nai-publish. Mga kinakailangang patlang ay minarkahan ng *

*

*

  1. Responsable para sa data: Miguel Ángel Gatón
  2. Layunin ng data: Kontrolin ang SPAM, pamamahala ng komento.
  3. Legitimation: Ang iyong pahintulot
  4. Komunikasyon ng data: Ang data ay hindi maiparating sa mga third party maliban sa ligal na obligasyon.
  5. Imbakan ng data: Ang database na naka-host ng Occentus Networks (EU)
  6. Mga Karapatan: Sa anumang oras maaari mong limitahan, mabawi at tanggalin ang iyong impormasyon.

  1.   Noe dijo

    Napaka-kagiliw-giliw na serye ng mga tutorial, sa personal hindi ako nakakita ng maraming tungkol sa paglikha ng isang pamamahagi ng Linux mula sa simula, at kahit na mas mababa sa Espanyol at kumpleto. Sa palagay ko marami kang matututunan mula rito at sa sandaling magkaroon ako ng oras inaasahan kong magagawa ang mga tutorial na ito.
    Ang tanging hinihiling ko lamang na hindi ka mapanghinaan ng loob at tapusin ang tutorial, dahil nakakita ako ng maraming magagandang mga tutorial na hindi natapos.
    Pagbati at salamat :).

    1.    roader dijo

      Ito ay hindi isang pamamahagi ng linux, ito ay isang kernel 😛.

    2.    deskoder dijo

      Ikaw ay mali. Ang paglikha ng isang linux distro ay hindi nagpapahiwatig ng pag-program ng anuman, halimbawa, sa isang linux mula sa simula na hindi mo programa, ang ginagawa mo ay i-install (batay sa pag-iipon), pangunahing mga pakete na bumubuo ng isang distro. Ibang-iba ito. Lumilikha ito ng iyong sariling operating system. Wala itong kinalaman sa linux. Ito ang ginawa ng mga torvald sa kanyang panahon na inspirasyon ng minix, at sa mainit at tanyag na talakayan sa pagitan ng mga torvald at andrew s. tanenbaum sa monolithic kernel vs microkernel.

      Pagbati!

  2.   illukki dijo

    Salamat che. Hanggang ngayon hindi ko pa masyadong binibigyang pansin ang iyong post ngunit nasa isang proyekto ako kaya't titingnan ko.
    Pagbati.

  3.   roader dijo

    Sulit na banggitin na ang ibang mga wika ay maaaring magamit, tulad ng Objective-C (++), C ++, D o Rust.

    1.    AdrianArroyoStreet dijo

      Nasa C ++ ito, hindi C. Gayunpaman, mahirap makita ang mga pagkakaiba dahil maraming mga operator ng C ++ ang nangangailangan ng pag-back sa library, tulad ng bago at tanggalin ang mga operator. Napakaintereses na gumawa ng isang operating system sa Rust. Mayroong talagang isang IRC channel na nakatuon sa mga operating system sa Rust (# rust-osdev at irc.mozilla.net). Ang sinumang mag-compile sa machine code ay talagang sulit, kasama ang Java kung gumagamit kami ng GCJ.

      1.    roader dijo

        Oo, sa totoo lang, ang Rust ay isang napaka-kagiliw-giliw na wika para sa mga operating system, sapagkat hindi lamang mas madaling malaman kaysa sa C o C ++ (patuloy pa rin ito sa patuloy na pagbabago, ngunit mas madali ito), ngunit mas ligtas ito.

  4.   roader dijo

    Noong dekada 70 ay karaniwan nang direktang programa sa hardware, nang walang OS.

  5.   Christopher dijo

    Mahusay ... Ngayon ko lang kailangang maunawaan: 3 ...

  6.   mmm dijo

    Hi Maraming salamat sa mga artikulong ito. Ngunit, kung wala akong kaalaman sa programa, sa palagay ko hindi ko dapat gawin ito, tama? Ibig kong sabihin, kung hindi ito ay isang "mabuti, at ngayon ano ang kinokopya at na-paste ko?" ... sayang, lagi kong nais na malaman kung paano magprogram nang labis at wala, mas asno ako!

    1.    deskoder dijo

      Huwag sisihin ang iyong sarili, ikaw ay walang asno. Upang magsimula, hindi lahat ng mga programmer ay alam kung paano magsulat ng isang kernel, ito ay isang napakaliit na simpleng gawain, at sa pagsasanay mas malaki ito. Halimbawa dito ang may-akda ay lumilikha ng mga generic na driver para sa keyboard at sa screen, na pagmamanipula ng screen array, na kung saan ay isang pamamaraan na hindi ginagamit ngayon. Ang tty sa linux ngayon ay napaka, napaka-kumplikado, at hindi nakasalalay sa x86 na arkitektura pagkakaroon ng isang screen array sa pagtatapon nito. Bilang karagdagan, ang karamihan sa code sa C ay nakasalalay sa arkitektura, kung ang perpekto ay upang gawin ang code ng arkitektura sa assembler at gagana ang C code sa anumang processor. Gayunpaman, hindi ako umaalis sa may-akda, dahil ang isang kernel ay nakakakuha ng mga katangian na isinasaalang-alang namin ngayon na normal sa isang linux kernel, halimbawa, ito ay hindi isang madaling gawain, at sigurado na ang isang solong tao ay ganap na walang kakayahang gawin ito . Para sa isang bagay ang malalaking proyekto tulad ng linux, gcc, glibc, atbp, ay hindi ginawa ng isang solong tao ngunit maraming mga nakikipagtulungan.

      Gayundin, kung nais mong simulan ang pag-program, mayroon kang ilang mga gabay sa web, kahit na kailangan mong mag-ingat, at piliin ang mga magagandang gabay. Sinimulan kong mag-program sa linux na tumatalon sa pool gamit ang aking ulo at walang tubig (iyon ay, sa minamahal na wikang C), bagaman ngayon ay mayroon akong ilang pangunahing mga kuru-kuro ng sawa (na kung saan ay isang napakahusay na wika). Mayroong ilang mga librong C kung saan ka sumuko sa pahina 6 ng mas maraming sakit ng ulo na nakuha mo, ngunit higit sa mga libro ang mga bagay na ito ay nakuha mula sa karanasan. Ito ay nangyayari tulad ng sa modelo ng network ng OSI. Ang dokumentasyon tungkol sa modelo ng osi ay ganap na imposibleng maunawaan para sa bagong dating, ngunit kung nakakita ka ng isang site na may mahusay na paliwanag ng mga layer ng network, mabilis mong nakuha ang mga konsepto upang harapin ang mga teknikal na dokumento tulad ng RFCs.

      Sa madaling salita, may mga magagaling na website at mga manwal doon, isang bagay ng pagbaba dito at paghanap ng mahusay na materyal.

      Regards

  7.   Libre_DOM dijo

    Kumusta, pagkatapos ng lahat ng mga pagtatangka upang malutas ang "error: walang nahanap na multiboot header." at «error na kailangan mo upang mai-load muna ang kernel», dahil hindi ko mahanap kahit saan ang solusyon sa problema ng unang artikulo, na mayroon ang ilang tulad ko ... narito ang solusyon, kung gumagana ito para sa isang tao ...

    Hindi ko alam kung ang aking teorya ng sanhi ng error ay tama ngunit gayon pa man, ang tanong ay kapag pinagsasama-sama ang mga file sa isang 32-bit na operating system, hindi ito nakabuo ng error, ngunit dahil mayroon akong 64-bit na pagpapatakbo system (Gnu / Linux Debian 7), at na kapag nag-iipon at sumusubok ay itinapon ko ang error ng "walang nahanap na multiboot header", at may duda, kung gayon sa palagay ko ang error ay dahil sa kapaligiran o arkitektura ng operating system kung saan pinagsasama-sama namin ang aming mga file ... at mahusay ang ginawa ko ay ang pagsulat ng aking mga file, na tinutukoy ang 32-bit na kapaligiran o arkitektura ..
    * sudo bilang -o kernel.o -c kernel.asm -32
    * sudo gcc -o NextKernel_Main.o -c SusunodKernel_Main.c -nostdlib -fPIC -ffreestanding -m32
    * sudo gcc -m32 -o Start.ELF kernel.o NextKernel_Main.o -Tlink.ld -nostdlib -fPIC -ffreestanding
    Ang kakatwa na bagay ay mayroon akong ilang mga pag-aalinlangan hahaha, pagkatapos ang operating system na lumilikha kami ng sunud-sunod ay para sa isang x86 na arkitektura o mali ba ako ajajaj ....

    PS: ang isang tao na makakatulong sa akin sa pagdududa, at patawarin ang ilang mga pagkakamali sa pagbaybay o ang aking masamang ekspresyon, at mabuti na hindi ako perpekto kaya «Ang pagiging perpekto ay mayroong presyo» .... At ang pinakamahalaga, tularan ang isang 32-bit na operating system, banal na solusyon ... .Hahaha

    1.    martin villalba dijo

      Genius! Gustong-gusto kong gawin ang tutorial na ito at bumaba ako sa simula sa pagkakamaling iyon haha

  8.   Oscar dijo

    Binabati kita, ito ay isang mahusay na kontribusyon. Mula ngayon ibinabahagi ko sa iyo na ang iyong mabubuting gawa sa pamamagitan ko at ng iba pa ay mapapalawak;

    Regards