Si të konfiguroni telefonat inteligjentë dhe PC. Portali informativ

Krijimi i një sistemi operativ të bazuar në kernel linux. Nga e para

Kjo seri artikujsh i kushtohet programimit të nivelit të ulët, domethënë arkitekturës kompjuterike, dizajnit të sistemit operativ, programimit të gjuhës së asamblesë dhe fushave të ngjashme. Deri më tani, dy habrausers janë të angazhuar në shkrim - dhe. Për shumë nxënës të shkollave të mesme, studentë dhe programues profesionistë, këto tema rezultojnë të jenë shumë të vështira për t'u mësuar. Ka shumë literaturë dhe kurse që i kushtohen programimit të nivelit të ulët, por është e vështirë të merret një pasqyrë e plotë dhe gjithëpërfshirëse prej tyre. Është e vështirë, pasi të keni lexuar një ose dy libra mbi sistemet e montimit dhe operimit, të imagjinoni të paktën në terma të përgjithshëm se si funksionon në të vërtetë ky sistem kompleks prej hekuri, silikoni dhe shumë programesh - një kompjuter.

Secili e zgjidh problemin e të mësuarit në mënyrën e vet. Dikush lexon shumë literaturë, dikush përpiqet të kalojë shpejt në praktikë dhe të kuptojë gjatë rrugës, dikush përpiqet t'u shpjegojë miqve gjithçka që po studion. Dhe ne vendosëm t'i kombinojmë këto qasje. Pra, në këtë kurs artikujsh, ne do të demonstrojmë hap pas hapi se si të shkruajmë një sistem operativ të thjeshtë. Artikujt do të jenë të një natyre të përgjithshme, domethënë nuk do të përmbajnë informacione shteruese teorike, megjithatë, ne gjithmonë do të përpiqemi të ofrojmë lidhje me materiale të mira teorike dhe t'u përgjigjemi të gjitha pyetjeve që lindin. Ne nuk kemi një plan të qartë, kështu që shumë vendime të rëndësishme do të merren gjatë rrugës, duke marrë parasysh komentet tuaja.

Ne mund ta çojmë qëllimisht procesin e zhvillimit në një rrugë pa krye për t'ju lejuar juve dhe vetes që të kuptojmë plotësisht pasojat e një vendimi të gabuar, si dhe të përmirësojmë disa aftësi teknike mbi të. Pra, mos i merrni vendimet tona si të vetmet të vërteta dhe na besoni verbërisht. Theksojmë edhe një herë se presim që lexuesit të jenë aktivë në diskutimin e artikujve, gjë që duhet të ndikojë shumë në procesin e përgjithshëm të zhvillimit dhe shkrimit të artikujve pasues. Në mënyrë ideale, do të dëshiroja që disa nga lexuesit t'i bashkohen zhvillimit të sistemit me kalimin e kohës.

Do të supozojmë se lexuesi tashmë është i njohur me bazat e asamblesë dhe gjuhëve C, si dhe me konceptet elementare të arkitekturës kompjuterike. Kjo do të thotë, ne nuk do të shpjegojmë se çfarë është një regjistër ose, të themi, RAM. Nëse ju mungojnë njohuritë, gjithmonë mund t'i drejtoheni literaturës shtesë. Një listë e shkurtër e referencave dhe lidhjeve për faqet me artikuj të mirë janë në fund të artikullit. Është gjithashtu e dëshirueshme që të jeni në gjendje të përdorni Linux, pasi të gjitha udhëzimet e përpilimit do të jepen për këtë sistem.

Dhe tani - më afër pikës. Në pjesën tjetër të artikullit, unë dhe ju do të shkruajmë programin klasik "Hello World". Bota jonë e Halloween do të jetë paksa specifike. Nuk do të funksionojë nga ndonjë sistem operativ, por drejtpërdrejt, si të thuash "në metal të zhveshur". Para se të vazhdojmë drejtpërdrejt me shkrimin e kodit, le të kuptojmë se si saktësisht po përpiqemi ta bëjmë këtë. Dhe për këtë ju duhet të merrni parasysh procesin e nisjes së kompjuterit.

Pra, merrni kompjuterin tuaj të preferuar dhe shtypni butonin më të madh në njësinë e sistemit. Ne shohim një mbrojtës të gëzuar të ekranit, njësia e sistemit kërcëllon me gëzim me një altoparlant dhe pas një kohe sistemi operativ ngarkohet. Siç e kuptoni, sistemi operativ ruhet në hard disk, dhe këtu lind pyetja: si sistemi operativ nisi në mënyrë magjike në RAM dhe filloi të ekzekutohej?

Dijeni këtë: sistemi që është në çdo kompjuter është përgjegjës për këtë, dhe emri i tij është jo, jo Windows, pip gjuhën tuaj - quhet BIOS. Emri i tij qëndron për Sistemin Bazë Input-Output, që është, sistemi bazë input-output. BIOS ndodhet në një mikrocircuit të vogël në motherboard dhe fillon menjëherë pasi të keni shtypur butonin e madh ON. BIOS ka tre detyra kryesore:

  1. Zbuloni të gjitha pajisjet e lidhura (procesorin, tastierën, monitorin, RAM-in, kartën video, kokën, krahët, krahët, këmbët dhe bishtat...) dhe testoni ato për funksionalitet. Programi POST (Power On Self Test) është përgjegjës për këtë. Nëse nuk gjendet një pajisje jetike, atëherë asnjë softuer nuk mund të ndihmojë dhe në këtë pikë altoparlanti i sistemit do të kërcëjë diçka ogurzezë dhe OS nuk do të arrijë fare. Le të mos flasim për gjëra të trishtueshme, le të supozojmë se kemi një kompjuter plotësisht që funksionon, gëzohemi dhe kalojmë në shqyrtimin e funksionit të dytë BIOS:
  2. Sigurimi i sistemit operativ me një grup funksionesh bazë për të punuar me hekur. Për shembull, përmes funksioneve të BIOS-it, mund të shfaqni tekst në ekran ose të lexoni të dhëna nga tastiera. Prandaj quhet sistemi bazë input-output. Në mënyrë tipike, sistemi operativ i qaset këtyre funksioneve përmes ndërprerjeve.
  3. Nisja e ngarkuesit të sistemit operativ. Në këtë rast, si rregull, lexohet sektori i nisjes - sektori i parë i bartësit të informacionit (disketa, hard disk, CD, flash drive). Rendi i votimit në media mund të caktohet në BIOS SETUP. Sektori i nisjes përmban një program që ndonjëherë quhet ngarkuesi primar. Përafërsisht, detyra e bootloader është të fillojë sistemin operativ. Procesi i ngarkimit të një sistemi operativ mund të jetë shumë specifik dhe shumë i varur nga veçoritë e tij. Prandaj, ngarkuesi kryesor shkruhet drejtpërdrejt nga zhvilluesit e OS dhe shkruhet në sektorin e nisjes gjatë instalimit. Kur fillon ngarkuesi, procesori është në modalitetin real.
Lajmi i trishtuar: madhësia e ngarkuesit duhet të jetë vetëm 512 bajt. Pse kaq pak? Për ta bërë këtë, duhet të njihemi me pajisjen e disketës. Këtu është një foto edukative:

Fotografia tregon sipërfaqen e diskut. Një disketë ka 2 sipërfaqe. Në çdo sipërfaqe ka gjurmë (gjurmë) në formë unaze. Çdo pistë është e ndarë në pjesë të vogla në formë harku të quajtura sektorë. Pra, historikisht, një sektor i disketës ka një madhësi prej 512 bajt. Sektori i parë në disk, sektori i nisjes, lexohet nga BIOS "në segmentin zero të memories në kompensim 0x7С00, dhe më pas kontrolli transferohet në këtë adresë. Ngarkuesi i nisjes zakonisht nuk ngarkon vetë OS në memorie, por një tjetër Programi bootloader ruhet në disk, por për disa arsye (ka shumë të ngjarë, kjo arsye është madhësia) që nuk përshtatet në një sektor. Dhe duke qenë se deri më tani roli i sistemit operativ tonë luhet nga një botë banale, qëllimi ynë kryesor është të bëjeni kompjuterin të besojë në ekzistencën e sistemit tonë operativ, edhe nëse është në një sektor, dhe drejtojeni atë.

Si është rregulluar sektori i boot-it? Në një PC, kërkesa e vetme për një sektor të nisjes është që dy bajtë e tij të fundit të përmbajnë vlerat 0x55 dhe 0xAA, nënshkrimin e sektorit të nisjes. Pra, tashmë është pak a shumë e qartë se çfarë duhet të bëjmë. Le të shkruajmë kodin! Kodi i mësipërm është shkruar për montuesin yasm.

seksioni. teksti

përdorni16

org 0x7C00 ; programi ynë është i ngarkuar në 0x7C00

filloni:

mov ax , cs

mov ds, sëpatë ; zgjidhni segmentin e të dhënave



mov si , mesazh

cld ; drejtim për komandat e vargut

mov ah , 0x0E ; Numri i funksionit BIOS

mov bh , 0x00 ; faqe memorie video

puts_loop:

lodsb ; ngarkoni karakterin tjetër në al

test al , al ; karakteri null nënkupton fundin e vargut

