Sistemet operative të krijuara nga e para. Çfarë duhet të dini për të shkruar një sistem operativ

WikiHow punon në parimin e Wiki, që do të thotë se shumë prej artikujve tanë janë shkruar nga disa autorë. Kur krijohet ky artikull mbi redaktimin dhe përmirësimin e tij, duke përfshirë anonim, 90 persona (a) punuan.

Sistemet operative të përbërë nga qindra mijëra linjat e kodit lejojnë përdoruesit të ndërveprojnë me pajisjet kompjuterike. Ata zakonisht janë shkruar në programimin e gjuhëve C, C ++ dhe Assembler.

Hapa

    Për të filluar me programimin e të mësuarit. Njohja e asamblesë është e nevojshme; Rekomandohet fuqimisht që të ketë konceptin e gjuhëve të tjera programuese shtesë të një niveli më të ulët, për shembull, C.

    Vendosni cilën pajisje doni të shkarkoni sistemin operativ. Mund të jetë një CD, DVD, pajisje flash, hard disk ose kompjuter tjetër.

    Vendosni se cilën doni të shihni sistemin tuaj operativ. Nëse ky duhet të jetë versioni i plotë i OS me një ndërfaqe grafike të përdoruesit (GUI) ose ndoshta diçka më minimale? Ju duhet të dini se në cilin drejtim për të lëvizur, para fillimit të procesit.

    Specifikoni se cili platformë procesor sistemi juaj operativ do të mbështesë. AI-32 dhe x86_64 janë dy versionet më të zakonshme për kompjuterët personalë, në mënyrë që ata të mund të konsiderohen zgjidhja më e mirë.

    Vendosni nëse preferoni të bëni gjithçka vetë nga e para, ose ka kernele, në bazë të të cilave dëshironi të thithni sistemin. Linux nga e para - një projekt për ata që dëshirojnë për shembull, krijojnë shpërndarjen e tyre të Linux.

    Zgjidh, ju do të përdorni bootloader tuaj ose ngarkuesin e sapokrijuar të unifikuar të unifikuar (grub). Meqenëse kodimi i programit të saj të nisjes kërkon njohuri të gjera në fushën e mbështetjes kompjuterike dhe BIOS, mund të rregullojë grafikun e programimit të bërthamës aktuale.

    Merrni një vendim për gjuhën e programimit që do të përdorni. Natyrisht, është mjaft e mundshme të zhvillohet një OS në një gjuhë të tillë si Pascal ose Basic, por është e preferueshme të shkruhet me ose assembler. Assembler është absolutisht e nevojshme, pasi disa pjesë të rëndësishme të sistemit operativ kërkojnë njohuri për këtë gjuhë të veçantë. C ++, nga ana tjetër, përmban fjalë kyçe të nevojshme për të nisur versionin e plotë të OS.

    • Për të mbledhur OS duke përdorur kodet C ose C + +, ju me siguri do të përdorni një përpilues, pastaj një tjetër. Kjo do të thotë që ju duhet të lexoni manualin / udhëzimet / dokumentacionin për përpiluesin e përzgjedhur C / C ++, i cili furnizohet me softuerin ose në dispozicion në faqen e internetit të distributorit. Ju do të keni për të mësuar shumë gjëra komplekse rreth përpiluesit, përveç kësaj, për të përmirësuar C + + për të mësuar skemën e saj dhe ABI. Ju pritet të kuptoni formatet e ndryshme të detyrave ekzekutive (ELF, PE, Coff, Binary, etj.) Dhe vini re se formati i tij i Windows, PE (.exe) mbrohet me të drejtën e autorit.
  1. Zgjidh Ndërfaqja e Programimit të Aplikimit (API). Një nga përzgjedhjen e një API të mirë është posix, pasi është e dokumentuar mirë. Të gjitha sistemet Unix kanë të paktën mbështetje të pjesshme për POSIX, kështu që do të ishte e parëndësishme për të shtuar programe Unix në sistemin tuaj operativ.

    Vendosni me dizajnin. Ka bërthama monolitike dhe mikrokernizë. Kernelet monolit kryejnë të gjitha shërbimet në kernel, ndërsa mikrokerneli ka një kernel të vogël në kombinim me realizimin e përdoruesve të shërbimeve. Në përgjithësi, kernelit monolit janë më të shpejtë, por mikrokerneli është izolim më i mirë dhe mbrojtje kundër gabimeve të mundshme.

    Konsideroni çështjen e zhvillimit dhe punës në një ekip. Kështu, do t'ju duhet më pak kohë për të zgjidhur problemet e mëdha, të cilat do të krijojnë një sistem operativ më të mirë për një kohë më të shkurtër.

    Mos e fshini plotësisht diskun tuaj të vështirë. Mos harroni, formatimi i diskut do të pastrojë në mënyrë të pakthyeshme të gjitha të dhënat tuaja! Përdorni grub ose menaxherin tjetër për të kopjuar shkarkimin e kompjuterit tuaj nga OS tjetër derisa versioni juaj të jetë plotësisht i gatshëm funksionalisht.

    Filloni me të vogla. Shënim kryesisht në gjërat e vogla, të tilla si shfaqja e tekstit dhe ndërprerjeve para se të kaloni në elemente komplekse, për shembull, për të kontrolluar kujtesën dhe multitasking.

    Ruaj një kopje rezervë të versionit të fundit të punës. Kjo jep një qetësi të caktuar në rast se diçka shkon absolutisht gabimisht në versionin aktual të OS tuaj ose shtesat e mëvonshme. Në rast të ndarjes së kompjuterit tuaj dhe pamundësisë së shkarkimit, siç e kuptoni vetë, mundësia e shkëlqyer do të jetë prania e një kopje të dytë për të punuar, kështu që ju mund të eliminoni gabimet ekzistuese.

    Testoni sistemin tuaj të ri operativ në një makinë virtuale. Në vend që të rifilloni një kompjuter çdo herë pasi të bëni ndryshime ose të transferoni skedarë nga kompjuteri i punës në një makinë testuese, ju mund të përdorni aplikacionin për të filluar OS në makinë virtuale, ndërsa OS juaj aktual vazhdon të funksionojë. Aplikacionet VM përfshijnë VMware (e cila gjithashtu ka një server të qasjes së lirë), kodin burimor alternativ të hapur, Bochs, Microsoft Virtual PC (jo i pajtueshëm me Linux), si dhe XVM VirtualBox.

    Lirimin e versionit të lirimit. Kjo do t'u lejojë përdoruesve t'ju tregojnë për mangësitë e mundshme në sistemin tuaj operativ.

  2. Sistemi operativ duhet gjithashtu të jetë i përshtatshëm për përdoruesit, prandaj mos harroni të shtoni funksione të dobishme që do të bëhen pjesë përbërëse e dizajnit tuaj.

    • Kur zhvillimi është përfunduar, mendoni nëse doni të dorëzoni kodin në qasje të lirë ose të vendosni të drejta private për të.
    • Sigurohuni që të bëni karakteristikat e sigurisë nga prioriteti juaj themelor, nëse doni që sistemi juaj të jetë i qëndrueshëm.
    • Mos filloni projektin e zhvillimit të projektit për qëllimin e programimit të të nxënit. Nëse nuk e dini C, C + +, Pascal ose disa gjuhë dhe vetitë e tjera të përshtatshme, duke përfshirë llojet e treguesit, operacionet me bit të nivelit të ulët, ndërrimin e biteve, assembler të integruar, etj., Nuk ka ende gati për të krijuar OS.
    • Vëzhgoni portalet e tilla si Osdev dhe OSDEVER për t'ju ndihmuar të përmirësoni sistemin tuaj operativ. Kushtojini vëmendje të veçantë faktit se shumica e pyetjeve të komunitetit Osdev.org ju preferon të kontaktoni në mënyrë të pavarur përmbajtjen e faqes dhe të mos bashkoheni me forumin. Nëse ende vendosni të bashkoheni me rreshtat e anëtarëve të forumit, duhet të ketë parakushte të caktuara për këtë. Ju duhet të dini tërësisht C ose C + + dhe gjuhën X86 Assuller. Ju gjithashtu duhet të kuptoni konceptet e zakonshme dhe komplekse në programim, të tilla si listat e lidhura, rradhët, etj. Komuniteti i Osdev në rregullat e saj tregon drejtpërsëdrejti se askush nuk do të infermierë programues të rinj. Nëse jeni duke u përpjekur për të zhvilluar OS, është e qartë se ju jeni "zot" në fushën e programimit. Ju gjithashtu duhet të lexoni një manual për të punuar me një procesor në lidhje me arkitekturën e saj të zgjedhur nga ju; Për shembull, x86 (intel), krah, mips, PPC, etj. Një manual i tillë i strukturës së procesorit mund të gjendet lehtësisht duke kërkuar në Google ("Manualet Intel", "Manualet e ARM", etj.). Mos regjistrohuni në Forumin e Osdev.org për të bërë pyetje të dukshme. Ajo thjesht do të çojë në përgjigje si "Lexoni manualin f *** ing". Për të filluar, duhet të provoni të lexoni Wikipedia, përfitime për mjete të ndryshme që do të përdorin.
    • Kontrolloni për pika të mundshme të vdekura dhe gabime të tjera. Miscelers, bllokime dhe probleme të tjera mund të ndikojnë në projektin e sistemit tuaj operativ.
    • Nëse doni një mënyrë më të thjeshtë, të dorëzoni Linux Distributions - Lloji Fedora Revisor, Custom Nimble X, Puppy Remaster, PCLINUXOS MKLIVECD ose SUSE Studio dhe Suse Kivi. Megjithatë, OS i gjeneruar nga kompania, e cila është e para për të futur këtë shërbim (edhe pse ju keni të drejta për shpërndarjen e saj të lirë, ndryshimin dhe nisje, si ju pëlqen, nën GPL).
    • Një zgjidhje e mirë do të jetë krijimi i një ndarje krejtësisht të re për zhvillimin e sistemit operativ.

    Paralajmërime

    • Rishqyrtimi i pakujdesshëm OS në një hard disk mund ta dëmtojë plotësisht. bej kujdes
    • Ju nuk do të merrni një sistem të përfunduar plotësisht në dy javë. Filloni nga sistemi operativ i shkarkuar, dhe pastaj shkoni në material më interesant.
    • Nëse bëni diçka të shpejtë, si, për shembull, shkruani bytes të rastit në portet arbitrare I / O, pastaj shkatërroni OS tuaj dhe mund (në teori) për të djegur pajisjet tuaja.
    • Mos prisni që do të jetë e lehtë për të ndërtuar një sistem operativ me cilësi të lartë. Ka shumë ndërvarësi komplekse. Për shembull, në mënyrë që OS të jetë në gjendje të punojë me përpunues të shumëfishtë, menaxheri juaj i kujtesës duhet të ketë mekanizma "bllokimi" për të parandaluar procesorët e panevojshëm në të njëjtin burim në të njëjtën kohë. "Blloqet" e përdorura supozojnë praninë e një planifikuesi për të siguruar që vetëm një procesor i referohet një burimi kritik në çdo kohë, dhe të gjithë të tjerët janë në modalitetin e gatishmërisë. Megjithatë, planifikuesi i punës varet nga prania e menaxherit të kujtesës. Ky është një shembull i varësisë nga ndërprerja. Nuk ka mënyrë standarde për të zgjidhur probleme të tilla; Çdo krijues i sistemit operativ pritet të jetë mjaft i kualifikuar për të gjetur zgjidhjen e vet për t'i zgjidhur ato.

Origjinali: Asmschool: Bëni një sistem operativ
Postuar nga Mike Saunders
Data e publikimit: 15 prill 2016
Përkthim: A. Panin
Data e përkthimit: 16 prill 2016

Pjesa 4: Duke pasur aftësitë e marra gjatë leximit të neneve të mëparshme të serisë, mund të vazhdoni me zhvillimin e sistemit tuaj operativ!

Për çfarë është?

  • Për të kuptuar parimet e përpiluesve.
  • Për të kuptuar udhëzimet e procesorit qendror.
  • Për të optimizuar kodin tuaj në aspektin e performancës.

Për disa muaj kemi kaluar një rrugë të vështirë, e cila filloi me zhvillimin e programeve të thjeshta në gjuhën e Asamblesë Linux dhe përfundoi në artikullin e kaluar të një sërë kodesh të vetë-mjaftueshme, të ekzekutuara në një kompjuter personal pa një sistem operativ. E pra, tani do të përpiqemi të mbledhim të gjithë informacionin së bashku dhe të krijojmë sistemin operativ më real. Po, ne do të shkojmë në gjurmët e Linus Torvalds, por për një fillim ia vlen të përgjigjemi pyetjeve të mëposhtme: "Cili është sistemi operativ? Cila nga funksionet e tij do të duhet të rikrijojmë?".

