Kuinka luoda oma järjestelmä mille tahansa toiminnalle. Kuinka luoda oma käyttöjärjestelmä tyhjästä

Ennemmin tai myöhemmin jokainen Linux-käyttäjä miettii oman jakelunsa luomista. Jotkut väittävät, että voit "muokata kaiken itse". Toiset valittavat, että Vetkassa jo esitellyistä jakelusarjoista ei löydy ihanteellista. Ja heillä oletetaan olevan superkäsitteellisiä ideoita omalle järjestelmälleen. Miksi aloitin tämän psykologian? Jotta happi katkaistaan ​​välittömästi Linuxilla pelaaville aloittelijoille, joilla ei ole mitään tekemistä. Jos harkitset jo käyttöjärjestelmän luomista, mieti loppuun asti. Niin,

Haluan luoda Linux-pohjaisen käyttöjärjestelmän.
Varoitan teitä heti: jos olisi 1700-luku, kaikki ne, jotka valitsevat toisen kehittyneen jakelun (ja varjelkoon, suositun...) tulevan järjestelmänsä perustaksi, olisivat riippuvaisia. Viesti käsittelee järjestelmän luomista tyhjästä, mikä tarkoittaa, että emme koske kaikenlaisiin Slaxiin ja Linux Mintiin.

Vaihe 1: Valitse media
Vaihtoehtoja on vähän: joko käyttöjärjestelmäsi toimii LiveCD-levyltä, kiintolevyltä tai flash-laitteelta. Teen varauksen heti: en sano sanaakaan kiintolevystä tässä postauksessa, koska on paljon kätevämpää luoda joustava jakelupaketti "Kannan kaiken mukanani" -sarjasta tai lukittu jakelu sarja optiselle levylle. Jos opit luomaan LiveCD- tai LiveUSB-järjestelmän, kiintolevylle asennuksessa ei ole ongelmia.

Varaa varmuuden vuoksi puhdas flash-asema, CD-levy ja asenna lopuksi Virtualbox.

Vaihe 2: Ytimen kääntäminen
Mitä tulee kolmannen Linux-ytimen julkaisuun, tämä askel rohkaisee jatkokehitykseen... Joten tarvitsemme ytimen lähteet. Jokainen käyttäjä tietää, että ne voi saada kernel.org-sivustolta. Älä missään tapauksessa liitä järjestelmääsi vierasta ydintä, jota et ole itse kääntänyt!

Koska laiskuus ei ollut mittakaavassa, loin /linuxkernel-kansion ja purin arkiston ja sen lähteet. Kirjautuneena sisään root-käyttäjänä, tein seuraavaa:

cd / linuxkernel
tee menuconfig

Periaatteessa ydin voidaan konfiguroida kolmella tavalla: make config (keskustelukonfiguraatio), make menuconfig (pseudografinen konfigurointi ncurseiden kautta) ja make xconfig (graafinen konfigurointi). Tärkeintä on, että konfiguroinnin tekeminen pilaa mielialaasi pitkäksi aikaa, koska... hän kysyy kaikki mahdolliset kysymykset kaikista aiheista. Make xconfig -ongelma ei ilmene kaikille, mutta olen törmännyt siihen ja kohtaan edelleen. Jos haluat tehdä sen X:n kautta, selvitä se itse. Paras vaihtoehto on tehdä menuconfig. Tämä avaa pseudograafisen käyttöliittymän, jonka kautta voit mukauttaa ydintä omalla tavallasi. Asia vaatii ncurses-kirjaston, joka on helppo asentaa.

Periaatteessa, jos aivosi ymmärtävät Linuxia ollenkaan, selvität kokoonpanon. Prosessi on mielenkiintoinen, vaihtoehtoja on todella paljon, ja apu, vaikkakin englanniksi, on silti tyytyväinen saavutettavuuteen ja yksinkertaisuuteen.

Sinua on kuitenkin edelleen ohjattava. Siirry kohtaan Tiedostojärjestelmät ---> ja laita vaaditut tähdet. M-kirjain tarkoittaa, että tietyn ohjaimen tuki suoritetaan liittämällä ulkoinen moduuli ytimeen (vihaan niitä!). Tarvitsemme myös isofs-tuen levyjen lukemiseen. Tiedostojärjestelmät ---> CD-ROM/DVD-tiedostojärjestelmät ---> ISO 9660 CDROM -tiedostojärjestelmän tuki. Voit myös tukea vanhoja Dos-järjestelmiä.

Paska Mandriva-kehittäjät unohtivat sallia tiedostojärjestelmät ---> DOS/FAT/NT-tiedostojärjestelmät ---> NTFS-kirjoitustuen, ja yhdessä heidän jakelustaan ​​kamppailin pääsyn vanhaan Windows-osioon.

Katso Prosessorin tyyppi ja ominaisuudet ---> Prosessoriperhe, minun suositeltiin valita Pentium-MMX.

Katso myös Laiteohjaimet, se on hyödyllinen. Ihan huvin vuoksi voit valita sieltä kaiken ja kääntää ytimen, joka painaa > 50 MB.

Edelleen. Ytimen tulee ladata itse järjestelmä itse lataamisen jälkeen. Joko käännetyistä tiedostoista (käytetään sulautetuissa järjestelmissä), tai CPIO-arkistosta, joka on pakattu jollakin, tai Initrd:stä. Tämä ei ole DOS, tässä et voi heti viitata johonkin init”-tiedostoon levyn tai flash-aseman juurihakemistossa. Itse asiassa se toimii, älä kuuntele Annix-setä. vaikka Internetissä tästä käydäänkin jo melkoista keskustelua. Käytämme järjestelmässämme initrd:tä, koska se on kätevää eikä aiheuta säädytöntä kielenkäyttöä kolmansien osapuolien taholta, toisin kuin CPIO-arkisto.