jz vendos_loop_dalje

int 0x10 ; duke thirrur funksionin BIOS

jmp puts_loop

puts_loop_exit:

jmp$; cikli i përjetshëm



mesazh:

db "Përshëndetje Botë!" 0

përfundoni:

herë 0x1FE - përfundimi + fillimi db 0

db 0x55, 0xAA ; nënshkrimi i sektorit të nisjes

Ky program i shkurtër kërkon një sërë shpjegimesh të rëndësishme. Linja org 0x7C00 nevojitet në mënyrë që asembleri (që nënkupton programin, jo gjuhën) të llogarisë saktë adresat për etiketat dhe variablat (puts_loop, puts_loop_exit, message). Pra, ne i themi atij se programi do të ngarkohet në memorie në 0x7C00.
Në rreshta
mov ax , cs

mov ds, sëpatë
segmenti i të dhënave (ds) vendoset i barabartë me segmentin e kodit (cs), pasi në programin tonë të dhënat dhe kodi ruhen në të njëjtin segment.

Më pas mesazhi "Hello World!" shfaqet karakter pas karakteri në lak. Për këtë përdoret funksioni 0x0E i ndërprerjes 0x10. Ai ka opsionet e mëposhtme:
AH = 0x0E (numri i funksionit)
BH = numri i faqes së videos (mos u shqetësoni akoma, tregoni 0)
AL = kodi i karakterit ASCII

Në rreshtin "jmp $" programi varet. Dhe me të drejtë, nuk ka nevojë që ajo të ekzekutojë kod shtesë. Sidoqoftë, në mënyrë që kompjuteri të funksionojë përsëri, do t'ju duhet të rindizni.

Në rreshtin " herë 0x1FE-finish+start db 0", pjesa tjetër e kodit të programit (përveç dy bajtit të fundit) është e mbushur me zero. Kjo bëhet në mënyrë që pas kompilimit, nënshkrimi i sektorit të nisjes të shfaqet në dy bajtet e fundit të programit.

Ne e kuptuam disi kodin e programit, tani le të përpiqemi ta përpilojmë këtë lumturi. Për të përpiluar, ne kemi nevojë, në fakt, një asembler - sa më sipër

Së pari, mësoni të programoni. Njohuria e asamblerit është e nevojshme; Rekomandohet shumë që të kuptoni edhe gjuhë të tjera programimi të nivelit më të ulët, si C.

Vendosni se në cilën pajisje dëshironi të nisni sistemin operativ. Ky mund të jetë një CD, DVD, flash drive, hard disk ose kompjuter tjetër.

Vendosni se si dëshironi të jetë sistemi juaj operativ. A duhet të jetë një version i plotë i OS me një ndërfaqe grafike të përdoruesit (GUI) apo ndoshta diçka më minimaliste? Ju duhet të dini se në cilin drejtim të shkoni përpara se të filloni procesin.

Kontrolloni se cilën platformë procesori do të mbështesë sistemi juaj operativ. AI-32 dhe x86_64 janë dy versionet më të zakonshme për kompjuterët personalë, ndaj mund të konsiderohen si zgjidhja më e mirë.

Vendosni nëse preferoni të bëni gjithçka vetë nga e para, ose nëse ka bërthama mbi të cilat dëshironi të ndërtoni. Linux From Scratch është një projekt për ata që dëshirojnë, për shembull, të krijojnë shpërndarjen e tyre Linux.

Zgjidhni nëse dëshironi të përdorni bootloader-in tuaj ose Grand Unified Bootloader (GRUB) të para-ndërtuar. Për shkak se kodimi i programit tuaj të nisjes kërkon softuer të gjerë kompjuterik dhe njohuri të BIOS-it, kjo mund të shtyjë prapa orarin e programimit të kernelit të drejtpërdrejtë.