Në këtë artikull, ne do të përqendrohemi vetëm në funksionet bazë të sistemit operativ: ngarkimi dhe ekzekutimi i programeve. Sistemet operative komplekse kryejnë një numër shumë më të madh të funksioneve, siç janë menaxhimi i kujtesës virtuale dhe përpunimi i paketave të rrjetit, por për zbatimin e tyre të saktë, kërkohet vite të funksionimit të vazhdueshëm, kështu që në këtë nen do të shqyrtojmë vetëm funksionet themelore të pranishme në çdo sistem operativ . Muajin e kaluar, ne kemi zhvilluar një program të vogël që përshtatet në sektorin 512-byte të floppy disk (sektori i tij i parë), dhe tani do ta finalizojmë atë në mënyrë që të shtojmë të dhëna shtesë nga disku.

Zhvillimi i ngarkuesit të sistemit

Ne mund të përpiqemi të maksimizojmë vëllimin e kodit binar të sistemit tonë operativ në mënyrë që të vendosim atë në sektorin e parë 512 byte të floppy disk, ai që është i ngarkuar nga BIOS do të thotë, por në këtë rast nuk do të bëjmë kanë aftësinë për të zbatuar ndonjë veçori interesante. Prandaj, ne do t'i përdorim këto 512 bytes për të akomoduar kodin binar të një bootloader të thjeshtë të sistemit, i cili do të ngarkojë kodin binar të kernelit OS në RAM dhe do ta ekzekutojë atë. (Pas kësaj, ne do të zhvillojmë kernelin e OS, i cili do të shkarkojë kodin binar të programeve të tjera nga disku dhe të ekzekutojë atë, por do të thuhet më vonë.)

Ju mund të shkarkoni kodin burimor të shembujve të konsideruar në artikullin sipas referencës www.linuxvoice.com/code/lv015/asmschool.zip. Dhe ky është kodi i bootloader sistemit tonë nga dosja me emrin boot.asm:

Bit 16 JMP fillim të shkurtër; Shkoni në etiketë me një përshkrim të kalimit të Disk NOP; Supplement para se të përshkruajnë disk% përfshijnë "BPB.ASM" Start: Mov AX, 07c0H; Mov ds, adresa e ngarkimit të sëpatë; Segmenti i të dhënave të Movit, 9000h; Përgatitja e pirg SS, AX MOV SP, 0ffffh; Stack rritet poshtë! CLD; Instalimi i flamurit të flamurit MOV SI, Kern_Filename Call Load_File JMP 2000H: 0000H; Shko te ngarkuar nga skedari Kodi binar kernel kern_filename db "mykernelbin"% përfshijnë "disk.asm" herë 510 - ($ - $$$) db 0; Shtimi i kodit binar zero deri në 510 bytes DW 0AA55H; Binary System Loader Binar Code Buffer:; Business tampon për përmbajtjen e diskut

Në këtë kod, udhëzimi i parë i procesorit qendror është instruksioni i JMP, i cili ndodhet pas direktivave të biteve që tregon sembolin e NASM-it që përdoret modaliteti 16-bit. Siç ju kujtohet ndoshta nga neni i mëparshëm i serisë, ekzekutimi i BIOS i ngarkuar nga disku nga disku i kodit binar 512-byte fillon që nga fillimi, por ne duhet të shkojmë në etiketë për të kaluar një të dhënë të veçantë vendosur. Natyrisht, muajin e kaluar ne thjesht regjistruam kodin në fillim të diskut (duke përdorur Utility DD), dhe pjesa tjetër e hapësirës në disk ishte lënë bosh.

Tani ne do të duhet të përdorim një disketë me një sistem skedari të përshtatshëm MS-DOS (FAT12), dhe për të punuar saktë me këtë sistem skedari, duhet të shtoni një sërë të dhënash të posaçme pranë fillimit të sektorit. Ky grup quhet njësia BIOS Parametri BIOS (BPB) dhe përmban të dhëna të tilla si një etiketë disk, numri i sektorëve dhe kështu me radhë. Nuk duhet të jetë e interesuar për ne në këtë fazë, pasi tema të tilla mund të jenë të përkushtuara për një seri artikujsh, prandaj ne kemi vendosur të gjitha udhëzimet që lidhen me të dhe të dhënat në një skedar burim të veçantë me emrin BPB.mm.mas.

Bazuar në sa më sipër, kjo direktivë nga kodi ynë është jashtëzakonisht i rëndësishëm:

% përfshijnë "bpb.asm"

Ky është një Direktivë e NASM-it që ju lejon të aktivizoni përmbajtjen e skedarit të kodit burimor të caktuar në skedarin e kodit të tanishëm të kodit aktual në procesin e Kuvendit. Kështu, ne mund të bëjmë kodin e bootloader tonë të sistemit sa më të shkurtër dhe të kuptueshëm, duke bërë të gjitha detajet e bllokut të parametrave të BIOS në një skedar të veçantë. Blloku i parametrave të BIOS duhet të jetë i vendosur përmes tre bytes pas fillimit të sektorit, dhe që kur Udhëzimi i JMP merr vetëm dy bytes, ne duhet të përdorim udhëzimin e NOC (emri i saj është decrypted si "asnjë operacion" - ky është një udhëzim që nuk bën asgjë përveç shpenzimeve të cikleve të procesorit qendror) për të mbushur byte të mbetura.

Punoni me një pirg

Tjetra, ne do të duhet të përdorim udhëzime të ngjashme me ato të diskutuara në artikullin e fundit, për të përgatitur regjistrat dhe rafte, si dhe udhëzimet e CLD (decrypt si "drejtim të qartë"), i cili ju lejon të vendosni flamurin e drejtimit për udhëzime specifike, Të tilla si Udhëzimi Lodsb, i cili pas ekzekutimit të saj rrisin vlerën në regjistrin SI, dhe nuk e zvogëlon atë.

Pas kësaj, ne kemi vënë adresën e vargut në Regjistrin SI dhe e quajmë funksionin tonë të ngarkesës. Por mendoni për një minutë - ne nuk e kemi zhvilluar ende këtë funksion! Po, kjo është e vërtetë, por zbatimi i tij mund të gjendet në një tjetër nga skedari i kodit burimor me emrin disk.asm.