Voi kyllä, käännä ydin komennolla

Jos sinulla on x86, löydät sen osoitteesta /linuxkernel/arch/x86/boot/bzImage.

Koville Tšeljabinskin ohjelmoijille voit käyttää ristiinkääntämistä...

Ramdiskin luominen.

Nyt tarvitsemme initrd:n, johon on asennettu yksinkertainen kuori. Käytämme busyboxia, koska tämä söpöläinen osaa tehdä kaiken. Varastamme menetelmän Roberto de Leolta, Movixin luojalta (alaisin jopa kunnioittaa häntä, ellei uskomatonta rakkauttani Perliin olisi):

dd if=/dev/zero of=/dev/ram0 bs=1k count=5000 - Luo muistilevy tietokoneemme RAM-muistiin.
mke2fs -m0 /dev/ram0 5000 - Alusta Ramdisk Ext2-järjestelmässä
mkdir /distro - Luo kansio
liitä /dev/ram0 /distro - Liitä /distro-kansioon

Siinä kaikki, nyt meillä on Ramdisk, jonka kapasiteetti on 5 Mt. Enemmänkin on mahdollista, mutta ei välttämätöntä. Toisin kuin Thomas Matejisek, en aio täyttää initrd:tä LZMA-pakatuilla moduuleilla Squashfsissa. Kaikki tarvittava käännetään ytimen avulla. Kyllä, tämä ei ole kovin loogista ja oikein, mutta se on sata kertaa vähemmän vaivaa. Ja erityisesti niille, jotka tuomitsevat tämän lähestymistavan, voit ottaa käyttöön modulaarisuusvaihtoehdon ytimessä: Ota ladattavien moduulien tuki käyttöön.

Meidän Ramdiskissä, joka on asennettu /distroon, on tällainen kansio, joka on kadonnut + löydetty. Älä missään tapauksessa poista sitä, vaikka se ei todennäköisesti autakaan minun pitäisi asentaa busybox ensin...

Busyboxin asentaminen
Siksikö niin hienoilla projekteilla on niin paskat verkkosivustot? Vaikka... tämä ei ole enää tärkeää, jos lähteet ladataan ja puretaan onnistuneesti /busybox-kansioon.

Voit määrittää busyboxin samalla tavalla:

cd / busybox
tee menuconfig

Jos et vieläkään ymmärrä, mitä tämä on, selitän. Busybox korvaa useita UNIX-sovelluksia, jotka on tallennettu kansioihin /bin, /sbin, /usr/bin, /usr/sbin. Sen sijaan luodaan vain yksi sovellus: /bin/busybox, ja siihen luodaan joukko linkkejä yllä oleviin kansioihin. Asenna busybox seuraavalla komennolla:

asenna CONFIG_PREFIX=/distro

Busybox luo myös /sbin/init- ja jostain syystä /linuxrc-tiedostot, jotta järjestelmäsi käynnistyy oikein. Mutta kaikkia tarvittavia kansioita ei luotu. Joten viimeistelemme kaiken käsin ja luomme:

/distro/etc
/distro/lib
/distro/dev
/distro/mnt
distro/pros
/distro/root
/distro/tmp
/distro/root

Jos unohdit jotain, muista se, koska... Näitä hakemistoja on vaikea unohtaa.

Kaikki olisi hyvin, mutta busybox vaatii toimiakseen kirjastoja, jotka on kopioitava jakeluumme. On erittäin helppoa selvittää, mitkä:

ldd /distro/bin/busybox

Ohjelma näyttää meille shellillemme tarvittavat kirjastot. Sanon heti: linux gate on ydin luoma, eikä sitä voi kopioida.

Kun kopioit kirjastoja, voit katkaista virheenkorjaustiedot (kuten Roberto neuvoo):

objcopy --strip-debug mistä minne

Linuxin tekeminen Linuxista

Sinun on luotava useita järjestelmätekstitiedostoja:

Tarvitsemme /etc/inittab. Yllätän sinut: elämänsä alussa järjestelmä ei edes tiedä, mikä Root on. Meillä on jopa nimetön käyttäjä, mutta järjestelmän laajuisten matalan tason ominaisuuksien tiedosto (ONF) on oltava läsnä. Tiedoston pilottisisältö on seuraava:

# Ensimmäinen tiedosto, joka käynnistetään, /sbin/init sitten.
::sysinit:/etc/rc.d/rc.S

# Käynnistä komentotulkki konsolissa.
::respawn:-/bin/sh

# Komennot suoritettiin ennen sammutusta ja uudelleenkäynnistystä.
::shutdown:/sbin/swapoff -a >/dev/null 2>&1
::shutdown:/bin/umount -a -r >/dev/null 2>&1

Seuraava tiedosto on /etc/fstab. Tämä on taulukko, jossa kuvataan, mitä asennetaan ja mihin lastattaessa. Asia on turha! Meidän on asennettava proc, muuten mikään ei toimi ollenkaan, joten kirjoitamme tiedostoon:

none /proc proc oletusarvot 0 0

Liittämistä varten tarvitset myös /etc/mtab-tiedoston. Luo se ja jätä se tyhjäksi.

Mutta mount tekee kaiken tarvittavan vain, kun pyydämme sitä nimenomaisesti tekemään niin. Ja kysymme aivan ensimmäisessä käynnistystiedostossa /etc/rc.d/rc.S (rc.d - kansio). Kysymme kohteliaasti:

/bin/mount -av -t nonfs

Tarvitsemme myös profiilitiedoston (b)(a)sh, siinä on yleensä mielikuvituksen vapautta. Luo tiedosto /etc/profile ja täytä se seuraavilla:

PATH="$PATH:/bin:/sbin:/usr/bin:/usr/sbin:"
VÄHEMMÄN=-MM
TERM=linux
HOME=/juuri
PS1=">"
PS2=">"
ignoreeof=10
vienti PATH DISPLAY LESS TERM PS1 PS2 HOME ignoreeof

Tarvitset myös /etc/shell-tiedoston, joka osoittaa, että komentotulkki on olemassa:

/bin/sh
/bin/tuhka
/bin/bash

Siinä kaikki. Voit kirjoittaa muistilevymme tiedostoon.

mkdir /os - kansio "valmis".
umount /dev/ram0 - irrota pala RAM-muistia.
dd if=/dev/ram0 of=/os/initrd bs=1k count=5000 - luo tiedosto.
gzip /os/initrd - pakkaa initrd-tiedosto

Käynnistettävän USB-muistitikun luominen

Pienen kehityksemme "maaliviiva". Otamme flash-aseman, asetamme sen, alustamme sen vfat-muodossa (voit myös käyttää extiä, mutta älä unohda, että kaikki Windows-käyttäjät eivät ole ampuneet itseään).

Luo flash-asemaan kansio nimeltä boot, jossa on initrd- ja ydinkansiot.

Kopioi /os-kansiosta pakattu Ramdisk flash-aseman boot/initrd-kansioon, kutsu sitä "main.gz". Kopioi ytimen lähteet sisältävästä kansiosta bzImage flash-aseman käynnistys-/ydinkansioon, kutsu sitä nimellä main.lk. Saamme Syslinuxin käynnistyslataustiedostot (Internetistä tai toisesta jakelusta: sillä ei ole väliä), nimittäin syslinux.bin, syslinux.boot, syslinux.cfg. Kopioimme ne flash-asemamme juurihakemistoon. Syslinux.cfg-tiedostoon kirjoitetaan jotain tällaista:

oletus mm
kehote 1
aikakatkaisu 100
etiketti mm
kernel /boot/kernel/main.lk

etiketti mc
kernel /boot/kernel/main.lk

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

Näin ollen tuimme mukautettua initrd:tä ja ydintä, jotka voidaan kokeilun vuoksi yhdistää jakeluumme.

Selvitetään, mikä järjestelmässä oleva laite flash-asemamme on (voit suorittaa asennuksen ilman parametreja ja katsoa). Tämä on joko /dev/sdb1, /dev/sdc1 tai /dev/sdd1. Flash-asema kannattaa irrottaa ennen asennuksen aloittamista.

Asenna syslinux (jos paketti ei ole järjestelmässä, apt-get install syslinux):

syslinux -d polku_laitteeseen

Tiedoston ldlinux.sys pitäisi näkyä flash-aseman juurihakemistossa. Jos se on siellä, syslinux.bin, syslinux.boot ei enää tarvita.

En kerro sinulle, kuinka BIOS määritetään käynnistymään flash-asemalta - se on helppoa. Sanon vain, että on erittäin kätevää luoda kansio /boot/initrd/init, johon voit liittää /boot/initrd/main sen myöhempää käyttöä varten. Muista vain purkaa ja pakata se gzipillä.

OK, nyt kaikki on ohi.

Aivan kuin olisin juuri kertonut sinulle, kuinka Linux-järjestelmä luodaan tyhjästä. Helppoa, eikö? Seuraavaksi voit muokata /sbin/init-skriptiä, koska sinulla on vielä paljon työtä tehtävänä! Sinun on kirjoitettava komentosarja asentaaksesi flash-aseman, joka chrootsee sen juurihakemistoon. Muuten joudut työskentelemään 5 Mt:n ReadOnly-osion kanssa. Mutta se on täysin eri tarina.


Yksi parhaista tavoista säästää aikaa missä tahansa toiminnassa on luoda sille järjestelmä. Sen etuna on, että automatisoimalla ja optimoimalla työsi kasvat tuottavammaksi ja sinulla on enemmän aikaa muihin sinulle tärkeisiin tehtäviin.

Järjestelmä on menetelmä, menettely tai rutiini, joka on luotu suorittamaan toistuvaa toimintaa strategian avulla. Järjestelmien avulla voit hallita työtäsi ja elämääsi tehokkaammin.

Tässä on muutamia elämänalueita, joita varten voit luoda oman järjestelmän:

  • Systematisointi.
  • Systematisointi.
  • Blogin tehtävien systematisointi.
  • Kodin siivouksen systematisointi.
  • Aamu- ja iltarutiinien systematisointi.
  • Sähköpostin käsittelyn systematisointi.
  • Työtehtävien systematisointi.

Seuraavien viiden vaiheen avulla voit luoda oman järjestelmän melkein mitä tahansa toimintaa varten.

Tee inventaario

Aloita tunnistamalla toimet, joita teet säännöllisesti sekä kotona että töissä. Analysoi päivääsi ja katso kaikkia toimintoja, jotka muodostavat päivittäisen aikataulusi. Esimerkiksi: valmistautuminen töihin/kouluun aamulla, lasten valmistaminen kouluun, työmatkat, sähköposteihin ja puheluihin vastaaminen, raporttien kirjoittaminen, iltalenkillä käyminen, illallisen valmistaminen, blogikirjoituksen kirjoittaminen, kirjan markkinointi jne.

Siirry valitun kohteen tehtäväluetteloon ja kysy itseltäsi seuraavaa:

  • Miten teet sen nyt?
  • Tuntuuko sinusta tekeväsi sen mahdollisimman tehokkaasti?
  • Missä tuhlaat paljon aikaa?
  • Missä menetät rahaa?
  • Mitkä teot ärsyttävät sinua eniten?
  • Mitä ei tehdä tällä hetkellä niin nopeasti kuin mahdollista?
  • Mitä pitää optimoida?