Vendosni gjuhën e programimit që do të përdorni. Sigurisht, është krejtësisht e mundur të zhvillohet një OS në një gjuhë të tillë si Pascal ose BASIC, por preferohet të shkruhet në C ose në gjuhën e asamblesë. Assembler është absolutisht i nevojshëm, sepse disa pjesë të rëndësishme të sistemit operativ kërkojnë njohuri të kësaj gjuhe të veçantë. C++, nga ana tjetër, përmban fjalët kyçe të nevojshme për të ekzekutuar OS të plotë.

  • Për të ndërtuar një OS duke përdorur kodin C ose C++, sigurisht që do të përdorni një përpilues pas tjetrit. Kjo do të thotë që ju duhet të lexoni manualin/udhëzimet/dokumentacionin për përpiluesin e zgjedhur C/C++ që vjen me softuerin ose është i disponueshëm nga faqja e internetit e shpërndarësit. Do t'ju duhet të mësoni shumë gjëra komplekse rreth kompajlerit, dhe për të përmirësuar C++ do t'ju duhet të mësoni skemën dhe ABI-në e tij. Ju pritet të kuptoni formatet e ndryshme të detyrave të ekzekutueshme (ELF, PE, COFF, binar i thjeshtë, etj.) dhe të vini re se formati origjinal i Windows, PE (.exe), është i mbrojtur nga e drejta e autorit.
  • Zgjidhni një ndërfaqe programimi të aplikacionit (API). Një koleksion i API-ve të mira është POSIX, pasi është i dokumentuar mirë. Të gjitha sistemet Unix kanë të paktën një mbështetje të pjesshme POSIX, kështu që do të ishte e parëndësishme të bashkëngjitni programet Unix në sistemin tuaj operativ.

    Vendosni për një dizajn. Ka bërthama monolitike dhe mikrokernele. Kernelet monolitike drejtojnë të gjitha shërbimet në kernel, ndërsa mikrokernelet kanë një kernel të vogël të kombinuar me një zbatim shërbimi të personalizuar. Në përgjithësi, bërthamat monolitike janë më të shpejta, por mikrokernelet kanë izolim dhe mbrojtje më të mirë ndaj gabimeve të mundshme.

    Merrni parasysh zhvillimin dhe punën në grup. Kështu, do t'ju duhet më pak kohë për të zgjidhur problemet e mëdha, gjë që do t'ju lejojë të krijoni një sistem operativ më të mirë në një kohë më të shkurtër.

    Mos e fshini plotësisht hard diskun tuaj. Mos harroni, formatimi i një disku do të fshijë përgjithmonë të gjitha të dhënat tuaja! Përdorni GRUB ose një menaxher tjetër për të kopjuar nisjen e kompjuterit tuaj nga një OS tjetër derisa versioni juaj të jetë plotësisht funksional.

    Filloni të vogla. Kushtojini vëmendje gjërave të vogla fillimisht, si shfaqja e tekstit dhe ndërprerjet, përpara se të kaloni te elementët kompleksë, si menaxhimi i kujtesës dhe kryerja e shumë detyrave.

    Mbani një kopje rezervë të versionit më të fundit të punës. Kjo ju jep pak qetësi në rast se diçka nuk shkon plotësisht me versionin tuaj aktual të OS ose zgjerimet e ardhshme. Në rast se kompjuteri juaj prishet dhe nuk mund të niset, siç e kuptoni vetë, është një mundësi e shkëlqyer që të keni një kopje të dytë për të punuar, në mënyrë që të zgjidhni problemet ekzistuese.

    Testoni sistemin tuaj të ri operativ në një makinë virtuale. Në vend që të rindizni kompjuterin tuaj sa herë që bëni ndryshime ose transferoni skedarë nga kompjuteri juaj i punës në makinën tuaj të testimit, mund të përdorni një aplikacion për të ekzekutuar OS në një makinë virtuale ndërsa OS juaj aktual vazhdon të funksionojë. Aplikacionet VM përfshijnë VMWare (i cili gjithashtu ka një server të disponueshëm lirisht), softuer alternativ me burim të hapur, Bochs, Microsoft Virtual PC (jo i pajtueshëm me Linux) dhe XVM VirtualBox.

    Lëshoni një version lëshimi. Kjo do t'i lejojë përdoruesit t'ju tregojnë për të metat e mundshme në sistemin tuaj operativ.

  • Sistemi operativ duhet gjithashtu të jetë i përshtatshëm për përdoruesit, ndaj mos harroni të shtoni veçori të dobishme që do të bëhen pjesë integrale e dizajnit tuaj.

    • Pasi të përfundojë zhvillimi, merrni parasysh nëse dëshironi ta bëni kodin publikisht ose të vendosni të drejta private për të.
    • Sigurohuni që t'i bëni veçoritë e sigurisë përparësinë tuaj kryesore nëse dëshironi që sistemi juaj të jetë i zbatueshëm.
    • Mos filloni një projekt zhvillimi të sistemit operativ me qëllim që të mësoni se si të programoni. Nëse nuk dini C, C++, Pascal ose ndonjë nga gjuhët dhe veçoritë e tjera përkatëse, duke përfshirë llojet e treguesve, operacionet e biteve të nivelit të ulët, ndërrimin e biteve, montuesin inline, etj., atëherë nuk jeni gati të ndërtuar ende. OS.
    • Shfletoni portalet si OSDev dhe OSDever për t'ju ndihmuar të përmirësoni sistemin tuaj operativ. Ju lutemi vini re se për shumicën e çështjeve, komuniteti OSDev.org preferon që ju të aksesoni vetë përmbajtjen e faqes në vend që të bashkoheni në forum. Nëse ende vendosni të bashkoheni në radhët e anëtarëve të forumit, duhet të ketë disa parakushte për këtë. Ju duhet të keni një njohuri të plotë të gjuhës C ose C++ dhe x86 të asamblesë. Ju gjithashtu duhet të kuptoni konceptet e përgjithshme dhe komplekse të programimit si Listat e Lidhura, Radhët, etj. Komuniteti OSDev shprehimisht në rregullat e tij se askush nuk do të kujdeset për programuesit e rinj. Nëse po përpiqeni të zhvilloni një OS, është e vetëkuptueshme që ju jeni një "zot" në programim. Ju gjithashtu duhet të lexoni manualin e procesorit për arkitekturën e zgjedhjes suaj; p.sh. x86 (Intel), ARM, MIPS, PPC, etj. Një referencë e tillë për strukturën e procesorit mund të gjendet lehtësisht duke kërkuar në Google ("Intel Manuals", "ARM manuals", etj.). Mos u regjistroni në forumin OSDev.org për të bërë pyetje të dukshme. Kjo thjesht do të çojë në përgjigje si "Lexo manualin e f***ing". Si fillim, duhet të provoni të lexoni Wikipedia, manuale për mjetet e ndryshme që do të përdorni.
    • Kontrolloni për pika të mundshme të vdekura dhe gabime të tjera. Defektet, bllokimet dhe çështje të tjera mund të ndikojnë në dizajnin e sistemit tuaj operativ.
    • Nëse dëshironi një mënyrë më të lehtë, imagjinoni shpërndarjet Linux si Fedora Revisor, Custom Nimble X, Puppy Remaster, PCLinuxOS mklivecd ose SUSE Studio dhe SUSE KIWI. Sidoqoftë, sistemi operativ që krijoni është në pronësi të kompanisë që prezantoi fillimisht shërbimin (megjithëse ju keni të drejtën ta rishpërndani lirisht, ta modifikoni dhe ta ekzekutoni si të doni sipas GPL).
    • Një zgjidhje e mirë do të ishte krijimi i një ndarjeje krejtësisht të re për sistemin operativ që po zhvillohet.

    Paralajmërimet

    • Rishkrimi i pakujdesshëm i OS në hard disk mund ta dëmtojë plotësisht atë. bej kujdes
    • Nuk do të keni një sistem plotësisht të përfunduar brenda dy javësh. Filloni me një sistem operativ bootable dhe më pas kaloni te gjëra më interesante.
    • Nëse bëni diçka të pamatur, si p.sh. të shkruani bajt të rastësishëm në porte arbitrare I/O, do të shkatërroni OS tuaj dhe mund (teorikisht) të digjni harduerin tuaj.
    • Mos prisni që të jetë e lehtë të ndërtohet një sistem operativ cilësor. Ka shumë ndërvarësi komplekse. Për shembull, në mënyrë që një OS të jetë në gjendje të trajtojë shumë procesorë, menaxheri juaj i memories duhet të ketë mekanizma "mbytës" për të parandaluar që procesorët shtesë të kenë akses 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 të ketë akses në një burim kritik në çdo kohë të caktuar, ndërsa të gjithë të tjerët janë të papunë. Sidoqoftë, funksionimi i planifikuesit varet nga prania e menaxherit të kujtesës. Ky është një shembull i një varësie nga bllokimi. Nuk ka asnjë mënyrë standarde për të zgjidhur probleme të tilla; çdo krijues i sistemit operativ pritet të jetë mjaft i aftë për të dalë me zgjidhjen e tij.

    Burimet

    Çfarë do t'ju duhet

    • Kompjuter
    • Procesori mbi të cilin do të ndërtoni
    • Memorie e mjaftueshme e aksesit të rastësishëm (RAM) për makinën virtuale
    • OS parësor (përdoret për të zhvilluar kodin burimor të asamblerit (etj.) dhe për të ndërtuar dhe paketuar herët; OS juaj do të bëhet përfundimisht primar)
    • Redaktori i kodit të ngjyrave sintaksore (përdoret kur nuk disponohet një mjedis zhvillimi i integruar)
    • Përpilues
    • Disk CD/DVD
  • Ilya Alexandrov

    Ndërtoni OS tuaj bazuar në Linux

    Ka qindra shpërndarje Linux atje dhe nuk dihet se sa të tjera do të shfaqen. Dhjetra kompani dhe mijëra programues konkurrojnë për të krijuar projektin më të mirë Linux, dhe ndërkohë çdo përdorues me përvojë mund të bëhet autori i një sistemi PC në shtëpi që nuk është inferior ndaj produkteve të gjigantëve të industrisë së IT.

    Gjatë viteve të punës me Linux, kam përdorur një numër të madh të shpërndarjeve të ndryshme: Mandriva, Fedora, SlackWare, Debian, Ubuntu dhe shumë të tjera. Disa projekte më pëlqyen më shumë, disa më pak. Por në të gjitha shpërndarjet, në mënyrë të pashmangshme duhej të përballeshim me mangësi serioze që e vështirësonin shumë punën. Njëra është shumë kërkuese për burimet, tjetra nuk mbështet të gjitha pajisjet e nevojshme, e treta i mungojnë softuerët e ndryshëm. Pikërisht atëherë m'u kujtua urtësia e njohur lindore: nëse duhet të bësh diçka mirë, bëje vetë.

    Linux nga e para

    Unë nuk jam i vetmi që vendosa të filloj të ndërtoj versionin tim të Linux - një OS në të cilin pjesa bazë e sistemit dhe kerneli do të merren si bazë, por ku nuk do të ketë asnjë kilobajt shtesë nga zhvilluesi, domethënë nga ju. Një numër i madh shpërndarjesh Linux që nuk plotësojnë kërkesat e përdoruesve e shtynë Gerard Beekmans të krijojë një komplet shpërndarës që do t'i mundësojë të gjithëve të ndërtojnë një sistem vetëm me komponentët dhe funksionet që u nevojiten.

    Dëshira e një programuesi të talentuar rezultoi në projektin Linux nga Scratch (www.linuxfromscratch.org), shkurtuar si LFS. Ky projekt ju lejon të ndërtoni nga e para, nga kodet burimore, sistemin tuaj operativ të bazuar në Linux. Përpilimi i LFS bëhet në një kompjuter me një sistem Linux të instaluar tashmë, megjithatë, një Live-CD "e avancuar", siç është Knoppix, është gjithashtu i përshtatshëm.

    Në të njëjtën kohë, sistemi Linux i përdorur për montim mund të jetë çdo - kërkohet vetëm prania e një përpiluesi dhe bibliotekave të sistemit. Linux From Scratch vështirë se mund të quhet një shpërndarje në kuptimin e zakonshëm të fjalës - është diçka si softuer ndihmës që, së bashku me pjesën bazë të sistemit operativ, do t'ju lejojë të krijoni versionin tuaj unik të OS.

    Siç e dini, Linus Torvalds zhvilloi sistemin e tij operativ nën moton "Vetëm për argëtim!" - domethënë për qejf. Duhet pranuar se LFS me të vërtetë nuk gjendet shpesh në serverë, si rregull, entuziastët e kompjuterave përdorin këtë sistem. Instalimi dhe puna me Linux nga fillimi do t'ju ndihmojë të kuptoni marrëdhënien midis komponentëve të OS, e cila është e dobishme për zhvillimin tuaj të një shpërndarjeje Linux, dhe jo vetëm bazuar në LFS. Prandaj, LFS është krijuar kryesisht për ata njerëz për të cilët procesi i ndërtimit të shpërndarjes së tyre është emocionues dhe interesant - dhe më besoni, ka shumë njerëz të tillë.

    Pra, nëse jeni gati të shpenzoni një ditë të tërë (ose edhe më shumë) për dizajnimin e sistemit, atëherë unë rekomandoj shkarkimin nga faqja (2) LFS-packages-6.0, LFS-book dhe të vazhdoni të lexoni këtë artikull.

    Ndarja e një disku dhe krijimi i një peme direktorie

    Për një kuptim më të mirë të materialit, ne përshkruajmë të gjithë rrjedhën e procesit në terma të përgjithshëm (shih Fig. 1).

    Në fazën e parë, duke përdorur një komplet shpërndarjeje të instaluar tashmë ose LiveCD, disku është i prishur. Një ndarje është ndarë në hard disk për sistemin e ri. Pas kësaj, në këtë ndarje, do t'ju duhet të përpiloni në mënyrë statike të gjitha programet e nevojshme dhe kernelin e sistemit. Më pas, direktoria rrënjësore ndryshohet në një ndarje të diskut të ngurtë të caktuar për OS-në tonë të re. Do t'ju duhet të përsërisni përpilimin, por këtë herë softueri duhet të ndërtohet në mënyrë dinamike (ndryshimi midis përpilimit dinamik dhe statik do të përshkruhet më poshtë). Hapi i fundit përfshin ndërtimin e bibliotekës kritike të glibc dhe konfigurimin e sistemit operativ të instaluar. Siç mund ta shihni, nuk keni nevojë të bëni ndonjë gjë veçanërisht të vështirë.

    Gjatë gjithë procesit, asistenti juaj kryesor është dokumentacioni nga paketa e librit LFS, përkthimi në rusisht i të cilit mund të gjendet këtu: http://multilinux.sakh.com/download/lfsbook.tar.bz2. Libri detajon çdo hap të krijimit të një OS, prandaj sigurohuni që t'i referoheni këtij udhëzuesi nëse hasni probleme (ky artikull nuk ka për qëllim të zëvendësojë një dokumentacion kaq të gjerë).

    Ne krijojmë një ndarje të re - në rastin tim është /dev/hda5, pasi ndarja /dev/hda1 tashmë është e zënë nga Linux Slackware i instaluar në hard disk. Rekomandohet që së pari të bëni një kopje rezervë të sistemit në mënyrë që të mund ta rivendosni atë në rast dëmtimi, megjithëse gjasat për këtë janë afër zeros. Dhe këtu, mendoj, gjithçka është e qartë: ne ndajmë shumën e kërkuar (mjafton 23 GB) për direktorinë rrënjë, hapësirë ​​e barabartë me dyfishin e sasisë së RAM-it për ndarjen e shkëmbimit, nëse dëshironi, mund të krijoni ndarje të veçanta për direktoria kryesore (/ shtëpi) dhe për / boot. Megjithatë, opsioni i ndarjes i favorizuar nga shumë - shpërndarja e të gjithë hapësirës së disponueshme minus swap në direktoriumin rrënjë, dhe më pas krijimi i shkëmbimit aktual - është gjithashtu mjaft i pranueshëm kur ndërtohet AFP. Në kompjuterin e autorit, si Linux Slackware, i cili është sistemi operativ mëmë, ashtu edhe LFS përdorin të njëjtin hard disk, megjithatë, instalimi i LFS në një hard disk tjetër nuk është gjithashtu i vështirë.

    Zgjidhni sistemin e skedarëve sipas gjykimit tuaj: nuk kishte probleme me Ext3 dhe ReiserFS nën LFS. Por fansat e XFS do të duhet të zhgënjehen - përpjekjet për të marrë Linux From Scratch për të punuar me këtë FS nuk kanë qenë të suksesshme.

    Tani montojmë ndarjen e rezervuar për OS të ri:

    $ montoni /dev/hda5 /mnt/mylin

    Për lehtësi, le të përcaktojmë variablin MYLIN:

    $ eksportoni MYLIN=/mnt/mylin

    E shkëlqyeshme, për punë të mëtejshme është më mirë të krijoni një përdorues të veçantë mylin, të cilin do ta caktojmë si pronar të ndarjes së montuar.

    $ user shto mylin

    $ chown -R mylin $MYLIN

    Ju duhet të krijoni një pemë drejtorie në rrënjën e ndarjes së re:

    $ cd $MYLIN

    $ mkdir –p bin boot dev etj në shtëpi lib mnt opt root sbin usr/(X11R6,local) var

    Në drejtoritë usr, usr/X11R6, usr/local ne krijojmë strukturën e nevojshme: nëndrejtori. bin, etj, përfshijnë, lib, sbin, share, src.

    Pastaj do të bëjmë të njëjtën gjë për drejtoritë /var dhe /opt të sistemit të ardhshëm:

    $ mkdir var/(cache,lib,lokal,kyçje,log,opt,ekzekutim,spool)

    $ mkdir opt/(bin,doc,include,info,lib,man)

    Të mos harrojmë se ka hierarki më të thella, si p.sh. /usr/share/man/man1. Por vëllimi i artikullit nuk ju lejon të jepni këtu të gjithë informacionin rreth strukturës së pemës së skedarëve, kështu që ju ose duhet të përdorni dokumentin Standard të Hierarkisë së Sistemit të Skedarëve (i disponueshëm në: http://linux-ve.net/MyLDP/ file-sys/fhs-2.2-rus), ose studioni me kujdes strukturën e OS të familjes Linux që keni instaluar tashmë. Pas përgatitjes së diskut të ngurtë, ne vazhdojmë me montimin statik.

    Asambleja statike

    Pse përdorim montim statik? Me përpilimin statik, kodi i aplikacionit i bashkëngjitet kodi burimor i bibliotekës, gjë që çon në një rritje të madhësisë së tij, por në të njëjtën kohë ruhet integriteti. Me përpilimin dinamik, biblioteka është në një skedar të veçantë, i cili aksesohet nga aplikacionet sipas nevojës. Si rezultat, të gjitha programet punojnë me një version të bibliotekës

    Por kur përdorim komandën chroot për të vendosur direktoriumin rrënjë për sistemin e sapomontuar, bibliotekat e sistemit "prind", të instaluar, të vendosura në / lib, / usr / lib dhe të tjera, nuk do të jenë më të disponueshme, kështu në mënyrë dinamike programet e përpiluara do të refuzojnë të punojnë, përveç kësaj, përputhshmëria e versionit nga askush nuk është e garantuar.

    Për të shmangur këtë, së pari do të përpilojmë të gjithë softuerin e nevojshëm për sistemin tonë të ardhshëm në mënyrë statike. Le të fillojmë me guaskën bash. (Tifozët e ZSH ose TCSH mund të instalojnë interpretuesit e tyre të preferuar pas instalimit të sistemit, por përdorimi i tyre gjatë fazës së ndërtimit nuk është menduar nga autori i LFS). Duhet të kontrolloni nëse keni skedarin /usr/lib/libcurses.a dhe nëse jo, instaloni paketën ncursesdev. Të gjitha paketat duhet të ndërtohen me flamuj ndërtimi statik: "--enable-static-link", "--disable-shared" ose "--static". Cili prej tyre është i përshtatshëm në çdo rast të veçantë mund të gjendet në dokumentacionin për një paketë të veçantë ose nga dalja e një skripti konfigurimi të ekzekutuar me parametrin "--help".

    $ ./configure --help

    Për të mos ngatërruar programet e përpiluara më vonë në mënyrë statike me programet "dinamike", ne do të krijojmë një drejtori të veçantë për to:

    $ mkdir $MYLIN/stat

    Kur ndërtoni dhe instaloni paketa, mos harroni të shtoni parametrin "--prefix=$MYLIN/stat" për të zhvendosur skedarët në këtë direktori. Dhe së fundi, instaloni bash:

    $ ./configure --enable-static-link --prefix=$MYLIN/stat

    $bëj

    $ bëj instalo

    Në të njëjtën mënyrë mbledhim edhe pjesën tjetër të paketave të nevojshme. : binutils, bzip2, textutils, texinfo, tar, sh-utils, gcc, grep, gzip, gawk, diffutils, fileutils, make, patch, sed, dhe, në fakt, linux-kernel.

    Po, gjatë përpilimit të kernelit, mos harroni se për versionet më të vjetra të kernelit (2.2.x-2.4.x) duhet të përdorni gcc 2.95, dhe për versionin aktual 2.6.x rekomandohet të përdorni gcc 3.x në mënyrë që nuk ka probleme.

    Mos harroni të shikoni në seksionet përkatëse të librit AFP, ai thotë për këtë dhe shumë nuanca të tjera. Në përgjithësi, përpilimi i kernelit në LFS nuk ndryshon nga një procedurë e ngjashme e kryer kur përdorni kompletin e shpërndarjes të instaluar në HDD. Zhbllokoni burimin e kernelit në $MYLIN/usr/src/linux-2.6.xx, më pas konfigurojeni duke ekzekutuar:

    $ make menuconfig

    Procesi i konfigurimit të parametrave të kernelit është përshkruar shumë herë në internet (6), vështirë se ka nevojë të ndalemi në këtë në më shumë detaje. Më pas, ne japim komandat e mëposhtme në dosjen e burimit të kernelit Linux:

    $ bëni bzImage

    $ bëni module

    Gjithçka, në $MYLIN/usr/src/linux-2.6.xx/arch/i386/boot/bzImage është kerneli i ri.

    Më pas, ne krijojmë grupin $MYLIN/etc/passwd dhe $MYLIN/etc/. Në të parën, ne regjistrojmë përdoruesin e vetëm deri më tani - root me çdo fjalëkalim, dhe në të dytën, grupet e përdoruesve (për të filluar me një grup rrënjë do të jetë gjithashtu e mjaftueshme).

    Kjo përfundon përgatitjet tona për hapin tjetër dhe ne kalojmë në një asamble dinamike më delikate.

    Asambleja dinamike

    Tani duhet të ndryshojmë direktoriumin rrënjë në /mnt/mylin, ku do të përdorim vetëm shërbime të përpiluara në mënyrë statike - nuk do të jemi më në gjendje të përdorim ndihmën e mjeteve nga OS "prind". Ne japim komandën në tastierë:

    $ chroot $MYLIN/usr/bin/env -i

    >HOME=/root TERM=$TERM PS1='u:w$'

    >PATH=/bin: /usr/bin: /sbin: /usr/sbin: /stat/sbin

    >/stat/bin/bash --login

    Me këtë komandë, ne specifikuam shtigjet drejt skedarëve të ekzekutueshëm, llojin e terminalit, interpretuesin dhe llojin e linjës së komandës.

    Për të funksionuar disa programe, duhet të instaloni sistemin e skedarëve proc në sistemin e ri.

    $ montoj proc /proc -t proc

    Ka ardhur momenti më i rëndësishëm. Ndërtimi i bibliotekës glibc. Ai është më i përgjegjshmi sepse shumica e programeve të nevojshme nuk do të funksionojnë pa të, dhe nuk ka kuptim të përdorni Linux pa bibliotekën kryesore. Ndërtimi i glibc, nga ana tjetër, shpesh shkakton shumë probleme.

    Gjatë ndërtimit, ne specifikuam parametrin "--prefiks=$MYLIN/stat", kështu që kur ndryshoni rrënjën, të gjitha paketat e ndërtuara në mënyrë statike do të jenë në drejtorinë /stat të ndarjes së re të OS.

    Pra, shpaketoni arkivin glibc-2.x.x.tar.gz (për shembull, në drejtorinë /usr/src/) dhe shkoni te drejtoria glibclinuxthreads. Ne do të duhet të rregullojmë pak kodin burimor për faktin se në këtë fazë është e pamundur të identifikohet përdoruesi me emër në sistem (vetëm për shkak të mungesës së glibc dhe bibliotekave të tjera), dhe faktit që instalimi i glibc kërkon një Përkthyesi Perl, të cilin ne nuk e kemi.

    Ne zëvendësojmë emrin e përdoruesit rrënjë në login/Makefile me uid-in e tij, domethënë 0, dhe ndryshorja $PERL në malloc/Makefile duhet të zëvendësohet me shtegun drejt interpretuesit - /usr/bin/perl - dhe thjesht do të të injorohen gjatë konfigurimit.

    $ /usr/src/glibc-2.x.x/configure --prefix=/usr --enable-add-ons --libexecdir=/usr/bin &&

    & bëj

    & bëj instalimin

    $ make localedata/install-locales

    $ /stat/bash --login

    Nëse keni bërë gjithçka siç duhet, glibc do të përpilohet, "root" më në fund do të shfaqet në prompt dhe të gjitha programet mund të rikompilohen në mënyrë dinamike.

    Përfundoni instalimin e kernelit:

    $ make modules_install

    $ bëj instalo

    Për të zhvendosur kernelin e ri në drejtorinë /boot, ekzekutoni një komandë tjetër:

    $ bëj instalo

    Ne mbledhim të gjitha programet e instaluara dhe disa të reja, tani pa flamuj përpilimi statik. Do të na duhet (në këtë fazë është shumë e rëndësishme të mos harroni të përpiloni të gjitha sa vijon) (shih tabelën 1).

    Tabela 1. Seti i kërkuar i paketave për montim

    autokonf

    grep

    perl

    automake

    groff

    bash

    gzip

    procinfo

    bin86

    procps

    binutils

    më pak

    pmisc

    bzip2

    reiserfs-progs

    diffutils

    libtool

    e2fsprogs

    lilo

    sh-utils

    hije

    dosje

    bëjnë

    syslogd

    fileutils

    makedev

    sysvinit

    gjetjet

    faqet e njeriut

    përkul

    modutils

    texinfo

    gawk

    mallkon

    tekstilet

    netkitbase

    përdorni linux

    bizon

    rrjeta-mjete

    gettext

    arnim

    Pas kryerjes së ripërpilimit dinamik, mund të hiqni direktorinë me paketa të ndërtuara në mënyrë statike:

    $ rm -rf /stat

    Mund të marrësh një psherëtimë të lehtësuar dhe të pish kafe - rutina më e vështirë, është lënë pas. Ne vazhdojmë në fazën tjetër - konfigurimin fillestar të sistemit tonë.

    Konfigurimi fillestar i sistemit

    Para se të vazhdoj me konfigurimin, vërej se të gjitha ndryshimet duhet të bëhen në skedarët e drejtorisë së sistemit të ri OS, dhe jo në sistemin prind.

    Për të vendosur kohën e sistemit, le të krijojmë një skedar /etc/sysconfig/clock që përmban vetëm një rresht:

    UTC=0

    Tani ora e kompjuterit do të shfaqë kohën në zonën tuaj kohore - me kusht që vlera e kohës në BIOS të jetë vendosur saktë.

    Le t'i japim kompjuterit një emër:

    jehonë "HOSTNAME=my_linux" > /etc/sysconfig/network

    Tani do të specifikojmë ndarjet që sistemi duhet të montojë në boot në /etc/fstab:

    # opsionet e tipit fs në pikën e montimit të sistemit të skedarëve hedhin rendin fsck

    /dev/hda5 / ext3 parazgjedhjet 1 1

    /dev/hda3 swap swap pri=1 0 0

    proc /proc proc parazgjedhjet 0 0

    Në vend të /dev/hda3 dhe /dev/hda5 shkruani ndarjet tuaja (root dhe swap), plotësoni skedarin nëse është e nevojshme me pika montimi për ndarje të tjera të diskut dhe CD-ROM.

    Tani le ta bëjmë sistemin tonë të nisshëm.

    Nëse, përveç lFS, përdorni shpërndarje të tjera Linux, atëherë tani duhet të regjistroheni në sistemin e vjetër - për ta bërë këtë, ekzekutoni komandën:

    $dalje

    Tashmë në sistemin operativ prind, shtoni sa vijon në skedarin /etc/lilo.conf:

    #AFP

    imazh=/boot/bzImage

    Etiketa=lfs

    rrënjë=

    Lexo vetem

    Është e qartë se “/boot/bzImage” është shtegu drejt kernelit të sistemit që keni përpiluar dhe “ndarja” është ndarja e diskut ku ndodhet direktoria rrënjësore.

    Nëse nuk planifikoni të përdorni sisteme të tjera operative dhe shpërndarje Linux, atëherë vazhdoni menjëherë me konfigurimin e LILO në LFS.

    Në këtë rast, lilo.conf do të dukej diçka si kjo:

    boot=/dev/hda

    vonesë=40

    Kompakt

    Vga=normale

    Root=/dev/hda1

    Lexo vetem

    Image=/boot/zImage-2.6.12

    Label=Linux

    Bëni ndryshimet e nevojshme në varësi të konfigurimit tuaj. Përditësoni ngarkuesin me komandën:

    $ /sbin/lilo -v

    Dhe, nëse të gjitha hapat e mëparshëm janë kryer si duhet, ne do të gjejmë veten në një sistem të ri. Sidoqoftë, një fazë e gjatë e akordimit "gjobë" (vëmendje e veçantë duhet t'i kushtohet sigurisë së sistemit të ri, sepse LFS si parazgjedhje duket mjaft e pasigurt, si çdo OS i sapo instaluar) është ende përpara. Por ju tashmë keni versionin tuaj të përpiluar të Linux.

    P.S

    Gerard Beekmans nuk është i vetmi që ka idenë për të ndërtuar Linux-in e tij. Një projekt tjetër, BYOLinux, i udhëhequr nga Jonathan Thorpe, ka pushuar zhvillimin e tij sot, megjithëse dokumentacioni i shkruar prej tij mbetet i rëndësishëm edhe tani, por nuk është aq i detajuar sa libri LFS dhe nuk është i përkthyer në Rusisht. Dallimi kryesor i metodës së John është se biblioteka glibc transferohet nga sistemi prind në sistemin e fëmijës pa rikompilim, kjo nuk është aq efikase, por shmang shumë probleme ndërtimi. Dëshira për t'u ndjerë si një projektues OS përjetohet gjithashtu nga disa përdorues të FreeBSD.

    Tani kjo është mjaft e mundur - në http://ezine.daemonnews.org/200302/fbsdscratch.html ka një artikull në lidhje me ndërtimin e FreeBSD nga burimi në tërësi - nga shpërndarjet në portet, dhe me një metodë jo të ngjashme me të zakonshmen " rindërtimi" i sistemit, por i ngjashëm me metodën Gerard Beekmens. Epo, tani ju keni një sistem personal, unik të ndërtuar në Linux. Në rast të problemeve, kërkoni zgjidhjen e tyre në librin e AFP-së, gjithçka përshkruhet në detaje atje. Unë rekomandoj gjithashtu shkarkimin e Udhëzuesit të Administratorit të Rrjetit Linux nga portali http://www.tldp.org, megjithëse nuk zbatohet drejtpërdrejt në LFS, ai do të jetë i dobishëm në fazën e konfigurimit të sistemit. Mos harroni se me secilin program ofrohen edhe faqe të ndryshme të njeriut dhe informacionit, të krijuara gjithashtu për të lehtësuar jetën e një përdoruesi Linux.

    1. LFS-libër në Rusisht - http://multilinux.sakh.com/lfs.
    2. Portali zyrtar i projektit AFP është http://www.linuxfromscratch.org.
    3. Portali ByoLinux - http://www.byolinux.org.
    4. Artikull rreth FreeBSD nga e para - http://ezine.daemonnews.org/200302/fbsdscratch.html.
    5. Një artikull rreth përpilimit të kernelit Linux - http://vikos.lrn.ru/MyLDP/kernel/kompil-2-6.html.
    6. Bairak A. Përmbledhje e Knoppix 3.7 Botimi Rus. - Revista "Administratori i Sistemit", Nr.3, Mars 2005 - 4-6 f. ().

    Kjo seri artikujsh i kushtohet programimit të nivelit të ulët, domethënë arkitekturës kompjuterike, dizajnit të sistemit operativ, programimit të gjuhës së asamblesë dhe fushave të ngjashme. Deri më tani, dy habrausers janë duke bërë shkrim - iley dhe pehat. Për shumë nxënës të shkollave të mesme, studentë dhe programues profesionistë, këto tema rezultojnë të jenë shumë të vështira për t'u mësuar. Ka shumë literaturë dhe kurse që i kushtohen programimit të nivelit të ulët, por është e vështirë të merret një pasqyrë e plotë dhe gjithëpërfshirëse prej tyre. Është e vështirë, pasi të keni lexuar një ose dy libra mbi sistemet e montimit dhe operimit, të imagjinoni të paktën në terma të përgjithshëm se si funksionon në të vërtetë ky sistem kompleks prej hekuri, silikoni dhe shumë programesh - një kompjuter.

    Secili e zgjidh problemin e të mësuarit në mënyrën e vet. Dikush lexon shumë literaturë, dikush përpiqet të kalojë shpejt në praktikë dhe të kuptojë gjatë rrugës, dikush përpiqet t'u shpjegojë miqve gjithçka që po studion. Dhe ne vendosëm t'i kombinojmë këto qasje. Pra, në këtë kurs artikujsh, ne do të demonstrojmë hap pas hapi se si të shkruajmë një sistem operativ të thjeshtë. Artikujt do të jenë të një natyre të përgjithshme, domethënë nuk do të përmbajnë informacione shteruese teorike, megjithatë, ne gjithmonë do të përpiqemi të ofrojmë lidhje me materiale të mira teorike dhe t'u përgjigjemi të gjitha pyetjeve që lindin. Ne nuk kemi një plan të qartë, kështu që shumë vendime të rëndësishme do të merren gjatë rrugës, duke marrë parasysh komentet tuaja.

    Ne mund ta çojmë qëllimisht procesin e zhvillimit në një rrugë pa krye për t'ju lejuar juve dhe vetes që të kuptojmë plotësisht pasojat e një vendimi të gabuar, si dhe të përmirësojmë disa aftësi teknike mbi të. Pra, mos i merrni vendimet tona si të vetmet të vërteta dhe na besoni verbërisht. Theksojmë edhe një herë se presim që lexuesit të jenë aktivë në diskutimin e artikujve, gjë që duhet të ndikojë shumë në procesin e përgjithshëm të zhvillimit dhe shkrimit të artikujve pasues. Në mënyrë ideale, do të dëshiroja që disa nga lexuesit t'i bashkohen zhvillimit të sistemit me kalimin e kohës.

    Do të supozojmë se lexuesi tashmë është i njohur me bazat e asamblesë dhe gjuhëve C, si dhe me konceptet elementare të arkitekturës kompjuterike. Kjo do të thotë, ne nuk do të shpjegojmë se çfarë është një regjistër ose, të themi, RAM. Nëse ju mungojnë njohuritë, gjithmonë mund t'i drejtoheni literaturës shtesë. Një listë e shkurtër e referencave dhe lidhjeve për faqet me artikuj të mirë janë në fund të artikullit. Është gjithashtu e dëshirueshme që të jeni në gjendje të përdorni Linux, pasi të gjitha udhëzimet e përpilimit do të jepen për këtë sistem.

    Dhe tani - më afër pikës. Në pjesën tjetër të artikullit, unë dhe ju do të shkruajmë programin klasik "Hello World". Bota jonë e Halloween do të jetë paksa specifike. Nuk do të funksionojë nga ndonjë sistem operativ, por drejtpërdrejt, si të thuash "në metal të zhveshur". Para se të vazhdojmë drejtpërdrejt me shkrimin e kodit, le të kuptojmë se si saktësisht po përpiqemi ta bëjmë këtë. Dhe për këtë ju duhet të merrni parasysh procesin e nisjes së kompjuterit.

    Pra, merrni kompjuterin tuaj të preferuar dhe shtypni butonin më të madh në njësinë e sistemit. Ne shohim një mbrojtës të gëzuar të ekranit, njësia e sistemit kërcëllon me gëzim me një altoparlant dhe pas një kohe sistemi operativ ngarkohet. Siç e kuptoni, sistemi operativ ruhet në hard disk, dhe këtu lind pyetja: si sistemi operativ nisi në mënyrë magjike në RAM dhe filloi të ekzekutohej?

    Dijeni këtë: sistemi që është në çdo kompjuter është përgjegjës për këtë, dhe emri i tij është jo, jo Windows, pip gjuhën tuaj - quhet BIOS. Emri i tij qëndron për Sistemin Bazë Input-Output, që është, sistemi bazë input-output. BIOS ndodhet në një mikrocircuit të vogël në motherboard dhe fillon menjëherë pasi të keni shtypur butonin e madh ON. BIOS ka tre detyra kryesore:

    1. Zbuloni të gjitha pajisjet e lidhura (procesorin, tastierën, monitorin, RAM-in, kartën video, kokën, krahët, krahët, këmbët dhe bishtat...) dhe testoni ato për funksionalitet. Programi POST (Power On Self Test) është përgjegjës për këtë. Nëse nuk gjendet një pajisje jetike, atëherë asnjë softuer nuk mund të ndihmojë dhe në këtë pikë altoparlanti i sistemit do të kërcëjë diçka ogurzezë dhe OS nuk do të arrijë fare. Le të mos flasim për gjëra të trishtueshme, le të supozojmë se kemi një kompjuter plotësisht që funksionon, gëzohemi dhe kalojmë në shqyrtimin e funksionit të dytë BIOS:
    2. Sigurimi i sistemit operativ me një grup funksionesh bazë për të punuar me hekur. Për shembull, përmes funksioneve të BIOS-it, mund të shfaqni tekst në ekran ose të lexoni të dhëna nga tastiera. Prandaj quhet sistemi bazë input-output. Në mënyrë tipike, sistemi operativ i qaset këtyre funksioneve përmes ndërprerjeve.
    3. Nisja e ngarkuesit të sistemit operativ. Në këtë rast, si rregull, lexohet sektori i nisjes - sektori i parë i bartësit të informacionit (disketa, hard disk, CD, flash drive). Rendi i votimit në media mund të caktohet në BIOS SETUP. Sektori i nisjes përmban një program që ndonjëherë quhet ngarkuesi primar. Përafërsisht, detyra e bootloader është të fillojë sistemin operativ. Procesi i ngarkimit të një sistemi operativ mund të jetë shumë specifik dhe shumë i varur nga veçoritë e tij. Prandaj, ngarkuesi kryesor shkruhet drejtpërdrejt nga zhvilluesit e OS dhe shkruhet në sektorin e nisjes gjatë instalimit. Kur fillon ngarkuesi, procesori është në modalitetin real.
    Lajmi i trishtuar: madhësia e ngarkuesit duhet të jetë vetëm 512 bajt. Pse kaq pak? Për ta bërë këtë, duhet të njihemi me pajisjen e disketës. Këtu është një foto edukative:

    Fotografia tregon sipërfaqen e diskut. Një disketë ka 2 sipërfaqe. Në çdo sipërfaqe ka gjurmë (gjurmë) në formë unaze. Çdo pistë është e ndarë në pjesë të vogla në formë harku të quajtura sektorë. Pra, historikisht, një sektor i disketës ka një madhësi prej 512 bajt. Sektori i parë në disk, sektori i nisjes, lexohet nga BIOS "në segmentin zero të memories në kompensim 0x7С00, dhe më pas kontrolli transferohet në këtë adresë. Ngarkuesi i nisjes zakonisht nuk ngarkon vetë OS në memorie, por një tjetër Programi bootloader ruhet në disk, por për disa arsye (ka shumë të ngjarë, kjo arsye është madhësia) që nuk përshtatet në një sektor. Dhe duke qenë se deri më tani roli i sistemit operativ tonë luhet nga një botë banale, qëllimi ynë kryesor është të bëjeni kompjuterin të besojë në ekzistencën e sistemit tonë operativ, edhe nëse është në një sektor, dhe drejtojeni atë.

    Si është rregulluar sektori i boot-it? Në një PC, kërkesa e vetme për një sektor të nisjes është që dy bajtë e tij të fundit të përmbajnë vlerat 0x55 dhe 0xAA, nënshkrimin e sektorit të nisjes. Pra, tashmë është pak a shumë e qartë se çfarë duhet të bëjmë. Le të shkruajmë kodin! Kodi i mësipërm është shkruar për montuesin yasm.

    seksioni. teksti

    përdorni16

    org 0x7C00 ; programi ynë është i ngarkuar në 0x7C00

    filloni:

    mov ax , cs

    mov ds, sëpatë ; zgjidhni segmentin e të dhënave



    mov si , mesazh

    cld ; drejtim për komandat e vargut

    mov ah , 0x0E ; Numri i funksionit BIOS

    mov bh , 0x00 ; faqe memorie video

    puts_loop:

    lodsb ; ngarkoni karakterin tjetër në al

    test al , al ; karakteri null nënkupton fundin e vargut

    jz vendos_loop_dalje

    int 0x10 ; duke thirrur funksionin BIOS

    jmp puts_loop

    puts_loop_exit:

    jmp$; cikli i përjetshëm



    mesazh:

    db "Përshëndetje Botë!" 0

    përfundoni:

    herë 0x1FE - përfundimi + fillimi db 0

    db 0x55, 0xAA ; nënshkrimi i sektorit të nisjes

    Ky program i shkurtër kërkon një sërë shpjegimesh të rëndësishme. Linja org 0x7C00 nevojitet në mënyrë që asembleri (që nënkupton programin, jo gjuhën) të llogarisë saktë adresat për etiketat dhe variablat (puts_loop, puts_loop_exit, message). Pra, ne i themi atij se programi do të ngarkohet në memorie në 0x7C00.
    Në rreshta
    mov ax , cs

    mov ds, sëpatë
    segmenti i të dhënave (ds) vendoset i barabartë me segmentin e kodit (cs), pasi në programin tonë të dhënat dhe kodi ruhen në të njëjtin segment.

    Më pas mesazhi "Hello World!" shfaqet karakter pas karakteri në lak. Për këtë përdoret funksioni 0x0E i ndërprerjes 0x10. Ai ka opsionet e mëposhtme:
    AH = 0x0E (numri i funksionit)
    BH = numri i faqes së videos (mos u shqetësoni akoma, tregoni 0)
    AL = kodi i karakterit ASCII

    Në rreshtin "jmp $" programi varet. Dhe me të drejtë, nuk ka nevojë që ajo të ekzekutojë kod shtesë. Sidoqoftë, në mënyrë që kompjuteri të funksionojë përsëri, do t'ju duhet të rindizni.

    Në rreshtin " herë 0x1FE-finish+start db 0", pjesa tjetër e kodit të programit (përveç dy bajtit të fundit) është e mbushur me zero. Kjo bëhet në mënyrë që pas kompilimit, nënshkrimi i sektorit të nisjes të shfaqet në dy bajtet e fundit të programit.

    Ne e kuptuam disi kodin e programit, tani le të përpiqemi ta përpilojmë këtë lumturi. Për të përpiluar, ne kemi nevojë, në fakt, një asembler - sa më sipër

    Herët a vonë, çdo përdorues Linux mendon të krijojë shpërndarjen e tij. Disa argumentojnë se ju mund të "përshtatni gjithçka për veten tuaj". Të tjerë ankohen se në mesin e shpërndarjeve të prezantuara tashmë në Vetka, nuk ka asnjë ideal. Dhe ata gjoja kanë ide super-konceptuale për sistemin e tyre. Pse e nisa gjithë këtë psikologji? Për të ndërprerë menjëherë oksigjenin për fillestarët që luajnë me Linux, të cilët nuk kanë çfarë të bëjnë. Nëse tashmë po mendoni të krijoni një OS, mendoni deri në fund. Kështu që,

    Unë dua të krijoj një OS me bazë linux.
    Unë ju paralajmëroj menjëherë: nëse do të ishte shekulli i 18-të, të gjithë ata që zgjedhin një pajisje tjetër të zhvilluar të shpërndarjes (dhe, Zoti na ruajt, popullore ...) për bazën e sistemit të tyre të ardhshëm do të vareshin. Postimi ka të bëjë me krijimin e një sistemi nga e para, që do të thotë se ne nuk do të prekim asnjë Slax dhe Linux Mint.

    Hapi 1: Zgjidhni një media
    Ka pak opsione: ose OS juaj fillon nga një LiveCD, ose nga një hard disk, ose nga një pajisje flash. Do të bëj një rezervim menjëherë: Nuk do të them asnjë fjalë për hard diskun në postim, sepse është shumë më i përshtatshëm të krijosh një çantë shpërndarjeje fleksibël nga seria "Unë mbaj gjithçka me vete" ose një shpërndarje të kyçur. komplet në një disk optik. Nëse mësoni se si të krijoni një sistem LiveCD ose LiveUSB, nuk do të ketë probleme me instalimin në një hard disk.

    Për çdo rast, përgatitni një flash drive bosh, CD dhe në fund instaloni Virtualbox.

    Hapi 2 Përpilimi i kernelit
    Për sa i përket lëshimit të kernelit të tretë Linux, ky hap inkurajon zhvillimin e mëtejshëm ... Pra, ne kemi nevojë për burimet e kernelit. Çdo përdorues e di se ato mund të merren nga kernel.org. Në asnjë rast, nuk dëgjoni?, mos vidhosni kurrë një kernel të jashtëm që nuk është përpiluar nga ju në sistemin tuaj!

    Meqenëse dembelizmi ime u shkatërrua, krijova një dosje / linuxkernel dhe shpaketova arkivin me burimet atje. Duke u identifikuar si rrënjë, bëra sa vijon:

    cd /linuxkernel
    bëj konfigurimin e menusë

    Në parim, kerneli mund të konfigurohet në tre mënyra: të bëjë konfigurimin (konfigurim online), të bëjë menuconfig (konfigurim pseudo-grafik nëpërmjet ncurses) dhe të bëjë xconfig (konfigurim grafik). Në fund të fundit është se bërja e konfigurimit do t'ju prishë disponimin për një kohë të gjatë, sepse. ai do të bëjë të gjitha pyetjet e mundshme për të gjitha aspektet e të gjitha temave. Problemi me make xconfig nuk gjendet tek të gjithë, por unë jam takuar dhe ende e kam. Nëse keni dëshirë ta bëni atë përmes X, kuptojeni vetë. Opsioni më i mirë është konfigurimi i menusë. Kjo gjë do të hapë një ndërfaqe pseudografike për ju, përmes së cilës mund ta personalizoni kernelin në mënyrën tuaj. Gjëja kërkon bibliotekën ncurses, e cila është e lehtë për t'u instaluar.

    Në parim, nëse truri juaj e kupton Linuxin fare, do ta kuptoni konfigurimin. Procesi është interesant, ka vërtet shumë opsione, dhe ndihma, megjithëse në anglisht, ende kënaqet me aksesin dhe thjeshtësinë e saj.

    Megjithatë, ju ende duhet të drejtoheni. Shkoni te File Systems ---> dhe vendosni yjet e kërkuar. Shkronja M do të thotë që mbështetja për një drejtues të veçantë kryhet duke lidhur një modul të jashtëm me kernelin (i urrej ata!). Ne gjithashtu kemi nevojë për mbështetje isofs për të lexuar disqe. Sistemet e skedarëve ---> Sistemet e skedarëve CD-ROM/DVD ---> Mbështetja e sistemit të skedarëve CDROM ISO 9660. Ju ende mund të mbështesni sistemet e lashta dos.

    Zhvilluesit e çuditshëm Mandriva harruan të lejojnë sistemet e skedarëve ---> DOS/FAT/NT Filesystems ---> NTFS mbështetjen e shkrimit, dhe në një nga shpërndarjet e tyre unë kisha probleme me aksesin në ndarjen e vjetër të Windows.

    Shiko llojin dhe veçoritë e procesorit ---> Familja e procesorit, më rekomanduan të zgjidhja Pentium-MMX.

    Gërmoni gjithashtu në drejtuesit e pajisjes, është e dobishme. Për argëtim, mund të zgjidhni gjithçka atje dhe të përpiloni një kernel me peshë > 50 MB.

    Me tutje. Kerneli, pasi të ngarkohet vetë, duhet të ngarkojë, në fakt, sistemin. Ose nga skedarët e vetë-përpiluar (të përdorur në sistemet e ngulitura), ose nga një arkiv CPIO i ngjeshur me diçka, ose nga Initrd. Ky nuk është DOS për ju, këtu nuk do të jetë e mundur t'i referoheni menjëherë një skedari të ri init "në direktorinë rrënjësore të një disku ose flash drive. Në fakt, do të funksionojë, mos dëgjoni xhaxhain Annix! Kjo është e gabuar , edhe pse tashmë ka një polemikë të fortë në internet për këtë, ne do të përdorim initrd për sistemin tonë, sepse është i përshtatshëm dhe nuk do të shkaktojë shprehje të turpshme nga zhvilluesit e palëve të treta, ndryshe nga arkivi CPIO.

    Oh po, përpiloni kernelin me komandën

    Nëse keni x86, mund ta gjeni në /linuxkernel/arch/x86/boot/bzImage.

    Për programuesit e ashpër të Chelyabinsk, mund të përdorni Cross-compiling ...

    Krijo Ramdisk.

    Tani na duhet një initrd me një guaskë të thjeshtë të instaluar atje. Ne do të përdorim busybox sepse kjo nyasha mund të bëjë gjithçka. Ne do t'i vjedhim rrugën Roberto de Leos, krijuesit të Movix (madje do të filloja ta respektoja nëse nuk do të ishte për dashurinë transhendente për Perl):

    dd if=/dev/zero of=/dev/ram0 bs=1k count=5000 - Krijoni një Ramdisk në RAM-in e kompjuterit tonë.
    mke2fs -m0 /dev/ram0 5000 - Formatoni Ramdisk në sistemin Ext2
    mkdir /distro - Krijo një dosje
    mount /dev/ram0 /distro - Montoni në dosjen /distro

    Gjithçka, tani kemi një Ramdisk me një kapacitet prej 5 MB. Ju mund të bëni më shumë, por nuk keni nevojë. Ndryshe nga Thomas Mathejisek, unë nuk do të mbush initrds me module Squashfs të kompresuara nga LZMA. Gjithçka që nevojitet do të përpilohet me kernel. Po, kjo nuk është shumë logjike dhe e saktë, por telashet janë njëqind herë më pak. Dhe veçanërisht për ata që e dënojnë këtë qasje, mund të aktivizoni opsionin e modularitetit në kernel: Aktivizoni mbështetjen e modulit të ngarkueshëm.

    Ne Ramdisk tone montuar ne/distro ka nje dosje te tille humbur + gjetur.Kjo sepse e kemi formatuar ne ext2.Ne asnje rast nuk duhet te fshihet edhe pse nuk ka gjasa te ndihmoje ketu imazhi eshte rregulluar.Ne për të vendosur busybox të parën ...

    Instalimi i busybox
    Pse projekte kaq të mëdha kanë faqe interneti kaq të ndyra? Edhe pse... nuk ka më rëndësi nëse burimet shkarkohen dhe shpaketohen me sukses në dosjen /busybox.

    Ju mund të konfiguroni busybox në të njëjtën mënyrë:

    cd /busybox
    bëj konfigurimin e menusë

    Nëse ende nuk e kuptoni se çfarë është, unë do t'ju shpjegoj. Busybox zëvendëson mijëra aplikacione UNIX të ruajtura në dosjet /bin, /sbin, /usr/bin, /usr/sbin. Në vend të kësaj, krijohet vetëm një aplikacion: /bin/busybox, dhe një sërë lidhjesh krijohen me të në dosjet e mësipërme. Instaloni busybox me komandën e mëposhtme:

    bëj instalimin CONFIG_PREFIX=/distro

    Busybox gjithashtu do të krijojë skedarë /sbin/init dhe /linuxrc për disa arsye në mënyrë që sistemi juaj të fillojë siç duhet. Por jo të gjitha dosjet e nevojshme janë krijuar. Kështu që ne përfundojmë gjithçka me duart tona dhe krijojmë:

    /distro/etj
    /distro/lib
    /distro/dev
    /distro/mnt
    distro/proc
    /distro/root
    /distro/tmp
    /distro/root

    Nëse keni harruar diçka, mbani mend, sepse Këto drejtori janë të vështira për t'u harruar.

    Gjithçka do të ishte mirë, por busybox kërkon që bibliotekat të funksionojnë, të cilat duhet të kopjohen në shpërndarjen tonë. Është shumë e lehtë të zbulosh se cilat:

    ldd /distro/bin/busybox

    Programi do të na tregojë bibliotekat e kërkuara për guaskën tonë. Unë them menjëherë: porta linux është krijuar nga kerneli dhe nuk mund të kopjohet.

    Kur kopjoni bibliotekat, mund të ndërpresni informacionin e korrigjimit (siç këshillon Roberto):

    objcopy --strip-debug from where to

    Krijimi i Linux nga Linux

    Ju duhet të krijoni disa skedarë teksti të sistemit:

    Na duhet /etc/inittab. Unë do t'ju befasoj: në fillim të jetës, sistemi as nuk e di se çfarë është Root. Madje kemi një përdorues pa emër, por skedari i veçorive të nivelit të ulët në të gjithë sistemin (ONF) duhet të jetë i pranishëm. Përmbajtja pilot e skedarit është si më poshtë:

    # Skedari i parë që do të ekzekutohet, /sbin/init më pas.
    ::sysinit:/etc/rc.d/rc.S

    # Drejtoni një guaskë në tastierë.
    ::respawn:-/bin/sh

    # Komandat për të ekzekutuar përpara mbylljes dhe rinisjes.
    :: mbyllje:/sbin/swapoff -a >/dev/null 2>&1
    :: mbyllje:/bin/umount -a -r >/dev/null 2>&1

    Skedari tjetër është /etc/fstab. Kjo është një tabelë që përshkruan se çfarë dhe ku të montoni në boot. Gjëja është e kotë! Ne duhet të montojmë proc, përndryshe asgjë nuk do të funksionojë fare, kështu që shkruajmë në skedar:

    none /proc proc paracakton 0 0

    Mount gjithashtu ka nevojë për /etc/mtab. Krijojeni dhe lëreni bosh.

    Por mount do të bëjë atë që duhet të bëjë vetëm kur ne t'i kërkojmë në mënyrë eksplicite. Dhe ne do të pyesim në të njëjtin skedar boot /etc/rc.d/rc.S (rc.d është një dosje). Ne pyesim me mirësjellje:

    /bin/mount -av -t nonfs

    Na duhet gjithashtu një skedar profili (b) (a) sh, në përgjithësi ka liri për imagjinatën. Krijoni një skedar /etc/profile dhe plotësoni atë me sa vijon:

    PATH="$PATH:/bin:/sbin:/usr/bin:/usr/sbin:"
    PAK =-MM
    TERM=linux
    HOME=/rrënjë
    PS1=">"
    PS2=">"
    ignoreeof=10
    eksportoni SHTESË SHPALL AFAT MË PAK PS1 PS2 HOME injoruar

    Do t'ju duhet gjithashtu skedari /etc/shell, i cili tregon se ekziston një guaskë:

    /bin/sh
    /bin/ash
    /bin/bash

    Kjo është në fakt e gjitha. Mund ta shkruajmë Ramdiskun tonë në një skedar.

    mkdir /os - dosje për "gati".
    umount /dev/ram0 - çmontoni një pjesë të RAM-it.
    dd if=/dev/ram0 of=/os/initrd bs=1k count=5000 - krijoni skedar.
    gzip /os/initrd - kompresoni skedarin initrd

    Krijoni një flash drive bootable

    "Finish line" i zhvillimit tonë të vogël. Ne marrim një USB flash drive, e futim atë, e formatojmë në vfat (është gjithashtu e mundur në ext, por mos harroni se jo të gjithë përdoruesit e Windows e kanë qëlluar ende veten).

    Në flash drive, krijoni një dosje boot, ajo përmban dosjet initrd dhe kernel.

    Nga dosja / os, kopjoni Ramdisk-in e kompresuar në dosjen boot / initrd në flash drive, quajeni "main.gz". Nga dosja me burimet e kernelit, kopjoni bzImage në dosjen e nisjes / kernelit në USB flash drive, quajeni "main.lk". Ne marrim skedarët e ngarkuesit të Syslinux (në internet, ose nga një shpërndarje tjetër: këtu nuk ka rëndësi), përkatësisht syslinux.bin, syslinux.boot, syslinux.cfg. Ne i kopjojmë ato në direktorinë rrënjë të flash drive-it tonë. Në skedarin syslinux.cfg ne shkruajmë diçka si kjo:

    mm i paracaktuar
    nxitja 1
    kohëzgjatja 100
    etiketa mm
    kernel /boot/kernel/main.lk

    etiketa mc
    kernel /boot/kernel/main.lk

    etiketa cm
    kernel /boot/kernel/custom.lk
    shtoj initrd=/boot/initrd/main.gz load_ramdisk=1 ramdisk_size=5000 rw root=/dev/ram0
    etiketë cc
    kernel /boot/kernel/custom.lk
    shtoj initrd=/boot/initrd/custom.gz load_ramdisk=1 ramdisk_size=5000 rw root=/dev/ram0
    etiketa hd
    localboot 0x80

    Kështu, ne mbështetëm initrds me porosi dhe kernel, i cili, për hir të eksperimentit, mund të lidhet me shpërndarjen tonë.

    Le të zbulojmë se çfarë pajisjeje është disku ynë flash në sistem (mund të ekzekutoni montimin pa parametra dhe të shihni). Kjo është ose /dev/sdb1 ose /dev/sdc1 ose /dev/sdd1. Vlen të çmontoni flash drive-in përpara se të filloni instalimin.

    Instaloni syslinux (nëse paketa nuk është në sistem, apt-get install syslinux):

    syslinux -d pajisje_shtegu

    Skedari ldlinux.sys duhet të shfaqet në direktorinë rrënjë të flash drive. Nëse është, atëherë syslinux.bin, syslinux.boot nuk nevojiten më.

    Nuk do t'ju tregoj se si ta konfiguroni BIOS-in për të nisur nga një USB flash drive - është e lehtë. Më lejoni të them vetëm se është shumë i përshtatshëm për të krijuar dosjen /boot/initrd/init, në të cilën mund të montoni /boot/initrd/main për punë të mëtejshme me të. Vetëm mos harroni ta dekompresoni dhe ngjeshni me gzip.

    OK tani ka mbaruar.

    Ashtu siç sapo ju thashë se si të ndërtoni një sistem Linux nga e para. Lehtë, apo jo? Më pas mund të redaktoni skriptin /sbin/init, sepse keni ende shumë punë për të bërë! Do t'ju duhet të shkruani një skript për të montuar flash drive-in që kalon në direktorinë rrënjë. Përndryshe, do të detyroheni të punoni me një ndarje 5 MB ReadOnly. Por kjo është një histori krejtësisht tjetër.

    Artikujt kryesorë të lidhur