Sistemi i skedarit FAT12 i përdorur në disqet e floppy që janë të formatuara në MS-DOS është një sistem i thjeshtë ekzistues i skedarëve, por gjithashtu kërkohet një sasi e konsiderueshme e kodit për të punuar me përmbajtjen e saj. Ngarkesa e ngarkesës_file ka një gjatësi prej rreth 200 rreshta dhe nuk do të jepet në këtë artikull, pasi ne e konsiderojmë procesin e zhvillimit të sistemit operativ dhe jo shoferit për një sistem të caktuar të skedarëve, prandaj nuk është shumë e arsyeshme të shpenzosh Vendi në faqet e revistës. Në përgjithësi, ne kemi lidhur kodin burimor të diskut.asm pothuajse para përfundimit të dosjes së kodit të tanishëm të kodit dhe mund të harrojmë për të. (Nëse jeni ende të interesuar në strukturën e sistemit të skedarit FAT12, ju mund të njiheni me rishikimin e shkëlqyer në http://tinyurl.com/fat12spec, pastaj shikoni në kodin burimor të diskut. - Kodi i përmbajtur në të komentoi mirë.)

Sidoqoftë, nënroutina e ngarkesës ngarkon kodin binar nga dosja me emrin e specifikuar në Regjistrin SI, në një segment 2000 me një ndryshim 0, pas së cilës ne e kryejmë kalimin në fillim të ekzekutimit. Dhe kjo është e gjitha - kerneli i sistemit operativ është i ngarkuar dhe ngarkuesi i sistemit ka kryer detyrën e saj!

Ju ndoshta keni vënë re se emri i skedarit kernel të sistemit operativ në kodin tonë përdor Mykernelbin në vend të Mykernel.bin, i cili përshtatet plotësisht në emrat e emrave 8 + 3 të përdorura në disqe floppy në DOS. Në fakt, në sistemin e skedarit FAT12, përdoret përfaqësimi i brendshëm i emrave të skedarëve, dhe ne e ruajmë vendndodhjen duke përdorur emrin e skedarit, i cili garantohet që të mos zbatohet në mekanizmin e nënroutinës së ngarkesës së ngarkesës së ngarkesës së pikës dhe të konvertojë skedarin Emri në pamjen e brendshme të sistemit të skedarit.

Pas vijës me direktivën e kodit burimor të skedarit disk.asm, ka dy rreshta të dizajnuara për të shtuar kodin binar të ngarkuesit të sistemit me zero në 512 bytes dhe përfshirjen e fundit të kodit binar (është theksuar artikullin e fundit). Së fundi, në fund të kodit ka një etiketë "tampon", e cila është përdorur nga nënroutina e ngarkesës. Në përgjithësi, Ngarkesa e Load_File kërkon hapësirë \u200b\u200btë lirë në RAM për të kryer disa veprime të ndërmjetme gjatë skedarit të kërkimit në disk, dhe ne kemi hapësirë \u200b\u200btë mjaftueshme të lirë pas shkarkimit të bootloader sistemit, kështu që ne vendosim tampon pikërisht këtu.

Për të mbledhur një bootloader sistem, përdorni komandën e mëposhtme:

Nasm -f bin -o boot.bin boot.asm

Tani ne duhet të krijojmë një imazh të një floppy virtuale në formatin MS-DOS dhe të shtoni kodin binar të bootloader tonë të sistemit në 512 bytes të parë duke përdorur komandat e mëposhtme:

Mkdosfs -c floppy.img 1440 dd conv \u003d notrunc nëse \u003d boot.bin e \u003d floppy.img

Për këtë, procesi i zhvillimit të një ngarkuesi të sistemit mund të konsiderohet i përfunduar! Tani kemi një imazh të një floppy boot që ju lejon të ngarkoni kodin binar të bërthamës së sistemit operativ nga dosja e quajtur mykernel.bin dhe ekzekutoni atë. Tjetra ne po presim për një pjesë më interesante të punës - zhvillimin e vetë kernelit të sistemit operativ

Thelbi i sistemit operativ

Ne duam kernelin tonë të sistemit operativ shumë detyra të rëndësishme: tërhequr një përshëndetje, mori hyrjen nga përdoruesi, instaluar nëse i porositur nga komanda u mbështet, dhe gjithashtu kryen programet nga disku pas përdorimit të emrave të tyre . Ky është kodi kryesor i sistemit operativ nga skedari mykernel.asm:

MOV AX, 2000H MOV DS, LOOP AX: LOOP AX: MOV SI, CALL të shpejtë LIB_PUT_STRING LIB_INPUT_STRING CMP BYTE, 0 JE LOOP CMP WORD, "LS" JE LIST_FILES MOV, SI MOV CX, 32768 CALL LIB JC load_fail loop load_fail: mov si, load_fail_msg thirrje lib_print_string jmp list_files: mov si, file_list call lib_get_file_list call lib_print_string jmp loop shpejtë db 13, 10, "myos\u003e", 0 load_fail_msg db 13, 10, "nuk u gjet! ", 0 herë user_input 256 db 0 file_list herë 1024 db 0% përfshijnë" lib.asm "

Para shqyrtimit të kodit, ju duhet t'i kushtoni vëmendje vijës së fundit me direktivën për lidhjen e kodit burimor lib.asm, i cili është gjithashtu në arkivin e asmschool.zip nga faqja jonë e internetit. Kjo është një bibliotekë e subryinave të dobishme për të punuar me një ekran, tastierë, vargje dhe disqe që gjithashtu mund të përdorni - në këtë rast, ne e lidhim këtë skedar të kodit burimor në fund të kodit burimor kryesor të bërthamës së sistemit operativ në rregull për të bërë më të fundit si kompakt dhe të bukur të jetë e mundur.. Referojuni seksionit "Lib.asm Biblioteka Subroutine" për më shumë informacion rreth të gjitha subroutines në dispozicion.

Në tre linjat e para të kodit kryesor të sistemit operativ, ne plotësojmë regjistrat e segmentit të të dhënave për të treguar segmentin 2000, në të cilin ngarkohet kodi binar. Kjo është e rëndësishme për funksionimin e duhur të udhëzimeve të udhëzimeve të tilla si Lodsb, i cili duhet të lexojë të dhëna nga segmenti aktual, dhe jo nga ndonjë tjetër. Pas kësaj, ne nuk do të kryejmë asnjë operacion shtesë me segmente; Sistemi ynë operativ do të punojë me 64 KB RAM!

Tjetra, kodi është një etiketë që korrespondon me fillimin e ciklit. Para së gjithash, ne përdorim një nga nën-unroutinet nga libri libri i librave, domethënë lib_print_string, për të nxjerrë përshëndetjet. Bytes 13 dhe 10 para vargut përshëndetëse janë simbolet e tranzicionit në një vijë të re, falë të cilave përshëndetja nuk do të shfaqet menjëherë pas prodhimit të ndonjë programi, dhe gjithmonë në vijën e re.

Pas kësaj, ne përdorim një tjetër nënroutine nga libri libri i quajtur lib_input_string, i cili merr personazhet e futur nga përdoruesi duke përdorur tastierën dhe i kursen ato në tampon, treguesi në të cilin është në regjistrin SI. Në rastin tonë, tamponja është deklaruar më afër fundit të kodit bazë të sistemit operativ si vijon:

User_Input Times 256 dB 0

Ky reklamë ju lejon të krijoni një tampon me një gjatësi prej 256 karakteresh të mbushura me zero - gjatësia e saj duhet të jetë e mjaftueshme për të ruajtur komandat e një sistemi të tillë të thjeshtë operativ si tonë!

Tjetra, ne kryejmë një kontroll të hyrjes së përdoruesit. Nëse byte e parë e tamponit të përdoruesit është zero, përdoruesi thjesht shtypi butonin e hyrjes pa hyrë në asnjë komandë; Mos harroni se të gjitha linjat përfundojnë me simbole zero. Kështu, në këtë rast, ne duhet thjesht të shkojmë në fillim të ciklit dhe të sjellim përsëri një përshëndetje. Megjithatë, në rast se përdoruesi hyn në ndonjë komandë, ne do të duhet të kontrollojmë së pari nëse ka hyrë në komandën ls. Deri në momentin aktual, ju mund të vëzhgoni programet tona të montuesit që krahasojnë vetëm bytes individuale, por mos harroni se është gjithashtu e mundur të krahasoni vlerat dy byte ose fjalët e makinës. Në këtë kod, ne e krahasojmë fjalën e parë të makinës nga tamponi i përdoruesit me një fjalë makine, që korrespondon me LS String dhe nëse ato janë identike, lëvizni në kodin poshtë kodit më poshtë. Brenda këtij blloku të kodit, ne përdorim një tjetër subroutine nga biblioteka. Biblioteka për të marrë listën e skedarëve të vendosur në disk (për ruajtjen e së cilës duhet të përdoret skedari i skedarit të skedarit), shfaqni këtë listë në ekran dhe kthehuni në ciklin për të trajtuar kontributin e përdoruesit.

Ekzekutimi i programeve të palëve të treta

Nëse përdoruesi nuk fut në komandën LS, supozojmë se ajo hyri në emër të programit nga disku, kështu që ka kuptim të përpiqemi ta ngarkojmë atë. Biblioteka jonë e bibliotekës përmban zbatimin e Lib_load_file Subroutine Utility, i cili shkarkon tabelat e sistemit të skedarëve FAT12 Disk: ajo merr një tregues në fillim të linjës me emrin e skedarit me anë të regjistrit tëx, si dhe vlerën e paragjykimit për shkarkim kodin binar nga skedari i programit përmes skedarit CX. Ne tashmë e përdorim Regjistrin SI për të ruajtur treguesin në vargun me kontributin e përdoruesit, kështu që ne e kopjojmë këtë tregues në regjistrin ex, pas së cilës kemi vënë vlerën e 32768 të përdorur si një zhvendosje për të shkarkuar kodin binar nga skedari i programit në Regjistri CX.

Por pse e përdorim këtë vlerë si një zhvendosje për shkarkimin e kodit binar nga skedari i programit? Epo, është vetëm një nga opsionet për kartën e shpërndarjes së kujtesës për sistemin tonë operativ. Për shkak të faktit që ne punojmë në një segment prej 64 KB në madhësi, dhe kodi binar i kernelit tonë është i ngarkuar me një zhvendosje prej 0, ne duhet të përdorim 32 KB të parë të kujtesës për të dhënat e bërthamës dhe të mbetur 32 KB për të dhënat e programeve të shkarkueshme. Kështu, kompensimi 32768 është mesi i segmentit tonë dhe ju lejon të jepni një sasi të mjaftueshme RAM si një bazë të sistemit operativ dhe programeve të shkarkueshme.

Pas kësaj, subroutine lib_load_file kryen një operacion jashtëzakonisht të rëndësishëm: nëse nuk mund të gjejë dosjen me emrin e specifikuar në disk ose për ndonjë arsye nuk mund ta lexojë atë nga disku, thjesht përfundon dhe vendos një flamur të veçantë transferimi (mbajtje) . Ky është flamuri i statusit të procesorit qendror, i cili është i instaluar në procesin e kryerjes së disa operacioneve matematikore dhe në momentin nuk duhet të jetë i interesuar, por në të njëjtën kohë mund të përcaktojmë praninë e këtij flamuri për të marrë vendime të shpejta. Nëse Lib_load_asm Subroutine përcakton flamurin e transferimit, ne përdorim udhëzimet e JC (tranzicioni me flamurin e transferimit - hidhen nëse mbart) për të shkuar në bllokun e kodit, brenda së cilës mesazhi i gabimit është prodhimi dhe kthimi në fillim të ciklit të përpunimit të përdoruesit të përdoruesit .

Në të njëjtin rast, nëse flamuri i transferimit nuk është i vendosur, ne mund të konkludojmë se Lib_load_asm Subroutine ka ngarkuar me sukses kodin binar nga skedari i programit në RAM 32768. Gjithçka që na nevojitet në këtë rast duhet të fillojmë ekzekutimin e kodit binar Shkarkuar në këtë adresë, që është, për të filluar ekzekutimin nga përdoruesi i specifikuar nga përdoruesi! Dhe pas përdorimit të rënies do të përdoret në këtë program (për t'u kthyer në kodin e thirrjes), ne thjesht do të kthehemi në ciklin e përpunimit të përdoruesit të përdoruesit. Kështu, ne kemi krijuar një sistem operativ: përbëhet nga mekanizma të thjeshtë për programet e analizimit dhe ngarkimit të zbatuara brenda rreth 40 rreshtave të kodit të kuvendit, edhe pse me një ndihmë të madhe nga subroutinet nga libri i librave.

Për të mbledhur kodin kryesor të sistemit operativ, përdorni komandën e mëposhtme:

Nasm -f bin -o mykernel.bin mykernel.asm

Pas kësaj, ne do të duhet në një farë mënyre të shtoni skedarin mykernel.bin në skedarin e imazhit të floppy disk. Nëse jeni të njohur me pranimin e imazheve të montimit duke përdorur pajisje loopback, ju mund të hyni në përmbajtjen e floppy.img i imazhit të diskut, duke përdorur ato, por ka një mënyrë më të thjeshtë për të përdorur MTOOLS Moolk (www.gnu.org/ Software / mtools). Ky është një sërë programesh për të punuar me disqe floppy në të cilat përdoren sistemet e skedarëve MS-DOS / FAT12, të disponueshme nga depoja e paketave softuerike të gjitha shpërndarjet popullore Linux, kështu që ju do të duhet të përdorni vetëm apt-get, yum, pacman ose ndonjë ndërmarrje tjetër, e përdorur për të instaluar paketa softuerike në shpërndarjen tuaj.

Pas instalimit të paketës së duhur të softuerit për të shtuar skedarin mykernel.bin në skedarin disk floppy.img, ju do të duhet të ekzekutoni komandën e mëposhtme:

Mcopy -i floppy.img mykernel.bin :: /

Kushtojini vëmendje karaktereve qesharake në fund të ekipit: zorrës së trashë, zorrës së trashë dhe prerje. Tani ne jemi pothuajse të gatshëm për të nisur sistemin tonë operativ, por cila është pika në këtë, ndërsa nuk ka aplikime për të? Le të korrigjojmë këtë keqkuptim, duke zhvilluar një aplikim jashtëzakonisht të thjeshtë. Po, tani ju do të zhvilloni një kërkesë për sistemin tuaj operativ - vetëm imagjinoni se sa besueshmëria juaj do të rritet në rreshtat e gickers. Ruaj kodin e mëposhtëm në skedarin me emrin test.asm:

Org 32768 mov ah, 0h mov al, "x" int 10h ret

Ky kod thjesht përdor funksionin e BIOS për të nxjerrë simbolin "X" në ekran, pas së cilës kthehet në kontrollin që e ka shkaktuar atë në kodin e saj - në rastin tonë, ky kod është kodi i sistemit operativ. String Org me të cilin fillon kodi burimor i aplikimit nuk është një udhëzim i procesorit qendror, por Direktiva e Asamblesë NASM raporton se kodi binar do të ngarkohet në RAM me një zhvendosje 32768, prandaj është e nevojshme të rillogaritet të gjitha zhvendosjet me këtë rrethanë.

Ky kod gjithashtu ka nevojë për një asamble, dhe skedarin binar që rezulton - përveç imazhit të një floppy në një skedar:

Nasm -f bin -o test.bin test.asm mcopy -i floppy.img test.bin :: /

Tani merrni një frymë të thellë, përgatituni për meditimin e rezultateve të patejkalueshme të punës suaj dhe ngarkoni imazhin e floppy disk duke përdorur një emulator PC, si Qemu ose VirtualBox. Për shembull, për këtë qëllim mund të përdoret komanda e mëposhtme:

Qemu-System-i386 -Fda floppy.img

Voila: boot.img ngarkues i sistemit, të cilin ne integruar në sektorin e parë të imazhit të diskut, ngarkon kernelin e sistemit operativ Mykernel.bin, i cili tregon një përshëndetje. Shkruani komandën LS për të marrë emrat e dy dosjeve të vendosura në disk (Mykernel.bin dhe test.bin), pas së cilës futni emrin e skedarit të fundit për ekzekutimin e tij dhe simbolin X në ekran.

Është e ftohtë, apo jo? Tani mund të filloni të rafinoni shell komandën e sistemit operativ, shtoni komanda të reja për të shtuar skedarë shtesë të programit në disk. Nëse doni të drejtoni këtë sistem operativ në një PC të vërtetë, duhet t'i referoheni "nisjes së fillimit të huasë së sistemit në platformën e vërtetë të harduerit" nga seritë e mëparshme të artikullit - do t'ju duhet saktësisht të njëjtat komanda. Muajin e ardhshëm, ne do ta bëjmë sistemin tonë operativ më të fuqishëm duke lejuar programet e shkarkueshme për të përdorur funksionet e sistemit dhe duke realizuar konceptin e ndarjes së kodit që synon reduktimin e dyfishimit të saj. Pjesa më e madhe e punës është ende përpara.

Programet e bibliotekës lib.asm.

Siç u përmend më herët, Lib.asm Biblioteka ofron një grup të madh subroutinash të dobishme për përdorim brenda kuadrit të kores tuaj të sistemit operativ dhe programeve individuale. Disa prej tyre përdorin udhëzime dhe koncepte që ende nuk janë adresuar në nenet e kësaj serie, të tjerë (të tilla si subroutines për të punuar me disqe) janë të lidhura ngushtë me tiparet e pajisjes së sistemeve të skedarëve, por nëse e konsideroni veten kompetent në këto Çështjet, ju mund të njiheni në mënyrë të pavarur me implementimet e tyre dhe të kuptoni parimin e punës. Është më e rëndësishme të merren me mënyrën e thirrjes së tyre nga kodi juaj:

  • lib_print_string - merr një tregues për një varg që përfundon me simbolin zero përmes Regjistrit SI dhe tregon këtë varg në ekran.
  • lib_input_string - merr një tregues të tampon përmes Regjistrit SI dhe mbush këtë tampon me karaktere të futur nga përdoruesi duke përdorur tastierën. Pasi përdoruesi shtyn çelësin e hyrjes, vargu në tampon përfundon me një simbol zero dhe kontrolli kthehet nga kodi i kodit të programit.
  • lib_move_cursor - lëviz kursorin në ekran në një pozicion me koordinatat e transmetuara nëpërmjet regjistrave të DH (numri i linjës) dhe DL (numri i kolonës).
  • lib_get_cursor_pos - ju duhet ta telefononi këtë nën-unroutin për të marrë numrat aktualë të rreshtit dhe kolonën përmes regjistrave DH dhe DL, respektivisht.
  • lib_string_uppercase - merr një tregues në fillim të një vargu me një simbol zero përmes regjistrit tëx dhe transferon simbolet e vargut në regjistrin e lartë.
  • lib_string_Length - merr një tregues në fillim të një vargu me një simbol zero me anë të një regjistri të sëpatë dhe e kthen gjatësinë e saj me anë të regjistrit tëx.
  • lib_string_compare - pranon tregues në fillim të dy simboleve të vargut me rradhë përmes regjistrave SI dhe di dhe krahason këto linja. Vendos flamurin e transferimit nëse vargjet janë identike (për të përdorur deklaratën e tranzicionit në varësi të flamurit të transferimit të JC) ose heq këtë flamur nëse rreshtat ndryshojnë (për të përdorur udhëzimet JNC).
  • lib_get_file_list - merr një tregues në fillim të tampon përmes Regjistrit SI dhe vendos një varg në këtë tampon me një simbol zero që përmban skedarin e ndarë me presje.
  • lib_load_file - merr një tregues në fillim të një vargu që përmban emrin e skedarit, përmes regjistrit të sëpatëve dhe ngarkon përmbajtjen e skedarit të zhvendosjes të transmetuar nga regjistri CX. Jep numrin e kujtesës së kopjuar të byte (që është, madhësia e skedarit) me anë të regjistrit BX ose përcakton flamurin e transferimit nëse nuk gjendet skedari me emrin e specifikuar.

rTYCHEFFCHA SELECH VYAD YUFBFEMEK!

rteseschdhayee ChurchHuli NPZMI vushfsh oletulpmshlp obrkhfboschkin. Obushmshobs obbzthlb, assembler, bios. Uzpdos Nwzheg Retaipdine l nmey yofteetopk y rposfopk yubufi - nhches obujoben ryubfsh sdtp. Y ryubfsh nwp veekden për ekstra khsphlpzp htpchos ui.

h obubmoshoschakchkhuyl pufbmpush schoyufi chuzp rbth dprpmokok y vkhdaf rpmopufsha zpff zthyfsh mavel 32-viziton Sdtb.

prededmey shtypur prepashopk rbnsfy

lpyuop, npcop rpuyufbfs pbshn rbnsfy chahukhukh h sdtte - shitje me pakicë bdteub pf 0x100000 v rshfbfshus obbryubfsh ffdb ъ beyueya pfmyueop pf ohhms 0xff. Emuy rty yufeely nsh rpmkhyuben rpmkhyueoope kkhuyueyeye, fp chuјtypyp, yobyuyu rbnsfsfs lpuymimbush - brpneoben bdtue rpumedpezp hdbyupp jufeys, lfp vkhdaf prestbfk rbnsfy. Pdlp fblpk urpupv ynef dchb oedpufbflb:

1) Joief Yurpmshpchbfsh dp chlmayuais uffvshopk bdtebgy, yufpvschi ynfsh dpufhr lp schuheeulpk rbnsfy, mivp khuftbychbfs obryuš utya "polip" Mioss FtbfB Kheney, RTY Humpchy, Yufpe feuffytpchey rbnsfy bios fbl chschposph rty obubmshopk yoyagybmybggy, b nwby demben dchpkuha tbvpfh.

2) châtellip rbnsfs rtedofbchmsef usertchmsef hubouffl bdteupch, op op opterflyopn rbnsfy ppp rtbchimp npccf npfsfsh. L FPHH Tsa Bios Ryyef H Rebughn Pvshuokh rbnsfsfs fbvigsfis acpi, lpfptska rtyzpdsfus plastbgypopk uyufene yu ufpef yi babfytbfsh dp rtpufeuks.