Valitse järjestettäväksi yksi aktiviteetti varastosi perusteella.

Analysoi mitä teet tällä hetkellä

Suorita toiminnot, jotka haluat järjestää normaalisti (eli toimi normaalisti). Dokumentoi prosessi tallentamalla kaikki seuraavat tiedot:

  • Mitä toimenpiteitä olet tekemässä?
  • Mitä työkaluja käytät?
  • Missä ovat pullonkaulat (missä aikaa menee hukkaan, viiveitä esiintyy jatkuvasti, jokin menee pieleen)?
  • Mikä tuottaa sinulle pettymyksen?
  • Kuinka kauan tämän toiminnon suorittaminen kestää?
  • Paljonko se maksaa?
  • Mitä tuloksia saat?

Tarkista tämän jälkeen vastaanotettu asiakirja ja opi sitä.

Suunnittele uusi prosessi

Järjestelmä, kuten aiemmin totesimme, on prosessi, jonka luot tehtävien virtaviivaistamiseksi ja tehokkuuden lisäämiseksi. Tarkastele asiakirjaasi ja toimintaa, jonka haluat optimoida, ja kysy itseltäsi seuraavat kysymykset:

  • Millaisen tuloksen haluat saavuttaa tekemällä tätä toimintaa? Mitä tavoitetta yrität saavuttaa? Mikä on ihanteellinen tulos?
  • Ovatko kaikki tekemäsi vaiheet tarpeellisia? Voidaanko jotkin niistä poistaa?
  • Suoritatko vaiheet tehokkaimmassa järjestyksessä? Ovatko tulokset erilaiset, jos muuttaisit vaiheiden järjestystä?
  • Miten tämä kaikki voidaan tehdä nopeammin?
  • Voitko luoda tarkistuslistan, kaavion, ajatuskartan tai käsikirjoituksen tälle toiminnalle?
  • Onko mahdollista automatisoida jotkin vaiheet tai koko prosessi? Onko olemassa ohjelmaa, jota voidaan käyttää tähän?
  • Voidaanko jotkin vaiheet tai koko prosessi delegoida?
  • Tarvitseeko käyttämäsi työkalut päivittää?

Kirjoita nyt uusi järjestelmäsi muistiin ja luettele jokainen vaihe yksityiskohtaisesti.

Toteuta suunnitelma

Kun sinulla on suunnitelma, sinun on pantava se toimeen välittömästi. Saatat tarvita ensin apua muilta tai sinun on ehkä ostettava ohjelmistoja tai päivitystyökaluja.

On aika suorittaa prosessi ja testata sen toimintaa. Tee se ja kiinnitä huomiota tuloksiin. Kysy itseltäsi seuraavat kysymykset:

  • Saitko haluamasi tulokset?
  • Mikä toimii?
  • Mikä ei toimi?
  • Kuinka paljon olet säästänyt aikaa?
  • Kuinka paljon tämä kaikki maksaa? Onko järjestelmä tehokas tulosten perusteella?
  • Saavutatko tavoitteesi helpoimmalla tavalla?
  • Onko prosessissa aukkoja?
  • Onko prosessia mahdollista optimoida edelleen?

Tee tarvittavat säädöt ja muutokset. Päivitä järjestelmäsi, kunnes saat haluamasi tulokset.

Paranna järjestelmää jatkuvasti

Järjestelmää kannattaa seurata jatkuvasti, sillä nopeasti muuttuvassa maailmassa se voi vanhentua yhtä nopeasti. Kysy aina itseltäsi, tarvitaanko parannuksia.

  • Toimiiko järjestelmä niin kuin pitää?
  • Voitko vähentää järjestelmän kustannuksia?
  • Voitko tehdä järjestelmästä vielä tehokkaamman?
  • Voitko yksinkertaistaa järjestelmää saadaksesi parempia tuloksia?

Järjestelmän asentaminen vaatii aina aikaa. Mutta kun käytät aluksi enemmän kuin tavallisesti kulutat, säästät lopulta huomattavasti. Ja minimoi käyttöstressin vaikutukset.

Toivotamme sinulle onnea!

Tämä artikkelisarja on omistettu matalan tason ohjelmointiin, eli tietokonearkkitehtuuriin, käyttöjärjestelmien suunnitteluun, kokoonpanokieliohjelmointiin ja niihin liittyviin alueisiin. Toistaiseksi kaksi habrauseria kirjoittaa - iley ja pehat. Monille lukiolaisille, opiskelijoille ja jopa ammattiohjelmoijille nämä aiheet osoittautuvat erittäin vaikeiksi oppia. Matalan tason ohjelmointiin on omistettu paljon kirjallisuutta ja kursseja, mutta täydellisen ja kaiken kattavan kuvan saaminen on vaikeaa. On vaikeaa luettuaan yhden tai kaksi assembly-kieltä ja käyttöjärjestelmiä käsittelevää kirjaa, ainakin yleisellä tasolla kuvitella, kuinka tämä monimutkainen raudasta, piistä ja monista ohjelmista koostuva järjestelmä - tietokone - todella toimii.

Jokainen ratkaisee oppimisongelman omalla tavallaan. Jotkut ihmiset lukevat paljon kirjallisuutta, jotkut yrittävät siirtyä nopeasti harjoittelemaan ja ottamaan selvää siitä edetessään, jotkut yrittävät selittää ystävilleen kaiken, mitä he opiskelevat. Ja päätimme yhdistää nämä lähestymistavat. Joten tässä artikkelien kurssissa osoitamme askel askeleelta kuinka kirjoittaa yksinkertainen käyttöjärjestelmä. Artikkelit ovat luonteeltaan katsastusluonteisia, eli ne eivät sisällä tyhjentävää teoreettista tietoa, vaan pyrimme aina tarjoamaan linkkejä hyviin teoreettisiin aineistoihin ja vastaamaan kaikkiin esille tuleviin kysymyksiin. Meillä ei ole selkeää suunnitelmaa, joten monia tärkeitä päätöksiä tehdään matkan varrella palautteesi huomioiden.