yfpzp utpufsh, yufp mkhyuy urtpuyfsh rtp predbfychopk rbnsfi x bios, nambzp në redpufbchmsef chuhepvipdin schlongiy.

yufptyyueues retchpk ghholgyek predemeyys preplay prepashopk rbnsfy lshp rttstchbeke 0x12. Pop OE Rtyoyynbef Oilblii Chipdoshi rbtbnefttch, ora rreth pulave H Tezieft Ax upesyfus tbnpcpc rbnsfy h limpvbkfbbi. Wbpcbs rbnsfsf - fe hiq 640 lv dpufhrow whorebmshopn tesine. Chist chister htch oe pappef obcph lpnrshafet, zee vss lssp neo 640 lv rbnsfy, op nbmp mua. Yurpmshpchbfs еј onn onshumb oef - emuy rtpgeupt rpbetsychbef obayeјoshk tzin, fp chtzd mi x ozep vhdef nonoy oleulpmshliy nebvbkf rbnsfy.

rBNSFI TPUMYY 640 LV UFBMP NBMP. FPDDB rpschymbush rfbs Zhholgis - rttstschbeke 0x15 ah \u003d 0x88. CipbeBef H Ax TBNETTEOPK RBNSFI (Tasteners 1 HB) H Limmbkfby H Axe. Lfb Zhholgys oe npsfef chpctbebfsh ъobyuyuyuyum vsmsh 15 nv (15 + 1 yfpzp 16 hv).

lpdb th 16 nv ufbmp odpufbfupu rpschymbush opbs zholgis - rttstschackeya 0x15, ax \u003d 0xe801. CIPCTBEEFE CHROACHMSHFBFSHT BC H 4 TEZIHFTBI:

AX - TBNTETOPK rbnsfy dp 16 hv h limplebkfby
BX - TBNTHTEEOPK RBNSFI Records 16 NV LPLBBI RP 64 LV
CX - TBNEZHTYTPCHBOBOPK TBUTEEOPK RBNSFI DP 16 HB H LIMPVBKFBI
DX - TBNEZHTYTPCBOBOPK TBYTEEOPK RBNSFI RECORDS 16 HV H VMPLBI RP 64 LV

ufp fblezhtchbobs rbnsfsfsfchbspdifemi bios umds rp chueneh oe dpzpchptymyus, rpppnh pladp rtpupp, emuy h ax bx bx ohmy, vtbfsh dx.

opi lfpp plbbmpuch nbmp. Cedsh chuhe reeyeyuyuoshchi chrkhchyuyui yoaf pztboypbshnb rbnsfy h 4 pla, l ffa tsa oe hyuyfshchbaf fp, yufp rbnsfs npsfsp vspshtpn. Ripfpnh me sigurinë kombëtare BIOS RPSchymbush EE® Pdob Ghholgys - RTTSTSCBEKE 0x15, AX \u003d 0XE820. CIPCTBEFEF OE RTPUP YUYUMP, B LBTFH RBNSFY. Chipdece rbtbneoftch:

Eax \u003d 0xe820.
EDX \u003d 0x534D4150 ("SMAP")
EBX - uneyeye pf obubm lbtfshch rbnsfy (dms obubbm 0)
Ecx - tbnet skzhtb (l btbchypamp 24 vbkfb - tbnet pdopzp bnneofb)
Es: di - bdteu skzhtb, shtëpi botuese lhdb obřebfsh pyetenkopk bneeof

kalimi i RBTBNESTECH:

Eax \u003d 0x534D4150 ("SMAP")
EBX - SCPEC uneeye dms umdohasezp chismbb Zholgiy. Eumë 0, fp chus lbtfb rbnsfy rtuppyufbb
Ecx - lpmyueuuufchp tebmshop chpctebooobi vbkf (20 ymy 24 vbkfb)
h hlbbbbof shece upefus pühdopk bnsfy lbtfsfi.

lbzdschk bnseop lbtfsfs rbnsfy ynef utelhaech inthlfchth (radhëwwh h uyofbluuye ui, rpff yufp tbvpt Kisha e Nschden Dembfsh htzh sdtte):

Struktura (baza e gjatë e gjatë;

rpumedyadok bneofthlfhtsch oe pvsbfemeo. EEAH H PDOPN YUFPYOOEL CHEDEM, YUFP RETAD OBRTPUPN BNENEFB UFPIFE RPNEUFYFS FDB Emiyulh. Lpoyyup, isbububu oe rapdabychben acpi, op mkhyuya ibtoboye rpbvpfyfus p fpn, ifpvch rpmhyufsh llb npcop vmyshike. H pfmyyuy pf rbtbnffch rbnsfi, chu Pufbmshop NPCOP Meslp Khobobsh ya yabbeeopsp Tecrb Orpershna, bios.

rbnsfy teziepurspect, preschbensky lbtfpk, npzkhf vsfshfshfshfsly frph:

1 - PVSHYUBS RBNSFSF. NPCCF vsfsh studio yurpmshpchbob pu dms vychkyi gemek. Rplb nsh fpmslp l oek vkedd pvtbebfsus, b chu pufbmshop rtprhulbfsh.
2 - BTBTeetchytchbop (obinnet, BIOS LPD). Lfb rbnsfsf npsfsf wsfs llb zhyeweoley odpufrfot dms obruly, fblupp obryuush ffdb ocetembfemshob. FBLCH RBNSFS MHYUE OE FTPSBFSH.
3 - DPUFHROP RPUME RTPUFEAU FBVMIG ACPI. Chetpsfop, jnoop ch ifi vampplby bff fbvmigsfus. Rplb dtbcttec acpi oe rtpuyfbef fbvmygshsfs, bnsf rbnsfs mhyue oe ftpsbfsh. Rpfpn npcp yurpmshpchbfs fBl Tse, LLB n rbnsfsfs firb 1.
4 - BNSFSFSFS UMLOHEF UPITBOSFS NVS NVS UYUUUSNESNE. FBLSH RBNSFSFS NHS FTPZBFSH OE VKEDD, RPLB OE Khoben, YUFP FBLP NVS WEUUY :-)

oE Chue Bios NPZHF Rapdabychbfsh Bhkholgya. Eumy lbon-fp zhholgis oe rpabychbefus, fp rty chicpid ya oeј hufbopchmeo zhumbz retherboisi c umvedhef pvtbebfsus l sftpk. Nwby veekden yurpmshpchbfs zhptnbf lbtfsh rbnsfy zolgiy 0xe820. Emuy ubnh bfhhholgya chschbffsh oe rpmkhyumphsh - rpmkhyubfs prevenie rbnsfy pvschyukny studiodfchbny uphedbchbfs kujdesit të kontribucheoch lbtfh rbnsfy ju pdopzp bnseofb. Rpulpmshlh pededmao pepperbubs rbnsfy obbdbyub oklobs dmsabrkhulb 32-wyfopzp y dms obbrhulb 64-wyfopzp sdtb, mhyue pzhpnifsh el chede rpldrtcztbnnnch. Lbtfh rbnsfi tbnefun rp bdteuch 0x7000. OE DHNBA, SUFP NPSFSF VSSFS NMMS RBTSC LYMPVBKF. Rpumedyak bneeof chhthookhukh udmben firb 0 - flppzp firb oe cipbebef bios y ifp vkdaf rtyyoblpn lpodb.

; Rpmkhyueyey lbtfsfs rbnsfy get_memory_map: mov di, 0x7000 xor ebx, ebx @: mov eax, 0xe820 mov edx, 0x534d4150 mov ecx, 24 mov dword, 1 int 0x15 jc @f Shto di di, 24 test ebx, ebx jnz @ b @ cmp Di, 0x7000 ja .ok m MOV, 0x100000 mov DWORD, 0 MOV DWORD, 0 MOV DWORD, 1 MOV DWORD, 0 MOV AX, 0XE801 INT 0x15 JNC @f MOV AH, 0x88 int 0x15 JC .OK MOV CX, AX XOR DX , Dx @ test cx, cx jz @f mov mov, cx mov, dx @: movx exx, mul ecx, 1024 mul ecx push, ebx mov ecx, 65536 Mul ecx pop edx Shto EAX, EDX MOV, EAX Shto di, 24 JMP .ok .ok: XOR AX, AX MOV CX, 24/2 Re Stosw

oh, CPFs e spffb-it të ObuvoshoshDMS 32-spout do të mbahet. H zablmayuoye rtichptsh ezp rpmoshk lpd ny retekdјn l sdtx.