Saatamme tarkoituksella estää kehitysprosessia, jotta sinä ja itsemme voisimme ymmärtää täysin huonon päätöksen seuraukset sekä hioa siihen liittyviä teknisiä taitoja. Joten sinun ei pitäisi nähdä päätöksiämme ainoina oikeina ja uskoa meihin sokeasti. Korostetaan vielä kerran, että odotamme lukijoiden aktiivisuutta artikkeleista keskustelemassa, minkä pitäisi vaikuttaa suuresti seuraavien artikkeleiden kehittämis- ja kirjoitusprosessiin. Ihannetapauksessa haluaisin ajan myötä joidenkin lukijoiden osallistuvan järjestelmän kehittämiseen.

Oletetaan, että lukija tuntee jo assembly- ja C-kielten perusteet sekä tietokonearkkitehtuurin alkeiskäsitteet. Eli emme selitä, mikä rekisteri tai esimerkiksi RAM on. Jos sinulla ei ole tarpeeksi tietoa, voit aina kääntyä lisäkirjallisuuden puoleen. Lyhyt luettelo viittauksista ja linkkejä sivustoille, joilla on hyviä artikkeleita, on artikkelin lopussa. On myös suositeltavaa osata käyttää Linuxia, koska kaikki käännösohjeet annetaan erityisesti tätä järjestelmää varten.

Ja nyt - lähempänä asiaa. Artikkelin loppuosassa kirjoitamme klassisen "Hello World" -ohjelman. Helloworld on hieman täsmällinen. Sitä ei käynnistetä mistään käyttöjärjestelmästä, vaan suoraan niin sanotusti "paljaalle metallille". Ennen kuin aloitamme koodin kirjoittamisen, selvitetään tarkasti, kuinka yritämme tehdä tämän. Ja tätä varten meidän on harkittava tietokoneen käynnistysprosessia.

Joten ota suosikkitietokoneesi ja paina järjestelmäyksikön suurinta painiketta. Näemme iloisen näytönsäästäjän, järjestelmäyksikkö piippaa iloisesti kaiuttimellaan ja jonkin ajan kuluttua käyttöjärjestelmä latautuu. Kuten ymmärrät, käyttöjärjestelmä on tallennettu kiintolevylle, ja tässä herää kysymys: kuinka käyttöjärjestelmä latautui maagisesti RAM-muistiin ja aloitti suorittamisen?

Tiedä tämä: missä tahansa tietokoneessa oleva järjestelmä on vastuussa tästä, ja sen nimi - ei, ei Windows, käännä kieltäsi - sitä kutsutaan BIOSiksi. Sen nimi tulee sanoista Basic Input-Output System, eli perustulo-lähtöjärjestelmä. BIOS sijaitsee emolevyn pienellä sirulla ja käynnistyy heti suuren ON-painikkeen painamisen jälkeen. BIOSilla on kolme päätehtävää:

  1. Tunnista kaikki kytketyt laitteet (prosessori, näppäimistö, näyttö, RAM, näytönohjain, pää, kädet, siivet, jalat ja hännän...) ja tarkista niiden toiminta. POST (Power On Self Test) -ohjelma on vastuussa tästä. Jos elintärkeää laitteistoa ei havaita, mikään ohjelmisto ei voi auttaa, ja tässä vaiheessa järjestelmän kaiutin narisee jotain pahaenteistä ja käyttöjärjestelmä ei pääse asiaan ollenkaan. Älkäämme puhuko surullisista asioista, oletetaan, että meillä on täysin toimiva tietokone, iloitse ja siirry toisen BIOS-toiminnon pohtimiseen:
  2. Käyttöjärjestelmälle tarjotaan perustoimintoja laitteiston kanssa työskentelyä varten. Esimerkiksi BIOS-toimintojen kautta voit näyttää tekstiä näytöllä tai lukea tietoja näppäimistöltä. Siksi sitä kutsutaan perustulo/lähtöjärjestelmäksi. Tyypillisesti käyttöjärjestelmä käyttää näitä toimintoja keskeytysten kautta.
  3. Käyttöjärjestelmän latausohjelman käynnistäminen. Tässä tapauksessa yleensä luetaan käynnistyssektori - tallennusvälineen ensimmäinen sektori (levyke, kiintolevy, CD, flash-asema). Mediapollausjärjestys voidaan asettaa BIOS SETUPissa. Käynnistyssektori sisältää ohjelman, jota joskus kutsutaan ensisijaiseksi käynnistyslataimeksi. Karkeasti sanottuna käynnistyslataimen tehtävänä on käynnistää käyttöjärjestelmä. Käyttöjärjestelmän latausprosessi voi olla hyvin spesifinen ja riippuvainen suuresti sen ominaisuuksista. Siksi käyttöjärjestelmän kehittäjät kirjoittavat ensisijaisen käynnistyslataimen suoraan, ja se kirjoitetaan käynnistyssektoriin asennuksen aikana. Kun käynnistyslatain käynnistyy, prosessori on reaalitilassa.
Surullinen uutinen on, että käynnistyslataimen tulisi olla vain 512 tavua kooltaan. Miksi niin vähän? Tätä varten meidän on tutustuttava levykkeen rakenteeseen. Tässä informatiivinen kuva:

Kuvassa on levyaseman pinta. Levykkeellä on 2 pintaa. Jokaisella pinnalla on renkaan muotoisia polkuja (raitoja). Jokainen raita on jaettu pieniin kaaren muotoisiin osiin, joita kutsutaan sektoreiksi. Joten historiallisesti levykesektorin koko on 512 tavua. BIOS lukee levyn ensimmäisen sektorin, käynnistyssektorin, nollamuistisegmenttiin 0x7C00, ja sitten ohjaus siirretään tähän osoitteeseen. Käynnistyslatain ei yleensä lataa itse käyttöjärjestelmää, vaan toista käynnistyslatausohjelmaa tallennettu levylle, mutta jostain syystä (todennäköisimmin tämä syy on koko) ei sovi yhteen sektoriin Ja koska käyttöjärjestelmämme roolia esittää toistaiseksi banaali Helloworld, päätavoitteemme on tehdä tietokoneesta. usko käyttöjärjestelmämme olemassaoloon, vaikka vain yhdellä sektorilla, ja käynnistä se.

Miten käynnistyssektori on rakennettu? PC:ssä käynnistyssektorin ainoa vaatimus on, että sen kaksi viimeistä tavua sisältävät arvot 0x55 ja 0xAA - käynnistyssektorin allekirjoitus. Joten on jo enemmän tai vähemmän selvää, mitä meidän on tehtävä. Kirjoitetaan koodi! Annettu koodi on kirjoitettu yasm-asentajaa varten.

osio. teksti

käyttö 16

org 0x7C00 ; ohjelmamme on ladattu osoitteeseen 0x7C00

alkaa:

mov ax , cs

mov ds, ax ; valitse datasegmentti



mov si , viesti

cld ; merkkijonokomentojen suunta

mov ah, 0x0E ; BIOS-ominaisuuden numero

mov bh , 0x00 ; videomuistisivu

puts_loop:

lodsb ; lataa seuraava symboli kohtaan al

testi al, al ; tyhjä merkki tarkoittaa rivin loppua

jz puts_loop_exit

int 0x10 ; kutsu BIOS-toiminto

jmp puts_loop

puts_loop_exit:

jmp$; ikuinen kierto



viesti:

db "Hei maailma!" , 0

suorittaa loppuun:

kertaa 0x1FE - maali + aloitus db 0

db 0x55, 0xAA ; käynnistyssektorin allekirjoitus

Tämä lyhyt ohjelma vaatii joitakin tärkeitä selityksiä. Rivi org 0x7C00 tarvitaan, jotta assembler (eli ohjelmaa, ei kieltä) laskee oikein tarrojen ja muuttujien osoitteet (puts_loop, puts_loop_exit, message). Joten ilmoitamme hänelle, että ohjelma ladataan muistiin osoitteessa 0x7C00.
Linjoissa
mov ax, cs

mov ds, ax
datasegmentti (ds) on sama kuin koodisegmentti (cs), koska ohjelmassamme sekä data että koodi on tallennettu samaan segmenttiin.

Seuraavaksi silmukassa näkyy viesti "Hei maailma!" Tätä tarkoitusta varten käytetään keskeytyksen 0x10 funktiota 0x0E. Siinä on seuraavat parametrit:
AH = 0x0E (funktion numero)
BH = videon sivunumero (älä vielä vaivaudu, merkitse 0)
AL = ASCII-merkkikoodi

Rivillä "jmp$" ohjelma pysähtyy. Ja aivan oikein, sen ei tarvitse suorittaa ylimääräistä koodia. Jotta tietokone kuitenkin toimisi uudelleen, sinun on käynnistettävä uudelleen.

Rivillä “times 0x1FE-finish+start db 0” muu ohjelmakoodi (lukuun ottamatta kahta viimeistä tavua) täytetään nolilla. Tämä tehdään niin, että kääntämisen jälkeen ohjelman kaksi viimeistä tavua sisältävät käynnistyssektorin allekirjoituksen.

Olemme ilmeisesti selvittäneet ohjelmakoodin, yritetään nyt koota tämä onnellisuus. Kokoamista varten tarvitsemme tarkasti ottaen kokoonpanijan - edellä mainitun

Tämä artikkelisarja on omistettu matalan tason ohjelmointiin, eli tietokonearkkitehtuuriin, käyttöjärjestelmien suunnitteluun, kokoonpanokieliohjelmointiin ja niihin liittyviin alueisiin. Tähän mennessä kaksi habrauseria kirjoittaa - ja . Monille lukiolaisille, opiskelijoille ja jopa ammattiohjelmoijille nämä aiheet osoittautuvat erittäin vaikeiksi oppia. Matalan tason ohjelmointiin on omistettu paljon kirjallisuutta ja kursseja, mutta täydellisen ja kaiken kattavan kuvan saaminen on vaikeaa. On vaikeaa luettuaan yhden tai kaksi assembly-kieltä ja käyttöjärjestelmiä käsittelevää kirjaa, ainakin yleisellä tasolla kuvitella, kuinka tämä monimutkainen raudasta, piistä ja monista ohjelmista koostuva järjestelmä - tietokone - todella toimii.

Jokainen ratkaisee oppimisongelman omalla tavallaan. Jotkut ihmiset lukevat paljon kirjallisuutta, jotkut yrittävät siirtyä nopeasti harjoittelemaan ja ottamaan selvää siitä edetessään, jotkut yrittävät selittää ystävilleen kaiken, mitä he opiskelevat. Ja päätimme yhdistää nämä lähestymistavat. Joten tässä artikkelien kurssissa osoitamme askel askeleelta kuinka kirjoittaa yksinkertainen käyttöjärjestelmä. Artikkelit ovat luonteeltaan katsastusluonteisia, eli ne eivät sisällä tyhjentävää teoreettista tietoa, vaan pyrimme aina tarjoamaan linkkejä hyviin teoreettisiin aineistoihin ja vastaamaan kaikkiin esille tuleviin kysymyksiin. Meillä ei ole selkeää suunnitelmaa, joten monia tärkeitä päätöksiä tehdään matkan varrella palautteesi huomioiden.

Saatamme tarkoituksella estää kehitysprosessia, jotta sinä ja itsemme voisimme ymmärtää täysin huonon päätöksen seuraukset sekä hioa siihen liittyviä teknisiä taitoja. Joten sinun ei pitäisi nähdä päätöksiämme ainoina oikeina ja uskoa meihin sokeasti. Korostetaan vielä kerran, että odotamme lukijoiden aktiivisuutta artikkeleista keskustelemassa, minkä pitäisi vaikuttaa suuresti seuraavien artikkeleiden kehittämis- ja kirjoitusprosessiin. Ihannetapauksessa haluaisin ajan myötä joidenkin lukijoiden osallistuvan järjestelmän kehittämiseen.

Oletetaan, että lukija tuntee jo assembly- ja C-kielten perusteet sekä tietokonearkkitehtuurin alkeiskäsitteet. Eli emme selitä, mikä rekisteri tai esimerkiksi RAM on. Jos sinulla ei ole tarpeeksi tietoa, voit aina kääntyä lisäkirjallisuuden puoleen. Lyhyt luettelo viittauksista ja linkkejä sivustoille, joilla on hyviä artikkeleita, on artikkelin lopussa. On myös suositeltavaa osata käyttää Linuxia, koska kaikki käännösohjeet annetaan erityisesti tätä järjestelmää varten.

Ja nyt - lähempänä asiaa. Artikkelin loppuosassa kirjoitamme klassisen "Hello World" -ohjelman. Helloworld on hieman täsmällinen. Sitä ei käynnistetä mistään käyttöjärjestelmästä, vaan suoraan niin sanotusti "paljaalle metallille". Ennen kuin aloitamme koodin kirjoittamisen, selvitetään tarkasti, kuinka yritämme tehdä tämän. Ja tätä varten meidän on harkittava tietokoneen käynnistysprosessia.

Joten ota suosikkitietokoneesi ja paina järjestelmäyksikön suurinta painiketta. Näemme iloisen näytönsäästäjän, järjestelmäyksikkö piippaa iloisesti kaiuttimellaan ja jonkin ajan kuluttua käyttöjärjestelmä latautuu. Kuten ymmärrät, käyttöjärjestelmä on tallennettu kiintolevylle, ja tässä herää kysymys: kuinka käyttöjärjestelmä latautui maagisesti RAM-muistiin ja aloitti suorittamisen?

Tiedä tämä: missä tahansa tietokoneessa oleva järjestelmä on vastuussa tästä, ja sen nimi - ei, ei Windows, käännä kieltäsi - sitä kutsutaan BIOSiksi. Sen nimi tulee sanoista Basic Input-Output System, eli perustulo-lähtöjärjestelmä. BIOS sijaitsee emolevyn pienellä sirulla ja käynnistyy heti suuren ON-painikkeen painamisen jälkeen. BIOSilla on kolme päätehtävää:

  1. Tunnista kaikki kytketyt laitteet (prosessori, näppäimistö, näyttö, RAM, näytönohjain, pää, kädet, siivet, jalat ja hännän...) ja tarkista niiden toiminta. POST (Power On Self Test) -ohjelma on vastuussa tästä. Jos elintärkeää laitteistoa ei havaita, mikään ohjelmisto ei voi auttaa, ja tässä vaiheessa järjestelmän kaiutin narisee jotain pahaenteistä ja käyttöjärjestelmä ei pääse asiaan ollenkaan. Älkäämme puhuko surullisista asioista, oletetaan, että meillä on täysin toimiva tietokone, iloitse ja siirry toisen BIOS-toiminnon pohtimiseen:
  2. Käyttöjärjestelmälle tarjotaan perustoimintoja laitteiston kanssa työskentelyä varten. Esimerkiksi BIOS-toimintojen kautta voit näyttää tekstiä näytöllä tai lukea tietoja näppäimistöltä. Siksi sitä kutsutaan perustulo/lähtöjärjestelmäksi. Tyypillisesti käyttöjärjestelmä käyttää näitä toimintoja keskeytysten kautta.
  3. Käyttöjärjestelmän latausohjelman käynnistäminen. Tässä tapauksessa yleensä luetaan käynnistyssektori - tallennusvälineen ensimmäinen sektori (levyke, kiintolevy, CD, flash-asema). Mediapollausjärjestys voidaan asettaa BIOS SETUPissa. Käynnistyssektori sisältää ohjelman, jota joskus kutsutaan ensisijaiseksi käynnistyslataimeksi. Karkeasti sanottuna käynnistyslataimen tehtävänä on käynnistää käyttöjärjestelmä. Käyttöjärjestelmän latausprosessi voi olla hyvin spesifinen ja riippuvainen suuresti sen ominaisuuksista. Siksi käyttöjärjestelmän kehittäjät kirjoittavat ensisijaisen käynnistyslataimen suoraan, ja se kirjoitetaan käynnistyssektoriin asennuksen aikana. Kun käynnistyslatain käynnistyy, prosessori on reaalitilassa.
Surullinen uutinen on, että käynnistyslataimen tulisi olla vain 512 tavua kooltaan. Miksi niin vähän? Tätä varten meidän on tutustuttava levykkeen rakenteeseen. Tässä informatiivinen kuva:

Kuvassa on levyaseman pinta. Levykkeellä on 2 pintaa. Jokaisella pinnalla on renkaan muotoisia polkuja (raitoja). Jokainen raita on jaettu pieniin kaaren muotoisiin osiin, joita kutsutaan sektoreiksi. Joten historiallisesti levykesektorin koko on 512 tavua. BIOS lukee levyn ensimmäisen sektorin, käynnistyssektorin, nollamuistisegmenttiin 0x7C00, ja sitten ohjaus siirretään tähän osoitteeseen. Käynnistyslatain ei yleensä lataa itse käyttöjärjestelmää, vaan toista käynnistyslatausohjelmaa tallennettu levylle, mutta jostain syystä (todennäköisimmin tämä syy on koko) ei sovi yhteen sektoriin Ja koska käyttöjärjestelmämme roolia esittää toistaiseksi banaali Helloworld, päätavoitteemme on tehdä tietokoneesta. usko käyttöjärjestelmämme olemassaoloon, vaikka vain yhdellä sektorilla, ja käynnistä se.

Miten käynnistyssektori on rakennettu? PC:ssä käynnistyssektorin ainoa vaatimus on, että sen kaksi viimeistä tavua sisältävät arvot 0x55 ja 0xAA - käynnistyssektorin allekirjoitus. Joten on jo enemmän tai vähemmän selvää, mitä meidän on tehtävä. Kirjoitetaan koodi! Annettu koodi on kirjoitettu yasm-asentajaa varten.

osio. teksti

käyttö 16

org 0x7C00 ; ohjelmamme on ladattu osoitteeseen 0x7C00

alkaa:

mov ax , cs

mov ds, ax ; valitse datasegmentti



mov si , viesti

cld ; merkkijonokomentojen suunta

mov ah, 0x0E ; BIOS-ominaisuuden numero

mov bh , 0x00 ; videomuistisivu

puts_loop:

lodsb ; lataa seuraava symboli kohtaan al

testi al, al ; tyhjä merkki tarkoittaa rivin loppua

jz puts_loop_exit

int 0x10 ; kutsu BIOS-toiminto

jmp puts_loop

puts_loop_exit:

jmp$; ikuinen kierto



viesti:

db "Hei maailma!" , 0

suorittaa loppuun:

kertaa 0x1FE - maali + aloitus db 0

db 0x55, 0xAA ; käynnistyssektorin allekirjoitus

Tämä lyhyt ohjelma vaatii joitakin tärkeitä selityksiä. Rivi org 0x7C00 tarvitaan, jotta assembler (eli ohjelmaa, ei kieltä) laskee oikein tarrojen ja muuttujien osoitteet (puts_loop, puts_loop_exit, message). Joten ilmoitamme hänelle, että ohjelma ladataan muistiin osoitteessa 0x7C00.
Linjoissa
mov ax, cs

mov ds, ax
datasegmentti (ds) on sama kuin koodisegmentti (cs), koska ohjelmassamme sekä data että koodi on tallennettu samaan segmenttiin.

Seuraavaksi silmukassa näkyy viesti "Hei maailma!" Tätä tarkoitusta varten käytetään keskeytyksen 0x10 funktiota 0x0E. Siinä on seuraavat parametrit:
AH = 0x0E (funktion numero)
BH = videon sivunumero (älä vielä vaivaudu, merkitse 0)
AL = ASCII-merkkikoodi

Rivillä "jmp$" ohjelma pysähtyy. Ja aivan oikein, sen ei tarvitse suorittaa ylimääräistä koodia. Jotta tietokone kuitenkin toimisi uudelleen, sinun on käynnistettävä uudelleen.

Rivillä “times 0x1FE-finish+start db 0” muu ohjelmakoodi (lukuun ottamatta kahta viimeistä tavua) täytetään nolilla. Tämä tehdään niin, että kääntämisen jälkeen ohjelman kaksi viimeistä tavua sisältävät käynnistyssektorin allekirjoituksen.

Olemme ilmeisesti selvittäneet ohjelmakoodin, yritetään nyt koota tämä onnellisuus. Kokoamista varten tarvitsemme tarkasti ottaen kokoonpanijan - edellä mainitun

Kirja "The Operating System from 0 to 1" on julkaistu GitHubissa, ja siinä on yli 2000 tähteä ja 100 haarukkaa. Kuten nimestä voi päätellä, sen lukemisen jälkeen voit luoda oman käyttöjärjestelmän - ja ehkä muutama asia ohjelmoijien maailmassa voisi olla siistimpää.

Tämän kirjan avulla opit seuraavat asiat:

  • Opit luomaan käyttöjärjestelmän laitteiston teknisen dokumentaation perusteella. Näin se toimii todellisessa maailmassa, et voi käyttää Googlea nopeisiin kysymyksiin.
  • Ymmärrät kuinka tietokoneen komponentit ovat vuorovaikutuksessa toistensa kanssa ohjelmistosta laitteistoon.
  • Opi kirjoittamaan koodi itse. Koodin sokea kopioiminen ei ole oppimista, vaan itse asiassa opit ratkaisemaan ongelmia. Muuten, sokea kopiointi on myös vaarallista.
  • Hallitse tutut työkalut matalan tason kehittämiseen.
  • Tutustu assembly-kieleen.
  • Ota selvää, mistä ohjelmista on tehty ja miten käyttöjärjestelmä ajaa niitä. Annoimme aiheesta lyhyen yleiskatsauksen uteliaille vuonna .
  • Saat selville, kuinka voit korjata ohjelman virheenkorjauksen suoraan laitteistolla GDB:n ja QEMU:n avulla.
  • C-ohjelmointikieli Voit hallita sen nopeasti seuraamalla.
  • Linuxin perustiedot. Opiskele vain verkkosivuillamme.
  • Fysiikan perustiedot: atomit, elektronit, protonit, neutronit, jännite.
  • Ohmin laki jännitteen, virran ja vastuksen välisestä suhteesta.

Kirjaa parannetaan ja muokataan lähes päivittäin: voit itse tehdä muutoksia tai korjata kirjoitusvirheen. Käyttöjärjestelmä, jonka kehitys toimi tämän kirjan "juonena",