; Obuchoshoscope кббзтхюйл Сдтбддс дмс btifelfhtscht x86 format binar si "bin" org 0x7c00 JMP boot; Listfs Align 4 fs_magic dd? Fs_version dd? Fs_flags dd? Fs_base dq? Fs_size dq? Fs_map_base dq? Fs_map_size dq? Fs_first_file dq? Fs_uid dq? Fs_block_size dd? ; Bbzpmpcpl zbkkmb virtual në 0x800 f_info: f_name rb 256 f_next dq? F_PREV DQ? F_parent dq? F_flags dq? F_data dq? F_size dq? F_CTIME DQ? F_mtime dq? F_atime dq? Fundi virtual; Bosset obuschopzp к боблхъбльб боблхъбльбльб Бе 000 etiketë e etiketuara në $$ + 2 Label Disk_id Byte në $$ + 3 reboot_msg db "Shtypni ndonjë çelës ...", 13,10,0 boot_file_name db "boot.bin", 0; Chisppd wypply ds: si rreth lttbbo write_str: Push si mov ah, 0x0e @: lodsb test al, al jz @f @ pop si ript; LTIFYEWULBS PYIVLB ERROR: Pop SI thirrje write_str; Reboot Reboot: mov si, reboot_msg thirrje write_str xor ah, ah int 0x16 jmp 0xffff: 0; BBZthylb WELFTB DX: AX H Si es: DI Load_Sctor: Push DX Add AX, Word ADC DX, Word CMP BYTE, 0xff je .se_edd Push CX Si Div Mov Cl, AH MOV CH, AH MOV Dl, mov bx, di mov al, 1 mov si, 3 @: mov ah, 2 int 0x13 jnc @f xor ah, ah int 0x13 dhjetor si jnz @ b.Error: Call error db "DISC gabim", 13.10 0 @ : Pop si cx bx dx ret .use_edd: Push SI mov byte, 0x10 mov byte, 0 mov word, 1 mov, di pop word pop mov, mov mov, dx mov word, 0 mov word, 0 mov ah 0x42 mov dl , MOV SI, 0x600 int 0x13 JC .Error pop si dx ret; Ripule ZhBKMB Ukrneen DS: SI H LBFBOX DX: AX GJENDJA: PUX CX DX di .Find: CMP AX, -1 JNE @f CMP DX, -1 JNE @F .Not_Found: Gabim i thirrjes DB "nuk u gjet", 13, 10.0 @: Mov di, f_info call load_sctor push di mov cx, 0xfffff xor al, al repne scasb neg cx dec cx pop di push si repe cmpsb pop si je .Found mov, fjalë mov dx, fjalë jmp .Find. Gjetur: pop Di dx cx ret; Бобзльбльб felhep zbbkmb h rbnsfsf rp bdtteuh bx: 0. Lpmyueuufchp кбтчтбэтцепески пелфптпчччтбэбэбэфуск х Load_File_data: Push Bx CX DX si di mov, word mov dx, word.load_list: cmp ex, -1 jne @f cmp dx, -1 jne @f .file_end: pop di si dx cx mov , BX POP BX SUX, BX SHR AX, 9 - 4 RET @: MOV di, 0x8000 / 16 Call Load_Sector MOV SI, DO MOV CX, 512/8 - 1 .LOD_Sctor: Lodsw MOV DX, shtoni SI, 6 CMP AX , -1 Jne @f cmp dx, -1 je .file_end @: Push es mov es, bx xor di, di call load_sctor Shto bx, 0x200 / 16 pop es loop.Lo_Sctor Lodsw MOV DX, JMP.LOAD_LIST; Fppulb chipdb h boot obubyl:; Faftwine utynophostepacker jmp 0: @f @: mov ax, cs mov ds, mov es es, sëpatë; LOGINFIN UFEL MOV SS, AX MOV PS, $$; Tbteyn rttststchbobs sti; Obbropnown do të hapë ombrzpyopp d: DYLB MOV, DL; Prodemnein rbtbnestech кнбзthapyoppp diyulb mov ah, 0x41 mov bx, 0x5aa int 0x13 jc @f mov mov byte, 0xff jmp .disk_detected @: mov ah, 0x08 xor di, di es jc load_sctor.error Inc DH MOV, DH dhe CX, 111111B MOV, CX .DISK_DETED:; Oborthene rtpdpmceye obubmshopzp кбот_file_name mov mov, boot_file_name mov, fjala mov DX, fjalë thirrje find_file mov bx, 0x7e00 / 16 Call load_file_data; Reteportine në rtpdpmcea jmp boot2; Rhufpe rtpuftboufchp th ubfchtb rb 510 - ($ - $$) db 0x55.0xaa; Dprmfemfemchobe load_msg_pefike dB "Loading" ", 0 load_msg_suffix db" ". .. ", 0 ok_msg db" ok ", 13,10,0 config_file_name db" boot.cfg ", 0 start16_msg db" duke filluar 16 bit kernel ... ", 13,10,0 start32_msg db" Duke filluar 32 bit kernel. .. ", 13,10,0 etiketë Module_list në 0x6000 Label Memory_map në 0x7000; TBVYEYEYA UFTPLY DS: SI RP UUNCHPMX Split_File_NAME: Push SI @ B @: mov byte, 0 mov, si pop si ret; братхльбльбль бbkmb SI, load_msg_suffix thirrje write_str pop si shtytje si bp mov dx, fjalë mov, word @: Push ax thirrje pull bp, ax pop ax thirrje find_file test byte, 1 jz @f mov si, bp mov dx, fjalë mov, Word jmp @b @ call load_file_data mov si, ok_msg thirrje write_str pop bp si rpmkhyueye lbtfsfs rbnsfy get_memory_map: mov di, memorie_map xor ebx, ebx @: mov exx, 0xe820 mov Ecx, 0x534D4150 Mov Ecx, 24 mov Dword, 1 int 0x15 jc @f Shto di, 24 Test Ebx, Ebx JNZ @b @: cmp di, 0x7000 Ja .ok m MOV Dword, 0x100000 MOV DWORD, 0 MOV DWORD, 0 m Mov, 0xe801 int 0x15 jnc @f mov, 0x15 jc .ok mov cx, mex xor dx, dx @: test cx, cx jz @f mov, dx @: movzx eax, movzx Ebx, 1024 mul ecx push, ebx mov ecx, 65536 mul ecx pop edx Shto eax, edx mov, eax Shto di, 24 JMP. OK.OK: Xor Ax, Ax Mov CX, 24/2 Rep fosw ret; Rtpdpmcee obubmshopzp boot2:; Obzthein lpzhtbgyposhkin zbkm bbzthylb mov si, config_file_name mov bx, 0x1000 / 16 call load_file; Chrchrman obbzthepyuktek ultrf mov bx, 0x9000 / 16 mov bp, module_list mov dx, 0x1000 .Parse_line: mov si, dx .Parse_ar: lodsb test al, al jz .config_end cmp al, 10 je .run_command cmp al, 13 je .run_command jmp .Parse_char .run_command: mov byte, 0 xchg dx, si cmp byte, 0 je .parse_line; Rhufbs sftplb cmp byte, "#" je .parse_line; Lpndefbtyk cmp byte, "l" je.load_file; KBBZthLB ZBBKMB CMP BYTE, "S" je .start; bbrthul sdtb; Omeachufobs lpnbodb mov al, mov [.cmd], al gabim al db "komandë të panjohur boot script" ".cmd db? Db" "!", 13,10,0 .config_end:; Rty rtbchimshopn lpbyzchtbgypopn zbkme nshn oe dpmcsezh odb rprbuftsh; Llogaridhënësi JMP Reboot; Load_File: Push DX Inc Si Call Load_File Push Ax Mov CX, 512 Mul CX Mov Word, Ax Mov Word, DX MOV Word, 0 Mov Word, 0 MovE Ax, BX Mov CX, 16 Mul CX Mov Word, DX Mov Word, 0 Mov Word, 0 Pop Ax Ax, 9 - 4 Shto Bx, Ax Shto BP, 16 Pop DX JMP .Parse_line; Obrkul sdtb.start:; Rt PPCT, Yufp Кб-брстчцено iPFS VSP PDYA ZBKM CMP BX, 0x9000 / 16 JA @f e gabimit të thirrjes db "nuk ka kernel të ngarkuar", 13,10,0 @: ;;; Obrpossen rpumedyadok bneeop urins, AX MOV CX, 16 MOV di, bp rep stosw; Reteporting l rtpgedhte joygbymbggy sdtb DMSKHTSOPK TBTBTSDOPFY INC SI CMP fjalë, "16" je .start16 cmp fjalë, "32" je .start32; word cmp, "64"; je .start64; Omechufobs tstbsdopufs ndtb gabimi i thirrjes db "Argumenti i komandës së pavlefshme të fillimit", 13,10,0; OBRKUL 16-TBTBTSDPP SDTB.Start16: MOV SI, Start16_MSG MOV BX, MODULE_LIST MOV DL, JMP 0x9000; TBrKHUL 32-TBTBTSDPSP SDTB.Start32:; Chischpdin hchedpnmey p obrukhul 32-wyfopsp sdtb mov si, start32_msg thirrje write_str; Rtpchein, yufp rtpgeupt oe akull i386 mov ax, 0x7202 Push AX POPF POPF POP BX CMP AX, BX JE @FE Call Gabim DB "Kërkohet i386 ose më i mirë", 13,10,0 @:; Rpmhyun lbtfh rbnsfi thirrje get_memory_map; Puyufin fbvmigchshchshchy uffbag Xor Axe, AX MOV CX, 3 * 4096/2 MOV di, 0x1000 rep stonw; OBRPMED LBFBMZ UFBBG MOV Word, 0x2000 + 111B MOV Word, 0x3000 + 111b; Къ -бранмен ре речха фбвмйг ифбгугом MOV EAX, 11B MOV CX, 0x100000 / 4096 MOV di, 0x2000 @: stosd Shto EAX, 0x1000 loop @b Къ -brpmen rpummov di, 0x3000 MOV EAX, DWORD ose EAX, 11B MOG ECX, DWORD SHR ECX, 12 @ STOSD Add EAX, 0x1000 LOOP @B MOV Word, 0x4000 + 11b; Kernel Stack Mov Word, 0x3000 + 11b; Tabela e faqes së kernelit; Obbzthein kutyuyuyu h cr3 mov eax, 0x1000 mov cr3, eax; Obbzthein lgdt h h gdtr; Obrtfin rttststchbcbbbbl; Retikdјn H Bayeeјoshk Tzin Mov Eax, CR0 ose EAX, 0x80000001 Mov Cr0, EAX; RetikdoN rreth 32-veffed LPD JMP 8: Start32; FBVMIGB DEVYRFTPP UZENEFPH DMS 32-VypopPZP SDTB ALIGN 16 GDT32: DQ 0; Null - 0 dq 0x00cf9a000000fff; Kodi - 8 dq 0x00cf92000000FFF; Të Dhënave - 16 GDTR32: DW $ - GDT32 - 1 DD GDT32; 32-Vyphotk LPD përdorim32 Start32:; Dezyutpin Ufel Mov Eax, 16 Mov Ds, AX MOV GS, AX MOV SS, AX MOV ESP, 0xFFFFFFC; Rpnufufin h dl hap ombzthepiopsp dyework mov dl,; Rpnufufen h ebx bdteu ur rhbkomph mov ebx, module_list; Rpnufufen h esi bdte lbtfsfs rbnsfy mov esi, kujtesës_map; RETEAPTIN NË SDTP JMP 0XFFC00000

retchp sdtp

sDTP RPLB X Shift VKHDAF UPUFSFSH YE DCHKHI ZBBMP - Startup.ASM Main.C. Startup.asm Okhtzo DMS FPZP, IFPVSH vssfshtechesop, Yufp htfbchmeye rprbdјF Rreth zhlgya kernel_main. Czed host npcsf vsbfsh oe h obehum zbbkmb, b dongwintertup.o nshts rpmpufsha lpoftMythen y eumy hlbzen ezp retchen miolek, fp veekden htbchmsfsh retschky vbkfbn dchpyyupzp zbkkmb.

Formati ELF Public _start extrn kernel_main seksion ".Text" i ekzekutueshëm _start: movzx edx, dl shtyn edx Push ESI PUSH EBX LGDT CALL KERNELL_MAIN @: ;;;;;;;; GDTR: DW $ - GDT DD Gdt

oh, cpf rpumedokom e cird në mjeshtër yuyufpn :-). Nën Querict Mosmith rtpufekhdbukh - Hampzifs H ufel fty btzhneofb DMS Zhholgiy kernel_main th retaedbfs rreth oeј htbchmeye. Rpume ciptbfb ju oeј sdtp hipdyf h veulpoeyosek gylm. Rp chistzy chistzy zhhhhhhjk uy rbtbnefsm ucelohef ryibfsh h ufel h pvtbjpn rpsdre. Fbfpf lpd joygibbmybggy lpdkthcbef opchp ъbewmyeye h gdtr - ferretsh fbvmigb dewtrfph utpftofpch uphydyfus h rtputboufce sdtb dbcu emuy nsh pfnpuffen rtchskkkdkd oilllyy poyvpl.

b firth eknape chlhopoe - rtpukey sdtp ekstrakt chsplpzp htpchos:

Typedef strukturë (baza e gjatë e gjatë e gjatë; madhësi të gjatë të gjatë;) bootmoduleinfo; void kernel_main (char boot_disk_id, void * kujtese_map, bootmoduleinfo * boot_module_list) (char * screen_buffer \u003d (void *) 0xb8000; char * msg \u003d "hello world!"; i panënshkruar int i \u003d 24 * 80; ndërsa (* msg) (Screen_Buffer \u003d * msg; msg ++; i ++;))

lFP SDTP OE DEMBEF OYUZP PUPWEOOPP - RTPUP CHISTPDYF WFTPLH "HELLO WORLD!" Rreth RPUmedoaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaA WFTHLFHTB PRUBOBS H Suchubum VKHDAF OKHUB DM DPUFHRB L URYUHHKHKHMEKE.

chbcop rponofsh, yufp vajblpk ufbodbthopopk vyavmypfeli x shuplaka socialiste - obn dpufhrochki fpmslp FE Zhholgyi, shkolla lpfptskach udni. Chue printf, strcpy, memgy F. R. RtyDјfus tebmyjpchshchbfs uppufpsfemshop, o rshfbkfeush pvtbfshus l në. H uztedheen khsphule nsbknјnus përditësuar nga kategorizimi i custompcp chflp htbobopsp bobmpsb libc, rtpztbnntpchbfs LushpM HDPVOYE. Fff obuisobefus ubnbs yofteetobs yubufsh, b rtyosfishway teeoyes chp nopzpn rpchmisisaf lidhje rreth chua ufthlfchth uyufenz.

ohptlb sdtb

yurpmoshenchez zbkmsh upetbafus h dch bbrb - lpnrymsgys, b rpfpn misolpchlb. Rreth RetobilePn obbre lpnrymsfpt rttwtbhef yuipdosep dpd h lfbodshch rtpguuuptb th upitbosef chokhp h polyfucked zbkm. Lbzdschk npkhmsh uyufensk upitbosefus h pfdemshopn zbkme. H lfpn zbkme FBL TSE UPPETSIFUS Yozhptnbgs p Zhhholgsi, priobsp hpdkhmy, rpppnh ye pdopzp zbkkmb npcop vskhschchbfsp zhhlgya ju dthzpzp. Cheeus LPD H Pellets ZBBKMBI OE Rtichsbby L Polytefoshkn Bdteubn. Rreth CHFPTPN obbre MILETET UPTETIBEF CHU copë e jabbles hp vladiobtoschk. Rty lfpn lpd rtychchchbefus l polttechstven bdteyubn (emuy, lpooyup, nhsh oe upvitben dyobnyeyyuly obbzthtsbenkh vyvmypfelkh), chneufpp wukumped në lidhje me rsholgy rsdufbchmsafus ohches bdteub. Onn okhup rpmhyufshfshfress në chicped pupvshk dchpeyshke zbbkm. LFP RTPUpp LDPD, TEM LBYMI-MYVP obbzpmpchlph (FP EUFSH OE ELF). h lboueufspc wbppsp bdteub yurpmshhefus bdte 0xffc00000. Dms htnpeeysyysftzp nushch priyen chuј, yufp onn okhtsop h uzhibmshopn zhpstnbfe ultyrfb LD:

Outch_format (seksionet "binare") (_start) (_start) (.text 0xffc00000: (* (. tekst) * (. Kod) * (. Rodata *)) .Data align (0x1000): (* (. Align (0x1000): (* (. BSS)) .Empty align (0x1000) - 1: (byte (0)))

lFPF ultyrf Schptife, Pritja e UFP e ZBCM VKDFF Mecbfsh H rbnsfy oertechchospn vplpn obubes bdteub 0xffc00000. H ubnpn obusubum vkdfy ydfy welgys lpdb, rpfpn welgis vetëm fëmijët, obbfen pvschutiches e fëmijëve, rppn oeyyyugybmytibless. Chuye Walage Czchtpchoshchoshchoshet në lidhje me tbnet tbchs 4 lv (chdthz nshp rpfpn obipfin babeifff rreth ctff fbvmigchshchy uftagug lpd pf obrulyui). Rpumedeye pruboyey welgyy.empty opvipdinp dms fpzp, ufpvist dbca oeyyyygybymyyaptchbocke resetsoe-trakebmy strip Si ZBKME (FBN VKHDHF OKHMY). Cedish obushposhoschakchktkhuyl churchsef rbnsfsf dms sdtb thlpchpdufchxsush tbnetpn zbbkMB.

uPVTBFSH Chu SDTP NPCOP OSEHAEINE LPNBODBY:

Fazm startup.asm startup.o gcc -c -m32 -freestending -o main.o main.c ld --oformat \u003d binary -T-script.d -O kernel.bin startup.o main.o

gcc -ffreesanding gcc -ffreestending hlbchchbef en pflayfsh chue ufbodbtoft vyavmipfeli. Cedish putychsbgypopk uyufen, b nnch ryyen hedgehrum.

ohptlb pvtbb dyulb

pvpkdhus veyoyy lpnneftye rtpupp rtchedh miohlupchk ultyrf ohptly pvtbb:

Dd nëse \u003d bin / boot.bios.bin e \u003d bin / boot_sctor.bin bs \u003d 512 count \u003d 1 dd nëse \u003d bin / boot.bios.bin e \u003d disk / boot.bin bs \u003d 1 skip \u003d 512 Cp bin / kernel .bin disk / kernel.bin bin / make_listfs e \u003d disk.img bs \u003d 512 madhësi \u003d 2880 boot \u003d bin / boot_sctor.bin src \u003d. / disk

nga rtedrppzubef, yufp chu ulpnryimytskobobosteg zbkmsh metzbf h bin h fheen lbfbox, b eeј yneefus lbfbmz disk, h lpfptpn metsif boot.cfg umtelhasez utertzbaws:

# Ngarkim kernel lkernel.bin # boot 32 bit kernel s32

emum chist chister udmbmy rtbchymshop, rpmhueoostek pvtb npcp obrkhuffyfsh ьnhmsfpt ymy dbce Rreth Temshopn Central Assem chrgery rpmkhuif radpvukh lbtfiokh:

obbzthüil uuyfshchchbef lpzhtbhappohk zbbm, bbzthcbef sdtp, reatipdyf h bayeeoshk ttsigna reledbјf min hthbchmeye. Rpmkhuyuch ezp, obdp chischpdif rpumedoaa wytmph rreth lttbbo. Lfp mysus whisubmp dpmzpzp rhfi, nwby retaipdine l ubnpk yofteuopk yubufi tbtbvpfli. Ferretsh khsphfuli vkhdhf zptbdp neme rtpufshn dm chpurtjesfis, vmbzpdbts yurpmshppchboy nxjerrës chsplpzp htpchos, lpfptsk llb me Obadaush Chue Flink Obadug. eUMY BL OE IPFYFE TBVYTBFSHUS Në Assembler, NPTSEFE RTPUFP CHSFSH NPK ZPFPCHSCHK BZTHYUYL TH TH startup.asm YNEOSFSH HTSE FPMSHLP UPDETTSYNPE Error playing CD, RPULPMSHLH CHEUSH LPD JP FPZP OE DYLFHEF TSЈUFLP LBLYE-MYVP RBTBNEFTSCH SDTB (LTPNE Ms Ne LPFPTPK NShch BZTHTSBENUS) J RPCHPMSEF RPUFFSFSH në UFP HZPDOP UFP.

pcpngfybgys ohptly ymy makefile

chist npzmy bbnefifsh, sufp chthhpmslp lpnbod dpufbfpue hfpnifemshop. L fpnh tsa oe chutub euefsh opepvipdinpuffs retelpnrymightpchbfs chu zhbkmshch. Ottinet, startup eumy.asm oe vshn ynoјo, npcop oe chschbfsh fazm. Uzreybmshop dms horthpeaois lprymgy rtympseyk lsbb rtydhnbob hfymif bërë, lpfpts chipdif h ufbodbtfuha rpufbch gcc mingw.

mAVPK MAKEFILE UFPIF YE obbchpt rtbchem në fbppk ufthlfhtpk:

Enshemimyzhbkmbmb: sintsretchpi... lpnbodshlpnrymgy

rtchp rtbchypamp, lpfpp dfmcop vsfsh mavpn makefile - gemsh të gjithë. Bëni unppfff rreth lpnrymythef yia, b babfen mikpritës lfbodshchy yfp gemy. Dms lbcdpk dthzpk gemy wabubmb upvtitbafus elbchineyunpuffy. Rty lfpn eins gemy eins obbchienpufufek npzhf upkrybdbfsh në Ynubny TEBS Numrat ZBBKMPC. H fblpn umkhyuba ratellptlb gemy rtpypkdј fpmslp eumy yuipdoyl vushchy yunoshet.

eE PDB GEMSH, LPFPTBS YUBUFP YURPMSHEFUS H Makefile - pastër. Eј lbdbyub HDBMIFSH CHUE Lyobont Orari Zbkmishch, Ifpvch Obuubfsh UPTLH "Yuyufpzp Miufb". CHPF FBL NPCSF ChractMsdefs Makefile DMS SDTB:

Të gjitha: startup.o main.o script.ld ld --oformat \u003d binary -Melf_i386 -T script.ld -o kernel.bin startup.o main.o startup.o: startup.i386.asm startup.i386.asm Startup.o main.o: main.c gcc -c -m32 -ffreesanding -o main.o main.c Clean: rm -v * .o kernel.bin

lFPF Feeluf Opvipdinp upitboy h h zbkm në Jneoen Makefile (Vej Ttubyteois) H lbfbmz në Yuipdobne Phelevfby Sdtb. Feretsh dpufbfopa chrchrmofsh lpnbodh bëjnë bey rbtbneff, obihydsushch h bppn lbfbmza y nwby rpmhyun zbkm kernel.bin (myvp upveeeyays pvivlbi, emuy sufp-fp rpymp oe FBL).

b chpf fbl me protestba obbzthüil:

Të gjithë: boot.bios.bin boot.bios.bin: boot.bios.asm fazm boot.bios.asm boot.bios.bin pastër: rm -v boot.bios.bin

Th make_listfs:

Të gjitha: përpiloni përpilimin: make_listfs.c gcc -o make_listfs make_listfs.c pastër: rm -f make_listfs make_listfs.exe

oh, clouded tpuulbts rtp chishpch dhzi makefile ya pdopp. Me dpufbpeupue maakhach, yufpvisch dbca obipdyfsh h lbfbmpzy në lbzdshchn lpnrpeofpn uyufenc, rpppnkh updtbm 1 Makefile, lpfptsck upetback Utbi Chuu uyufenh. X Neos EUFSH RBRLB SRC, H rplbfambwy OEK: boot, kernel, make_listfs. h ubnpk src oprydymifus chpf fbppk Makefile:

Të gjitha: Make -C Boot / Make -C Kernel / Make -C Make_listfs / Clean: Make -C boot / Clean Make-C Kernel / Clean Make-C Make_Listfs Clean

feretsh, obihydsushch H lbbobox SRC me rtpup ryhy bëjnë th rpmkhub rpmopufsh upvtbookh uyufenkh, b emuy obryubfs të bëjë të pastër, fp chu shyyyoske zbkmsk vkhdhf hdbmesk pufbchufus fmpslp yuipdoylay.

oh, h frigorifer nga rpumedyak ultyrf, lpftschk chrcpppepf rpmokha lprymgyy yvptlh selech lpnrpeofthph pvtbb dyulb. h pdopn lbfbox në ohin obdp tbneufyfs src, rhufpk lbfbms bin lbfbmz disk në zhbcmp boot.cfg.

#! / Bin / sh make -c src cp src / boot / boot.bios.bin bin / cp src / kernel / kernel.bin bin / cp src / make_listfs / Make_listfs bin / dd nëse \u003d bin / boot.bios.bin e \u003d bin / boot_sctor.bin bs \u003d 512 count \u003d 1 dd nëse \u003d bin / boot.bios.bin e \u003d disk / boot.bin bs \u003d 1 skip \u003d 512 Cp bin / kernel.bin disk / kernel.bin bin / make_listfs E \u003d disk.img bs \u003d 512 madhësi \u003d 2880 boot \u003d bin / boot_sctor.bin src \u003d. / Disk lexuar -P "Shtypni Enter për të vazhduar ..."

në flendine cloudpnch ultyrfpch, ovptlb uyufenb ufbopchyfus rtlemshop rtlufpk, pupweopop eumy hyufsh, yufp rpumedyak ultyrf npcop obrchulbfsh dchccochn lmilpn yubkmppzp neocetzet. Tbmiose lpnboch cctpe dd, cp, rm oe uheuufchaf rpd windows, rpppnh etpppnh e al rpmshpchbfemsn rtizpdymfus rblef msysf msys ymy cygwin. Pdlp rtpuufbs jektlb seech lpnrpeofpch vkdef tbvpffbfs dbce emuy x cbu eufsh fpmshlp gcc fazm (make_listfs meslp ulpnryimjthefs ybrrhuffus h chede windows-rtympseois).

rtyneyabue dms rpmshpchbfek pu dritaret

ld dms windows oe kompleks rpmopgoboshk - në oe rapdabychychbf chhpt utbe se si wyobtoschk zbcm, fpmslp h exe. Yurtbchichyfs lfp npcop exe (ld oe pvtbfyf khonbyye, yufp weykt bdteub welgyk outphnspstspect dmse chistocheski viotogtonalpch), b rpfpn chsfbefsh pffhdb yuyufeshte karter në rpnpesh objcopy. Emum chist ufpmlosfuesh hung, yufp ld pfbchchbefus zbrazurbfs zbbkm kernel.bin, chpurpmshkfueshkfues chpf flbln Makefile DMS Sdtb:

Të gjitha: startup.o main.o script.d ld -melf_i386 -t script.d -o kernel.bin startup.o main.o objcopy kernel.o -o binar startup.o: startup.i386.masm startup.i386 .MASM STARTUP.O main.o: main.c gcc -c -m32 -freestending -o main.o main.c Clean: rm -v * .o kernel.bin

output_format output_format ("binar") hveft_format ("binar"). Feretsh RPD Windows RPMHYUFUS UPVTBFS SDTP UYUFENC.

ббмтхльб uyufenis Rreth Mabmshopk nBoe

rPUME FBYSY HURIIPCH X oelpfptches npsef cpjoylohfshfs Cembera prtpvpchbfsh orchkh pu në tebmshopn cemey. LFP oe rtedofbchmsef rtpvman. Në dritaret RPNSHA HXD H të Windows PFLPKFF Dyulef Yyy Zhemelch, Chistbch ChBTIBOB "PFTTHFS DYULE". Rty pflstrshfyy jmeyly chbcop pfltschfsh ynoop ubnh Zhmylh, b oe eј tbidem. H dthzpk chlumbdy pfltpkfa disk.img, kisha ezp ulprthkfa ulprthkfa ulprthkfu në dyule uzp ubnpzp obubm. Rppmp npcop opcbfsh "upitbofs" y dpcdbfshus prppubyus obbryuy. chuu Kabineti për Zheryle Yyy Dyulef rty oifpn vkhdhf hoyyufpzezoszosch, b dms fpzp, üfpvshch ejurpmshpchbfs uopbb rp vombuyuoya, eј rtydјfus bopchpshpsh!

rpmshpchbfemy linux npzhf rpufhrifsh rtpee - khshchpmoft uzreybmsho lfbodh h fetseobme. DMS Dyulefshch:

Dd nëse \u003d disk.img of \u003d / dev / fd0

dMS Zameyli:

Dd nëse \u003d disk.img of \u003d / dev / sdx

cNEUFP SDX RPPDFBCHFSHFSEE EINS HUFTPUKUFCHB (SDA, SDB, SDC, SDD F. D.). Zambçopë rty lfpn oe reteriffsh y oe obbryubfsh pvtb rreth uyufenoshk dyuly, hoyyufptsych chu dekoratë. Tbhenefus, ppbodshch dpmcpspsfshus pf jneo rrënjë ymy në rpnpesh sudo.

rfpp pvpp shovelpsh h bios ibbzthhlh në dyulefshch yyj zhemelyy (ufbtshche bios oe rapdabychbaf temyli) th obemsdbfsus fëmijën "Hello World".

kabllmayuoyee

oh, CPF ceppingochochocho chuk për uzepdos. Nwby lzheh-fp kabpuyimy rtppztbnntpchbei në assesbler (ipfs h në chu tbchop rtydјfus jozdb dmbfs boulennostzmetosti chufbchli dms tbvpffsh u pvpthdpchoden) yeet reeration në chischolph exted chthrch. EE PUGEOS NOPZP RTDUFPIP UDombfsh. Hm NPTSEFE HTSE RTPCHPDYFSH TBMYYUOSCHE LURETYNEOFSCH, YNEOSS NPK Error playing CD, FPMSHLP HYUFYFE, YUFP MAVBS PYYVLB (L DPUFHR OEURTPEGYTPCHBOOPK RBNSFY, DEMEOYE ON OPMSH) RTYCHEDЈF A RETEBZTHLE YMY BCHYUBOYA UYUFENSCH (NShch RPLB PVTBVBFSCHCHBEN YULMAYUEOYS OE, OE RPFPNH RTPGEUUPT NPTSEF RTPDPMTSYFSH TBVPFH RPUME PYYVLY ). PD Chufteyuy!

mawshchka chprtpubshish npcsfa npk bdttu: [Email i mbrojtur] . Ju db, beacucubu ubnpe ctaves dms tbmyyukhyayayayayayakh rp rtedpook.

Shkurtesa "NT" marketing është deshifruar si "teknologji të reja", por në dokumentacionin e projektit, kjo do të thotë krejtësisht ndryshe. Fakti është se Windows NT u zhvillua për një të re, ende jo të lëshuar në vitin 1988, procesori Intel i860. Emri i kodit ishte "N10" ( N T.en).

Versioni i parë - Windows NT 3.1, doli në 5 vjet, në vitin 1993. Në këtë pikë në ekip kishte tashmë 250 zhvillues.

Windows sot

  • 1 miliard përdorues
  • 140 milionë rreshta kodesh (duke përfshirë kodin dhe mjetet e testimit)
    Kodi i Windows është shumë i ndryshëm. Disa pjesë janë shkruar 20 vjet më parë, disa u shfaqën vetëm në versionin aktual. Për shembull, shërbimet e internetit për pajisjet (WSD) në Windows Vista ekziston në versionin e saj të parë, kodi i GDI është në fazën përfundimtare të zhvillimit të saj dhe pothuajse nuk ndryshon, kodi DirectX tashmë është i zhvilluar mirë, por po ndryshon në mënyrë aktive dhe aktualisht.
  • 8000 zhvillues
  • 36 gjuhët e lokalizimit
  • 20 vjet të zhvillimit

Zhvillimi i Windows

20-30 vjet më parë, vetëm një metodologji e programimit "Waterfall" është përdorur. Është një sekuencë:

Specifikimet → Design → Zbatimi → Testimi → Furnizim.

Por kjo metodologji funksionon vetëm për projekte të vogla. Për një produkt të tillë, si Windows sot, nevojiten metodologji të tjera:

  • Modeli i ciklit të produktit
  • Procesi i softuerit të ekipit.
  • "Programim ekstrem"

Të gjitha këto metodologji kanë avantazhe dhe disavantazhe. Në varësi të madhësisë së ekipit dhe fazës së zhvillimit të komponentëve, grupet e ndryshme të zhvillimit të dritareve aplikojnë metodologji të ndryshme të zhvillimit.
Për Windows, si një produkt në tërësi, përdoret një model i ciklit të produktit:

  • Periudhat për 3-4 muaj
  • Brenda periudhës - "ujëvarë"

Problemi më i rëndësishëm në zhvillimin e një produkti të kësaj shkalle është se zhvillimi kërkon kohë. Në fazën fillestare, ato probleme që ekzistojnë në kohën e tanishme dhe mjetet ekzistuese janë zgjidhur. Por e vetmja gjë që është konstante është se gjithçka do të ndryshojë. Gjatë viteve të zhvillimit:

  • Kërkesat ndryshojnë
  • Mundësitë do të ndryshojnë
  • Orari i punës do të ndryshojë
  • Projekti do të ndryshojë
  • Përdoruesit do të ndryshojnë

Përkundër faktit se ekipet e ndryshme po zhvillohen ndryshe, ka rregulla "universale":

  • Lirimi i versioneve të ndërmjetme (momentet, beta, CTP) për testuesit e masave të gjera
  • Lirimi i kuvendeve të brendshme me cikle të shkurtra (1 ditë)
  • Thjeshtësia dhe besueshmëria e dizajnit
  • Kodet e tepërta personale dhe të komandës
  • Testet e njësisë
  • Testet e verifikimit (Ndërtimi i testeve të verifikimit)
  • Çdo asamble e ndërmjetme duhet të jetë me cilësi të lartë (ajo që është shkruar duhet të funksionojë)

Nga unë do të theksoj se për muajin e punës me Windows 7 të ndërtuar 6801 si OS kryesore në kompjuterin në shtëpi, unë kam formuar një përshtypje pozitive të kësaj Asambleje.

E gjithë procesi i zhvillimit të Windows është ndërtuar rreth asamblesë së përditshme:

  • Ky është një impuls i produktit
  • Zhvillimi kurrë nuk ndalet
  • Testimi i përditshëm automatik
  • Integrimi në një fazë të hershme
  • Përgjegjësia e zhvilluesve
  • Gjendja e dukshme e produktit

Një herë më parë kishte vetëm një degë të kodit burimor, dhe të gjithë zhvilluesit bënë ndryshime direkt tek ajo. Tani ekipi i zhvillimit është aq i madh sa nuk funksionon. Shumë degë janë të mbështetura, ndër të cilat ka kryesore - Winmain. Çdo laborator ka degën e vet të zhvillimit lokal në të cilin ndryshimet janë të integruara. Ndryshimet e verifikuara në kohë janë të integruara në Winmain.

Cikli i përditshëm i zhvillimit:

  • 15:00 - A lejohet të integroj ndryshimet në sistemin e kontrollit të kodit burimor
  • Ndërtoni 6 versione (falas / kontrolluar - x86, x64, IA64)
  • 18:00 - Versione të reja janë në dispozicion për testim
  • Versioni i ri është vendosur në disa mijëra workstations dhe servera testimi
  • Testi i automatizuar i stresit
  • 05:00 - Protokollet e testimit janë analizuar, mosfunksionimet janë diagnostikuar
  • 09:00 - Raportet përmbledhëse dërgohen automatikisht në komandat.
  • 09:30 - Takimi përmbledhës i drejtuesve të ekipit për të përcaktuar qëllimet

Të gjithë pjesëmarrësit e projektit, duke përfshirë menaxherët më të rangut të lartë, përdorin versione të ndërmjetme mbi punëtorët e tyre (dhe zakonisht në familje) kompjutera.

Çfarë është shkruar Windows?

  • C, C + +, C #, Assembler (X86, X64, IA64)
    Assemblers përdoren në një sasi mjaft të kufizuar në ato situata kur nuk mund të bëjë pa të
  • Visual Studio, Insight Burimi, Ndërtimi, Nmake
  • Depot burimore - Sistemi i sistemit të kontrollit
  • Windbg, KD, NTSD - Debuggers

Shumë instrumente të brendshme të tilla si ndërtimi mund të shkarkohen nga Microsoft.com/whdc/devtools.

Windows 7 ndryshimet kernel

Kerneli i Windows 7 ka pësuar ndryshimet e mëposhtme:

  • Refactoring
    Pse nuk e hiqni nënsistemin e grafikut në Windows?
    Përgjigja për këtë pyetje nga pikëpamja teknike është se nënsistemi grafik në Windows nuk është i pavarur, kjo është pjesë e nënsistemit Win32.
    Në Windows 7, ka pasur një refactoring të shumë komponentëve të nivelit të ulët në mënyrë që të thyejnë varësinë. Kjo nuk do të jetë e dukshme për përdoruesit, vetëm DLL-të e reja do të shfaqen, për shembull, kernel32.dll ndarë në kernel32.dll dhe kernelbase.dll.
    Kjo ndarje dha mundësinë për të nxjerrë në pah kernelin minimal të quajtur Minwin (20 megabajt në disk).
  • Mbështetje EFI për x86 dhe x64 (si në Vista SP1)
    Shumë prodhues po përpiqen të heqin qafe BIOS në favor të EFI.
  • Shkarko nga VHD (Virtual Hard Disk)
  • Inicializimi i pajisjes paralele dhe shërbimi i fillimit
    Kur booting Windows, ajo kërkon një kohë të gjatë për të ndërtuar një pajisje të pajisjeve. Menaxheri i PNP duhet të marrë në pyetje shoferët e gomave (PCI, USB, firewire etj.) Për cilat pajisje janë mbi to. Dhe pjesa më e madhe e kohës procesori po pret derisa pajisjet të përgjigjen (ose jo). Në fund të fundit, në mënyrë që të përcaktoni pajisjet në gomën që ju nevojitet për të anketuar ato. Nëse ata janë, ata do të përgjigjen, por nëse jo, ju duhet të prisni, dhe procesori është i papunë. Ekzekutimi paralel i këtyre detyrave zvogëlon kohën e shkarkimit.
  • Fshini bllokimin e dispeçerëve nga scheduler dhe lock pfn nga menaxheri i kujtesës
    Vitet e fundit, frekuencat e orës së procesorit nuk rriten, dhe zhvillimi shkon në rritjen e numrit të udhëzimeve paralele në udhëzimet paralele si në nivelin e një bërthama dhe në nivelin e sistemit (shumëvjeçar). Në këtë drejtim, shumë punë u krye për të përmirësuar shkallëzimin.
    Dy nga më të nxehta "Loca, të cilat ishin në thelb, ky bllokues dispeçer dhe bllokohet pfn u hoqën.
    Lock dispeçer u përdor nga planifikuesi kur ndryshon gjendjen e rrjedhave. Ky Lok u hoq, dhe gjendja e lumit "pritja" u nda në disa:
    • Duke pritur: në proces
    • Duke pritur: përfunduar
    • Duke pritur: anuluar
    Bllokimi PFN u përdor kur ndryshon atributet e faqeve të kujtesës fizike. Në sistemin multiprocesor, secili procesor kërkoi qasje në këtë vend, i cili çoi në kohën e duhur.
  • Mbështet 256 përpunues logjik
    Më parë në Windows, një fjalë e makinës është përdorur si maskë afiniteti. Kjo është bërë për shkak të faktit se ishte e lehtë për të gjetur procesorë të lirë - çdo bit është një procesor. Prandaj, 32 përpunues logjikë u mbajtën në sistemin 32-bit, dhe në 64-bit 64.
    Në Windows 7, si rezultat i kalimit në modelin e segmentit të maskës së afinitetit, ishte e mundur të mbështeste 256 përpunues logjik. Procesorët filluan të grupohen në grupe / segmente. Secili grup mund të jetë deri në 64 përpunues. Si rezultat, është marrë kompatibiliteti i kundërt, programet e vjetra "shohin" vetëm procesorë në një grup dhe programe të reja që përdorin interfaces të reja punojnë me të gjithë përpunuesit në sistem.
  • Ruajtja e përmirësuar e energjisë: Çaktivizimi i bazave të procesorit sot është një problem serioz i kursimit të energjisë jo vetëm para pronarëve të laptopëve, por edhe nga pronarët e qendrës së të dhënave. Në SHBA, 2% e energjisë elektrike konsumohet nga qendrat e të dhënave kompjuterike. Shumë prej tyre janë të fikur nga një pjesë e serverëve të tyre në aktivitetin më të ulët të përdoruesit (fundjavë).
    U zbulua se është shumë më e dobishme për të fikur të gjithë prizën e procesorit se një kernel në disa, sepse Në këtë rast, ju mund të çaktivizoni të gjithë infrastrukturën e mbështetjes së socket (kontrollues kujtese).

Mbështetja e dritareve, përditësimet

Më parë, përditësimet ishin shpesh kumulative (akumuluar). Kjo do të thoshte se nëse kodi i gabuar ishte i përmbajtur në azhurnimin e komponentit të hershëm, atëherë versionet e mëvonshme do të përmbajnë këtë kod. Por jo të gjithë përdoruesit kanë nevojë për të gjitha përditësimet, ata kanë një konfigurim të ndryshëm.

Tani pas lirimit (RTM) në Windows, ka 2 versione të kodit burimor:

  • RTM GDR (RealEase për Shpërndarjen e Përgjithshme)
    Përfshin ato pak ndryshime që janë të destinuara për të gjithë. Në thelb sigurinë e saktë.
  • RTM LDR (lirimi i kufizuar i shpërndarjes)
    Gjatë instalimit të përditësimit, klienti i përditësimit të Windows përzgjedh degën që ju nevojitet dhe vendosni kodin nga ai.

Krijimi i përditësimit të sigurisë

Puna për krijimin e përditësimit të sigurisë fillon me zbulimin e cenueshmërisë. Ka shumë metoda të ndryshme të zbulimit - ekipet e brendshme të sigurisë, partnerët e sigurisë, zhvilluesit. Kur të zbulohet dobësia, fillon 2 proces paralel:

  • Zhvillimi për të gjitha platformat
  • Kërko për "opsione"
    Një kërkim në shkallë të gjerë për dobësi të ngjashme në të gjitha platformat. Kërko jo kodin e njëjtë, por të ngjashme.

Pas fiksimit të korrigjimit, kontrollet e kodit të saj. Kur ata janë të përfunduar, rregullimi është i integruar në Kuvend, dhe Kuvendi vazhdon testimin:

  • Komponenti i testimit manual dhe automatik
  • Testimi automatik i shtrembërimeve të formateve të skedarëve, komponentëve të rrjetit etj. (më shumë se një milion opsione)
  • Testimi i sistemit në tërësi, duke përfshirë testimin e pajtueshmërisë së prapambetur

Vetëm korrigjimet që plotësojnë të gjitha kriteret e cilësisë lejohen të lëshojnë në Windows Update dhe Download Center.

  • Përpara

Autor Gamer Vulf. Pyetje në seksion Gjuhё dhe Teknologjitë e tjera

Si të krijoni OS tuaj? Dhe mori përgjigjen më të mirë

Përgjigje nga Alexander Bagrov [Guru]
Ideja është e lavdërueshme.
Para së gjithash, ju duhet të dini sistemin e komandave të makinës për të cilat keni ndërmend të shkruani OS.
Sistemi i sistemit gjen reflektimin e tij të drejtpërdrejtë në gjuhën e assembler.
Prandaj, para së gjithash ju duhet të dalni me gjuhën tuaj të asamblesë dhe të shkruani një program për të (assesfler), duke transmetuar simbolizmin alfanumerik në makinë
kodi.
Nëse interesante, ju mund të shihni se çfarë lloj kërkese duhet të ketë një OS të ri (të përsosur).
Disa karakteristika të tilla janë renditur këtu:
.ru / d_os / os-poolym.html # idealos
Është e nevojshme për të studiuar materialet e zhvilluesve të faqes së mikroprocesorit. Për shembull, Intel dhe AMD.
Ju mund të jeni të dobishëm për ju një kurs video të leksioneve në OS, e cila është paraqitur këtu:
.ru / d_os / os_general.html
PS: Mos dëgjoni pesimistët. Vazhdoni nga ideologjia e një gjeli, duke ndjekur një pulë:
"Mos e kapni, të paktën të ngrohtë".
Burimi: Site "Përdor PC saktë!"

Përgjigje nga 2 përgjigje[guru]

Hej! Këtu është një përzgjedhje e temave me përgjigje në pyetjen tuaj: Si të krijoni OS tuaj?

Përgjigje nga Vadim Hprlamov[Newcomer]
Natyrisht), ka disa porta të ulur) në Microsoft Pyet)



Përgjigje nga Irina Starodubseva[Newcomer]
merrni të gjitha OS dhe në një vrimë


Përgjigje nga Alexander Tuntsov[guru]
Shikoni Linux OS, mëson programimin dhe në rrugë


Përgjigje nga ~ Në flakë ~[guru]
Programimi për të mësuar në nivelin më të lartë, të mbledhë një turmë të tërë të të njëjtit geniuses kompjuter dhe pastaj ju tashmë mund të bëni.


Përgjigje nga Rasul Magomedov.[guru]
Filloni me krijimin e letër-muri të keq


Përgjigje nga Kapiten Google[guru]
Rreth "10 vjet për të eksploruar bazat" - Mos dëgjoni, Torvalds shkroi versionin e parë të Linux në 22, dhe kompjuteri i tij u shfaq në 12. Ndërsa e kuptoni, ai jo vetëm që studioi bazat.
Filloni me studimin e një ekzistuese - nga njëra anë, "sistemet operative moderne" të Tannenbaumës, nga ana tjetër, sjellin Linux nga e para, me të tretën - Mësoni Assembler, C, C + +. Për gjithçka për gjithçka - mund të takoni në 3-4 vjet. Pas kësaj, mund të filloni të zhvilloni sistemin tuaj ... nëse doni ende.


Përgjigje nga Yuan Semenov[guru]
a e dini se si bënë Gates? Provoni të njëjtën gjë, ata thonë se do të ndodhë me fitim ..
Kur prindërit e tij ndëshkoheshin, ai nga asgjë për të bërë filluan të hidhen në shpellë, pastaj shitet për të thirrur atë që ndodhi "Windows"
P me dhe nëse vërtet shkruani në fillim "Hello World" në C + + dhe menjëherë kuptoni se ideja është paranojake


Përgjigje nga Kostafey.[guru]
Per cfare? Çfarë nuk i përshtaten thelbësisht ekzistues? A ka ndonjë, të paktën pjesërisht duke përmbushur kërkesat tuaja për OS? Ndoshta ia vlen të takohet më mirë për t'u bashkuar me ekipin e zhvilluesve? Do të jetë 100500 herë një ndjenjë.
Dhe pastaj, ju e braktisni këtë ide me një tjetër 0, (0) 1% të zbatimit të tij.


Përgjigje nga Evgeny lita[guru]
E. Tannbaum "Sistemet operative: Zhvillimi dhe shitjet"
paç fat
PS për fat të keq, si bëri Bill Gates, ju nuk keni gjasa të keni sukses. Nëna e tij është një bankier i ftohtë, ju keni?


Përgjigje nga Krab Bark.[guru]
Ju mund të shkruani OS më të thjeshtë, por nuk do të jetë në gjendje të konkurrojë me OS si Windows, Mac OS ose Linux, mbi të cilat qindra ose mijëra programues punuan të paktën dhjetëra vjet. Përveç kësaj, OS është vetëm themeli. Është e nevojshme që zhvilluesit e pajisjeve të shkruan shoferët e tyre për këtë OS, zhvilluesit e programeve të aplikimit shkruan redaktorë, lojtarë, shfletues, lojëra, karakteristika në një hap ... dhe pa këtë OS do të mbetet dikush që nuk ka nevojë për themelin për shtëpinë, të cilën askush nuk do të ndërtojë.


Përgjigje nga Vadim Stakhanov[aktiv]
Do të ishte më mirë nëse filologu do të kishte mësuar. Dhe pastaj unë do të bërtas "Pa pagesë Cashier!"


Përgjigje nga \u003d Serge \u003d.[guru]
Hurra! Së fundi, 58 pyetje në vend për krijimin e "OS-it tuaj))
Këtu janë pyetje në lidhje me "Shkruani OS tuaj" - e vetmja 34 e tyre))
Lexoni .... 92 Pyetjet * 10 Përgjigje \u003d Përafërsisht 920 Përgjigje))
Në të njëjtën kohë, është e mundur të kuptojmë se çfarë do të thotë "dështim")).


Përgjigje nga Irreproducible.[guru]
një tjetër Denis Popov me Bolgenos tjetër "Ohm?


Përgjigje nga Ivan tatarchuk[Newcomer]
lauce Notepad shkarko Zhabaspte Compiler dhe të fillojnë të kërcejnë boo në tastierë
pas 60 minutash përpiloni dhe të gjitha
oska juaj është gati


Përgjigje nga Dele mila[Newcomer]
OS? E cila saktësisht? OS-Borizhinal Chester (karakter origjinal (përkthyer))
Ajo ka nevojë për një imazh të afërt të karikaturave ose filmave.
1. Shpikni çfarë karikaturë / film të veçantë që dëshironi OS
2. Konsideroni stilin e karikaturës / filmave
3. Kush do të jetë karakteri juaj (zanash, kalë i vogël, magjistar, robot, etj)
4. Përshkruani atë mentalisht, pastaj në letër
5. Gjeni dizajnin
6. Shpikni emrin dhe bio
7. Vizatoni një karakter!
8. Tani për biznes me bojë Tud Sai