• Vytváříme vlastní OS založený na Linuxu. Jak vytvořit svůj vlastní operační systém od začátku

    Ilja Alexandrov

    Vytváříme si vlastní OS na Na bázi Linuxu

    Existují stovky distribucí Linuxu a není známo, kolik dalších se objeví. Desítky společností a tisíce programátorů soutěží o vytvoření nejlepšího linuxového projektu, a přesto jakéhokoli zkušený uživatel se může stát autorem domácího PC systému, který není horší než produkty gigantů IT průmyslu.

    Za léta práce s Linuxem jsem použil obrovské množství různých distribucí: Mandriva, Fedora, SlackWare, Debian, Ubuntu a mnoho dalších. Některé projekty se mi líbily více, některé méně. Ale ve všech distribucích se člověk nevyhnutelně musel vypořádat s vážnými nedostatky, které velmi ztěžovaly práci. Jeden je příliš náročný na zdroje, druhý nepodporuje vše potřebné vybavení, třetí postrádá různý software. Tehdy jsem si vzpomněl na známou východní moudrost: když něco potřebuješ udělat dobře, udělej to sám.

    Linux od nuly

    Nejsem sám, kdo se rozhodl začít budovat vlastní verzi Linuxu – OS, ve kterém se za základ bude brát základní část systému a jádro, ale kde nebude ani kilobajt navíc vývojáře, tedy od vás. Velký počet Linuxové distribuce, které nesplňují požadavky uživatelů, přiměly Gerarda Beekmanse k vytvoření distribuční sady, která každému umožní postavit systém pouze s komponentami a funkcemi, které potřebuje.

    Touha talentovaného programátora vyústila v projekt Linux from Scratch (www.linuxfromscratch.org), zkráceně LFS. Tento projekt vám umožňuje sestavit od začátku, ze zdrojových kódů, váš operační systém založený na Linuxu. Kompilace LFS probíhá na počítači s již nainstalovaným systémem Linux, vhodné je však i „pokročilé“ Live-CD, např. Knoppix.

    Současně může být systém Linux použitý pro sestavení jakýkoli - pouze přítomnost kompilátoru a systémové knihovny. Linux From Scratch lze jen stěží nazvat distribucí v obvyklém slova smyslu – je to něco jako pomocný software, který vám spolu se základní částí operačního systému umožní vytvořit si vlastní, unikátní verzi OS.

    Jak víte, Linus Torvalds vyvíjel svůj operační systém pod heslem "Just for fun!" - tedy jen tak pro zábavu. Nutno přiznat, že LFS se na serverech opravdu často nenachází, zpravidla tento systém využívají počítačoví nadšenci. Instalace a práce s Linuxem od nuly vám pomůže pochopit vztah mezi komponentami OS, což je užitečné pro váš vlastní vývoj linuxové distribuce, a to nejen založené na LFS. Proto je LFS z velké části určen pro ty lidi, pro které je proces budování vlastní distribuce vzrušující a zajímavý – a věřte, že takových lidí je spousta.

    Pokud jste tedy připraveni strávit celý den (nebo i více) návrhem systému, pak doporučuji stáhnout si z webu (2) LFS-packages-6.0, LFS-book a pokračovat ve čtení tohoto článku.

    Rozdělení disku a vytvoření stromu adresářů

    Pro lepší pochopení materiálu popisujeme celý průběh procesu obecně (viz obr. 1).

    V první fázi se disk rozbije pomocí již nainstalované distribuční sady nebo LiveCD. Na pevném disku je přidělen oddíl pro nový systém. Poté na tomto oddílu budete muset staticky zkompilovat všechny potřebné programy a systémové jádro. Dále se kořenový adresář změní na oddíl pevný disk přiděleno našemu novému OS. Budete muset kompilaci opakovat, ale tentokrát musí být software sestavován dynamicky (rozdíl mezi dynamickou a statickou kompilací bude popsán níže). Poslední krok zahrnuje vytvoření kritické knihovny glibc a konfiguraci nainstalovaného OS. Jak vidíte, nemusíte dělat nic zvlášť obtížného.

    Během celého procesu je vaším hlavním pomocníkem dokumentace z balíčku LFS-book, jejíž ruský překlad najdete zde: http://multilinux.sakh.com/download/lfsbook.tar.bz2 . Kniha podrobně popisuje každý krok vytváření operačního systému, takže pokud narazíte na problémy, nezapomeňte se podívat na tuto příručku (tento článek nemá nahradit tak rozsáhlou dokumentaci).

    tvoříme nová sekce- v mém případě je to /dev/hda5, protože oddíl /dev/hda1 je již obsazen nainstalovaným na HDD Linux Slackware. Doporučuje se, abyste si nejprve vytvořili zálohu systému, abyste jej mohli v případě poškození obnovit, i když pravděpodobnost se blíží nule. A tady je, myslím, vše jasné: pro kořenový adresář přidělíme požadované množství (stačí 23 GB), prostor rovný dvojnásobku množství RAM pro swapovací oddíl, pokud si přejete, můžete vytvořit samostatné oddíly pro domovský adresář (/ home) a pro / boot. Mnohými oblíbená možnost rozdělení - alokace veškerého dostupného místa mínus swap do kořenového adresáře a následné vytvoření skutečného swapu - je však také docela přijatelná při sestavování LFS. Na autorově počítači Linux Slackware, což je nadřazený OS, i LFS používají stejný pevný disk, nicméně instalace LFS na jiný pevný disk také není obtížná.

    Vyberte souborový systém podle svého uvážení: nebyly žádné problémy s Ext3 a ReiserFS pod LFS. Fanoušci XFS ale budou muset být zklamáni – pokusy o to, aby Linux From Scratch fungoval s tímto FS, nebyly úspěšné.

    Nyní připojíme oddíl vyhrazený pro nový OS:

    $ mount /dev/hda5 /mnt/mylin

    Pro usnadnění si definujme proměnnou MYLIN:

    $ export MYLIN=/mnt/mylin

    Skvělé, pro další práci je lepší tvořit individuální uživatel mylin, kterému přidělíme vlastníka připojeného oddílu.

    $ useradd mylin

    $ chown -R mylin $MYLIN

    Musíte vytvořit strom adresářů v kořenovém adresáři nového oddílu:

    $ cd $MYLIN

    $ mkdir –p bin boot dev etc home lib mnt opt ​​​​root sbin usr/(X11R6,local) var

    V adresářích usr, usr/X11R6, usr/local vytvoříme potřebnou strukturu: podadresáře bin, etc, include, lib, sbin, share, src.

    Poté uděláme totéž pro adresáře /var a /opt budoucí systém:

    $ mkdir var/(cache,lib,local,lock,log,opt,run,spool)

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

    Nezapomínejme, že existují hlubší hierarchie, jako je /usr/share/man/man1. Objem článku však neumožňuje uvést zde všechny informace o struktuře stromu souborů, takže buď musíte použít dokument Filesystem Hierarchy Standard (dostupný na: http://linux-ve.net/MyLDP/ file-sys/fhs-2.2-rus) nebo si pečlivě prostudujte strukturu OS rodiny Linux, kterou již máte nainstalovanou. Po Těžké trénování disku, přistoupíme ke statické montáži.

    Statická montáž

    Proč používáme statickou montáž? Při statické kompilaci je zdrojový kód knihovny připojen ke kódu aplikace, což vede ke zvětšení její velikosti, ale zároveň je zachována integrita. Při dynamické kompilaci je knihovna umístěna v samostatný soubor A, ke kterému mají aplikace přístup podle potřeby. Díky tomu všechny programy pracují s jednou verzí knihovny

    Když ale pomocí příkazu chroot nastavíme kořenový adresář pro nově sestavený systém, knihovny „nadřazeného“, nainstalovaného systému, umístěné v /lib, /usr/lib a další, již nebudou dostupné, takže dynamicky zkompilované programy odmítnou fungovat, navíc kompatibilitu verzí nikdo nezaručuje.

    Abyste tomu zabránili, vše, co potřebujete software pro náš budoucí systém jej nejprve zkompilujeme staticky. Začněme snad příkazový interpret bash. (Fanoušci ZSH nebo TCSH si mohou po instalaci systému nainstalovat své oblíbené interprety, ale jejich použití ve fázi budování není autorem LFS zamýšleno). Měli byste zkontrolovat, zda máte soubor /usr/lib/libcurses.a, a pokud ne, nainstalovat balíček ncursesdev. Všechny balíčky musí být sestaveny se statickými příznaky sestavení: "--enable-static-link", "--disable-shared" nebo "--static". Která každému vyhovuje konkrétní případ, lze nalézt v dokumentaci ke konkrétnímu balíčku nebo z výstupu konfiguračního skriptu spuštěného s volbou "--help".

    $ ./configure --help

    Aby nedošlo k záměně později staticky kompilovaných programů s "dynamickými" programy, vytvoříme pro ně speciální adresář:

    $ mkdir $MYLIN/stat

    Při sestavování a instalaci balíčků nezapomeňte přidat parametr "--prefix=$MYLIN/stat" pro přesun souborů do tohoto adresáře. A nakonec nainstalujte bash:

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

    $make

    $ provést instalaci

    Stejným způsobem sbíráme i zbytek potřebných balíčků. : binutils, bzip2, textutils, texinfo, tar, sh-utils, gcc, grep, gzip, gawk, diffutils, fileutils, make, patch, sed, a ve skutečnosti linux-kernel.

    Ano, při kompilaci jádra nezapomeňte, že pro starší verze jádra (2.2.x-2.4.x) je potřeba použít gcc 2.95 a pro aktuální verzi 2.6.x se doporučuje použít gcc 3.x, aby nejsou žádné problémy.

    Nezapomeňte se podívat do příslušných sekcí knihy LFS, říká o této a mnoha dalších nuancích. Obecně se kompilace jádra v LFS neliší od podobného postupu, který se provádí při použití distribuční sady nainstalované na HDD. Rozbalte zdrojový kód jádra do $MYLIN/usr/src/linux-2.6.xx a poté jej nakonfigurujte spuštěním:

    $ make menuconfig

    Proces konfigurace parametrů jádra byl na internetu mnohokrát popsán (6), není třeba se tím zabývat podrobněji. Dále zadáme do zdrojové složky jádra Linuxu následující příkazy:

    $ make bzImage

    $ vytvořit moduly

    Vše na $MYLIN/usr/src/linux-2.6.xx/arch/i386/boot/bzImage je nové jádro.

    Dále vytvoříme $MYLIN/etc/passwd a $MYLIN/etc/group. V prvním registrujeme zatím jediného uživatele - root s libovolným heslem a ve druhém skupiny uživatelů (pro začátek s jednou root skupinou bude také stačit).

    Tím jsou naše přípravy na další krok dokončeny a přecházíme k jemnější dynamické montáži.

    Dynamická sestava

    Nyní je potřeba změnit kořenový adresář na /mnt/mylin, kde budeme používat pouze staticky zkompilované utility – již se nebudeme moci uchýlit k pomoci nástrojů z „rodičovského“ OS. V konzoli zadáme příkaz:

    $ 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 --přihlášení

    Pomocí tohoto příkazu jsme zadali cesty ke spustitelným souborům, typ terminálu, interpret a typ příkazového řádku.

    Aby některé programy fungovaly, musíte na nový systém nainstalovat souborový systém proc.

    $ mount proc /proc -t proc

    Nastal nejdůležitější okamžik. Budování knihovny glibc. Je nejzodpovědnější, protože většina lidí pracuje bez ní. potřebné programy nebude a nemá smysl používat Linux bez základní knihovny. Budování glibc na druhou stranu často způsobuje spoustu problémů.

    Při sestavování jsme zadali parametr „--prefix=$MYLIN/stat“, takže při změně kořenového adresáře budou všechny staticky sestavené balíčky v adresáři /stat nového oddílu OS.

    Rozbalte tedy archiv glibc-2.x.x.tar.gz (například do adresáře /usr/src/) a přejděte do adresáře glibclinuxthreads. Budeme muset trochu upravit zdrojový kód, protože tuto fázi v systému není možné identifikovat uživatele podle jména (právě kvůli nedostatku glibc a dalších knihoven) a skutečnost, že instalace glibc vyžaduje interpret Perl, který nemáme.

    Uživatelské jméno root v login/Makefile nahradíme jeho uid, tedy 0, a proměnná $PERL v malloc/Makefile by měla být nahrazena cestou k interpretu - /usr/bin/perl - a jednoduše být během konfigurace ignorován.

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

    & udělat

    & provést instalaci

    $ make localedata/install-locales

    $ /stat/bash --login

    Pokud jste udělali vše správně, glibc se zkompiluje, ve výzvě se konečně objeví "root" a všechny programy lze dynamicky překompilovat.

    Dokončete instalaci jádra:

    $ make modules_install

    $ provést instalaci

    Chcete-li přesunout nové jádro do adresáře /boot, spusťte ještě jeden příkaz:

    $ provést instalaci

    Shromažďujeme všechny nainstalované a některé nové programy, nyní bez příznaků statické kompilace. Budeme potřebovat (v této fázi je velmi důležité nezapomenout sestavit vše následující) (viz tabulka 1).

    Tabulka 1. Požadovaná sada balíků pro montáž

    autokonf

    grep

    perl

    automobilka

    groff

    bash

    gzip

    procinfo

    bin86

    procps

    binutils

    méně

    pmsc

    bzip2

    reiserfs-progs

    diffutils

    libtool

    e2fsprogs

    lilo

    sh-utils

    stín

    soubor

    udělat

    syslogd

    fileutils

    makedev

    sysvinit

    findutils

    manuálové stránky

    flex

    moduly

    texinfo

    zírat

    ncurses

    textutils

    netkitbase

    utilit linux

    bizon

    síťové nástroje

    gettext

    náplast

    Po provedení dynamické rekompilace můžete odstranit adresář se staticky vytvořenými balíčky:

    $ rm -rf /stat

    Můžete si vydechnout a vypít kávu – to nejtěžší, rutina, zůstane za vámi. Pojďme k další krok– počáteční konfigurace našeho systému.

    Počáteční konfigurace systému

    Před pokračováním v konfiguraci upozorňuji, že všechny změny je třeba provést v souborech adresáře nového OS, nikoli rodičovský systém.

    Chcete-li nastavit systémový čas, vytvořte soubor /etc/sysconfig/clock obsahující pouze jeden řádek:

    UTC=0

    Nyní budou hodiny počítače zobrazovat čas ve vašem časovém pásmu – za předpokladu, že je hodnota času v BIOSu nastavena správně.

    Počítač pojmenujeme:

    echo "HOSTNAME=my_linux" > /etc/sysconfig/network

    Nyní určíme oddíly, které by měl systém připojit při spouštění v /etc/fstab:

    # souborový systém mount-point fs-type options dump fsck-order

    /dev/hda5 / ext3 výchozí 1 1

    /dev/hda3 swap swap pri=1 0 0

    proc /proc výchozí proc je 0 0

    Namísto /dev/hda3 a /dev/hda5 zapisujte své oddíly (root a swap), doplňte soubor v případě potřeby o přípojné body pro další oddíly pevného disku a CD-ROM.

    Nyní udělejme náš systém bootovatelný.

    Pokud kromě lFS používáte další Linuxové distribuce, nyní se musíte přihlásit starý systém- za tímto účelem provedeme příkaz:

    $exit

    Již v nadřazeném OS přidejte do souboru /etc/lilo.conf následující:

    # LFS

    image=/boot/bzImage

    Label=lfs

    kořen=

    Pouze ke čtení

    Je jasné, že „/boot/bzImage“ je cesta k systémovému jádru, které jste zkompilovali, a „partition“ je oddíl disku, kde se nachází kořenový adresář.

    Pokud neplánujete používat jiné operační systémy a distribuce Linuxu, pak okamžitě přejděte k nastavení LILO v LFS.

    V tomto případě by lilo.conf vypadal asi takto:

    boot=/dev/hda

    zpoždění = 40

    Kompaktní

    Vga=normální

    Root=/dev/hda1

    Pouze ke čtení

    Image=/boot/zImage-2.6.12

    Label=Linux

    Proveďte potřebné změny v závislosti na vaší konfiguraci. Aktualizujte bootloader pomocí příkazu:

    $ /sbin/lilo -v

    A pokud byly všechny předchozí kroky provedeny správně, ocitneme se v novém systému. Stále je však před námi dlouhá fáze „jemného“ ladění (zvláštní pozornost by měla být věnována bezpečnosti nového systému, protože LFS ve výchozím nastavení vypadá dost nejistě, jako každý nově nainstalovaný OS). Ale vy už máte vlastní zkompilovanou verzi Linuxu.

    P.S

    Gerard Beekmans není jediný, kdo má nápad postavit si vlastní Linux. Další projekt, BYOLinux, vedený Jonathanem Thorpem, dnes ukončil svůj vývoj, ačkoli dokumentace, kterou napsal, zůstává aktuální i nyní, ale není tak podrobná jako kniha LFS a není přeložena do ruštiny. Hlavním rozdílem Johnovy metody je to, že knihovna glibc je přenesena z nadřazeného systému do podřízeného systému bez rekompilace, což není tak efektivní, ale zabraňuje mnoha problémům se sestavováním. Touhu cítit se jako návrhář OS také zažívají někteří uživatelé FreeBSD.

    Nyní je to docela možné - na http://ezine.daemonnews.org/200302/fbsdscratch.html je článek o budování FreeBSD ze zdroje v celém jeho rozsahu - od distribucí po porty a metodou ne podobnou obvyklé " přestavba" systému, ale podobná metodě Gerarda Beekmense. Nyní máte osobní, jedinečný systém postavený na Linuxu. V případě problémů hledejte jejich řešení v LFS-booku, tam je vše podrobně popsáno. Doporučuji si také stáhnout Linux Network Administrator’s Guide z portálu http://www.tldp.org, ačkoli se netýká přímo LFS, bude se hodit ve fázi konfigurace systému. Nezapomeňte, že s každým programem jsou dodávány také různé uživatelské a informační stránky, které jsou také navrženy tak, aby usnadnily život uživatele Linuxu.

    1. LFS-kniha v ruštině - http://multilinux.sakh.com/lfs.
    2. Oficiální portál projektu LFS je http://www.linuxfromscratch.org.
    3. Portál ByoLinux – http://www.byolinux.org.
    4. Článek o FreeBSD od nuly - http://ezine.daemonnews.org/200302/fbsdscratch.html.
    5. Článek o kompilaci linuxového jádra - http://vikos.lrn.ru/MyLDP/kernel/kompil-2-6.html .
    6. Bairak A. Přehled Knoppix 3.7 Russian Edition. - časopis" Správce systému“, č. 3, březen 2005 - 4-6 s. ().

    Kniha Operační systém 0 až 1 vychází na GitHubu a má přes 2000 hvězdiček a 100 forků. Jak název napovídá, po přečtení si můžete vytvořit svůj vlastní operační systém - a možná jen málo věcí ve světě programátorů může být cool.

    Prostřednictvím této knihy se dozvíte následující:

    • Naučte se, jak vytvořit operační systém založený na technická dokumentacežláza. V reálném světě to tak funguje, pro rychlé odpovědi nelze použít Google.
    • Pochopte, jak se počítačové komponenty vzájemně ovlivňují, od softwaru po hardware.
    • Naučte se psát kód sami. Slepé kopírování kódu není učení, ve skutečnosti se naučíte, jak řešit problémy. Nebezpečné je mimochodem i slepé kopírování.
    • Osvojte si známé nástroje pro vývoj na nízké úrovni.
    • Seznamte se s jazykem symbolických instrukcí.
    • Zjistěte, z čeho se skládají programy a jak je operační systém spouští. Pro zvědavce jsme dali malý přehled tohoto tématu.
    • Naučte se ladit program přímo na hardwaru pomocí GDB a QEMU.
    • Programovací jazyk C. Můžete jej rychle zvládnout následováním.
    • Základní znalost Linuxu. Stačí nastudovat na našem webu.
    • Základní znalosti ve fyzice: atomy, elektrony, protony, neutrony, napětí.
    • Ohmův zákon o poměru napětí, proudu a odporu.

    Kniha je téměř každý den vylepšována a upravována: vy sami můžete provést změny nebo opravit překlep. Operační systém, jehož vývoj posloužil jako „zápletka“ pro tuto knihu,

    Originál: "Vytočte si vlastní hračku UNIX-klon OS"
    Autor: James Molloy
    Datum vydání: 2008
    Překlad: N.Romodanov
    Datum převodu: leden 2012

    Tato sada výukových programů je navržena tak, aby vám podrobně ukázala, jak naprogramovat jednoduchý operační systém podobný UNIXu pro architekturu x86. V těchto příručkách je jako programovací jazyk zvolen jazyk C, případně doplněný o jazyk symbolických instrukcí. Účelem tutoriálů je říci vám o návrhu a implementaci řešení použitých při vytváření monolitického operačního systému operačního systému, který budujeme (ovladače se načítají v režimu modulu jádra, nikoli v uživatelském režimu, jak je tomu v případě s programy), protože takové řešení je jednodušší.

    Tato sada vodítek je velmi praktická. Každá část poskytuje teoretické informace, ale většina průvodce se zabývá implementací uvažovaných abstraktních myšlenek a mechanismů v praxi. Je důležité poznamenat, že jádro je implementováno jako vzdělávací. Vím, že použité algoritmy nejsou ani prostorově nejefektivnější, ani optimální. Obecně byly vybrány pro svou jednoduchost a snadnost porozumění. Účelem toho je poskytnout vám správné myšlení a poskytnout základ, na kterém můžete pracovat. Toto jádro je rozšiřitelné a můžete snadno zapojit ty nejlepší algoritmy. Pokud máte potíže s nějakou teorií, existuje mnoho stránek, které vám mohou pomoci ji zjistit. Většina otázek diskutovaných na fóru OSDev se týká implementace („Funkce má get nefunguje! pomoc!“ / „Moje funkce nefunguje! Pomoc!“) a pro mnohé je otázka teorie jako sousto čerstvý vzduch. Odkazy najdete na konci tohoto úvodu.

    Předběžná příprava

    Ke kompilaci a spuštění ukázkového kódu myslím, že vše, co potřebujete, je GCC, ld, NASM a GNU Make. NASM je open source x86 assembler. zdrojový kód a mnoho vývojářů OS pro platformu x86 si ji vybírá.

    Nemá však smysl příklady pouze kompilovat a spouštět, pokud jim nerozumíte. Musíte rozumět tomu, co se kóduje, a k tomu potřebujete velmi dobře znát jazyk C, zejména pokud jde o ukazatele. Měli byste také rozumět assembleru (tyto návody používají syntaxi Intel), včetně toho, k čemu se používá registr EBP.

    Zdroje

    Existuje mnoho zdrojů, pokud víte jak je hledat. Pomohou vám zejména následující odkazy:

    • RTFM! Manuály od intelu jsou dar z nebes.
    • Wiki stránky a fórum osdev.org.
    • Na Osdever.net je mnoho dobrých tutoriálů a článků, a zejména Branovy návody na vývoj jádra, na kterých je tento návod založen na dřívějším kódu. Sám jsem tyto návody použil, abych začal, a kód v nich byl tak dobrý, že jsem to neudělal neměňte to několik let.
    • Pokud nejste začátečník, můžete ve skupině získat odpovědi na mnoho otázek

    Pokud půjdete k věci...

    OS je věc, která implementuje multitasking (obvykle) a spravuje distribuci zdrojů mezi těmito úkoly a obecně. Je potřeba zajistit, aby se úkoly nemohly vzájemně poškozovat a pracovat v různých oblastech paměti a pracovat postupně se zařízeními, alespoň to tak je. A také musíte poskytnout možnost přenášet zprávy z jednoho úkolu do druhého.

    Jiný OS, pokud je k dispozici dlouhodobá paměť, musí k němu poskytovat přístup: to znamená poskytovat všechny funkce, se kterými lze pracovat souborový systém. Je to minimum.

    Téměř všude musí být úplně první zaváděcí kód napsán v assembleru – existuje spousta pravidel o tom, kde by měl být, jak by měl vypadat, co by měl dělat a jakou velikost by neměl přesáhnout.

    Pro PC je potřeba na asma napsat bootloader, který zavolá BIOS a který by bez překročení čtyř stovek bajtů měl něco udělat a spustit hlavní OS - přenést řízení do hlavního kódu, který v blízké budoucnost lze již napsat v C.

    Pro ARM musíte vytvořit tabulku přerušení na asma (reset, různé chyby, IRQ přeruší, FIQ atd.) a přenést ovládání na hlavní kód. I když v mnoha vývojových prostředích je takový kód dostupný pro téměř jakýkoli řadič.

    To znamená, že je k tomu nutné:

    1. Znát assembler cílové platformy.
    2. Znáte architekturu procesoru a všechny druhy servisních příkazů a registrů, abyste jej mohli nakonfigurovat tak, aby fungoval požadovaný režim. Na PC se jedná o přechod např. do chráněného režimu nebo do 64bitového ... Na ARMu je to nastavení taktů jádra a periferií.
    3. Vědět přesně, jak se OS spustí, kam a jak je potřeba vložit kód.
    4. Umět jazyk C - v asma je těžké napsat velký kód bez zkušeností, ještě složitější bude jeho údržba. Proto je nutné napsat jádro v C.
    5. Zjistěte, jak OS funguje. No, v ruštině je spousta knih na toto téma, i když nevím, jestli jsou všechny dobré.
    6. Mějte hodně trpělivosti a vytrvalosti. Budou tam chyby a bude potřeba je najít a opravit. A také budete muset hodně číst.
    7. Mít hodně a hodně času.

    Dále. Řekněme, že jste něco napsal. Je potřeba to otestovat. Buď potřebujete fyzické zařízení, na kterém budou experimenty probíhat (debug board, druhý počítač), nebo jeho emulátor. Druhá je obvykle jednodušší a rychlejší. Pro PC například VMWare.

    Článků na toto téma je na internetu také dost, pokud budete dobře hledat. A také existuje mnoho příkladů hotových OS se zdrojovými kódy.

    I se silnou touhou se dokonce můžete podívat na zdroje starého jádra NT-systémů (Windows), a to jak samostatně (které je zveřejněno microsoftwarem s komentáři a různými druhy referenčních materiálů), tak ve spojení se stejným staré operační systémy (unikly).

    Dříve nebo později každý uživatel Linuxu přemýšlí o vytvoření vlastní distribuce. Někteří tvrdí, že si můžete „všechno přizpůsobit pro sebe“. Jiní si stěžují, že mezi distribucemi již prezentovanými ve Vetku není žádná ideální. A mají prý superkoncepční nápady pro svůj vlastní systém. Proč jsem začal s celou tou psychologií? Aby hned utnul kyslík začátečníkům hrajícím si s Linuxem, kteří nemají co dělat. Pokud již uvažujete o vytvoření OS, domyslete až do konce. Tak,

    Chci vytvořit OS založený na linuxu.
    Hned varuji: kdyby bylo 18. století, byli by pověšeni všichni, kteří si za základ svého budoucího systému vyberou jinou vyvinutou distribuční sadu (a nedej bože populární...). Příspěvek je o vytvoření systému od nuly, což znamená všemožné Slax a Linux Mint nedotkneme se.

    Krok 1: Vyberte médium
    Existuje několik možností: buď se váš operační systém spustí z LiveCD, nebo z pevného disku nebo z flash zařízení. Okamžitě udělám rezervaci: o pevném disku v příspěvku neřeknu ani slovo, protože mnohem pohodlnější je vytvořit si flexibilní distribuční kit z řady “Všechno nosím s sebou” neboli uzamčenou distribuci souprava na optický disk. Pokud se naučíte, jak vytvořit systém LiveCD nebo LiveUSB, nebudou s instalací na pevný disk žádné problémy.

    Pro každý případ si připravte prázdnou flashku, CD a nakonec nainstalujte Virtualbox.

    Krok 2 Kompilace jádra
    Pokud jde o vydání třetího linuxového jádra, tento krok povzbudí další vývoj... Takže potřebujeme zdrojové kódy jádra. Každý uživatel ví, že je lze získat z kernel.org. V žádném případě, slyšíte?, nikdy nezašroubujte cizí jádro, které jste nezkompilovali vy, do svého systému!

    Protože moje lenost šla mimo rozsah, vytvořil jsem složku / linuxkernel a rozbalil archiv se zdroji tam. Přihlásil jsem se jako root a provedl jsem následující:

    cd /linuxkernel
    udělat menuconfig

    V zásadě lze jádro nakonfigurovat třemi způsoby: make config (online konfigurace), make menuconfig (pseudografická konfigurace pomocí ncurses) a make xconfig (grafická konfigurace). Pointa je, že make config vám zničí náladu na dlouhou dobu, protože. udělá všechno případné otázky o všech aspektech všech témat. Problém s make xconfig nenajdeme u každého, ale setkal jsem se a stále nacházím. Pokud máte chuť to udělat přes X, přijďte na to sami. Nejlepší možnost- proveďte konfiguraci menu. Tato věc vám otevře pseudografické rozhraní, přes které si můžete jádro upravit po svém. Tato věc vyžaduje knihovnu ncurses, která se snadno instaluje.

    V zásadě platí, že pokud váš mozek Linuxu vůbec rozumí, pochopíte i konfiguraci. Proces je to zajímavý, možností je opravdu hodně a pomoci, i když anglický jazyk, ale přesto potěší svou dostupností a jednoduchostí.

    Stále však musíte být nasměrováni. Přejděte na Souborové systémy ---> a vložte požadované hvězdičky. Písmeno M znamená, že podpora konkrétního ovladače se provádí připojením externího modulu k jádru (nesnáším je!). Pro čtení disků potřebujeme také podporu isofs. Systémy souborů ---> Systémy souborů CD-ROM/DVD ---> CDROM ISO 9660 souborový systém Podpěra, podpora. Stále můžete podporovat staré systémy dos.

    Podivní vývojáři Mandriva zapomněli povolit souborové systémy ---> Souborové systémy DOS/FAT/NT ---> podporu zápisu NTFS a na jedné z jejich distribucí jsem měl problém s přístupem ke starému oddílu Windows.

    Podívejte se Typ a vlastnosti procesoru ---> Rodina procesorů, bylo mi doporučeno zvolit Pentium-MMX.

    Také se ponořte do Ovladače zařízení, je to užitečné. Pro zábavu si tam můžete vše vybrat a sestavit si jádro o váze > 50 MB.

    Dále. Jádro, po načtení samo, musí načíst ve skutečnosti systém. Buď z vlastních kompilovaných souborů (používaných ve vestavěných systémech), nebo z archivu CPIO komprimovaného něčím, nebo z Initrd. Toto není DOS pro vás, zde se nebudete moci okamžitě odkázat na nějaký init "nový soubor v kořenovém adresáři disku nebo flash disku. Ve skutečnosti to bude fungovat, neposlouchejte strýčka Annixe! my! bude pro náš systém používat initrd, protože je to pohodlné a nebude způsobovat obscénní výrazy od vývojářů třetích stran, na rozdíl od archivu CPIO.

    Ach ano, zkompilujte jádro pomocí příkazu

    Pokud máte x86, najdete ho na /linuxkernel/arch/x86/boot/bzImage.

    Pro drsné programátory Čeljabinsk můžete použít křížovou kompilaci ...

    Vytvořte Ramdisk.

    Nyní potřebujeme initrd s nainstalovaným jednoduchým shellem. Budeme používat busybox, protože tato nyasha dokáže cokoliv. Ukradneme cestu Robertu de Leovi, tvůrci Movixu (dokonce bych si ho začal vážit, kdyby nebylo transcendentní lásky k Perl):

    dd if=/dev/zero of=/dev/ram0 bs=1k count=5000 - Vytvořit Ramdisk v paměť s náhodným přístupem náš počítač.
    mke2fs -m0 /dev/ram0 5000 - Formátování Ramdisk na systému Ext2
    mkdir /distro - Vytvořte složku
    mount /dev/ram0 /distro - Připojte do složky /distro

    Vše, nyní tu máme Ramdisk s kapacitou 5 MB. Můžete udělat více, ale nemusíte. Na rozdíl od Thomase Mathejiska nebudu cpát initrd moduly Squashfs komprimovanými LZMA. Vše, co je potřeba, bude zkompilováno s jádrem. Ano, není to příliš logické a správné, ale průšvihů je stokrát menší. A zvláště pro ty, kteří tento přístup odsuzují, můžete v jádře povolit možnost modularity: Enable loadable module support.

    V našem Ramdisku, připojeném na / distro, je taková složka, ztraceno + nalezeno. Je to proto, že jsme ji naformátovali v ext2. V žádném případě by se neměla smazat, i když zde pravděpodobně nepomůže, obraz je opraven. dát busybox jako první...

    Instalace Busyboxu
    Proč mají takové skvělé projekty tak podělané weby? I když... už je vlastně jedno, jestli se zdroje stáhnou a úspěšně rozbalí do složky /busybox.

    Busybox můžete nakonfigurovat stejným způsobem:

    cd /busybox
    udělat menuconfig

    Pokud stále nechápete, co to je, vysvětlím. Busybox nahrazuje tuny unixových aplikací uložených ve složkách /bin, /sbin, /usr/bin, /usr/sbin. Místo toho se vytvoří pouze jedna aplikace: /bin/busybox a ve výše uvedených složkách se na ni vytvoří hromada odkazů. Nainstalujte busybox pomocí následujícího příkazu:

    make CONFIG_PREFIX=/instalace distribuce

    Busybox také z nějakého důvodu vytvoří soubory /sbin/init a /linuxrc, aby se váš systém spustil správně. Ale nebyly vytvořeny všechny potřebné složky. Takže vše dokončíme rukama a vytvoříme:

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

    Pokud jste na něco zapomněli, pamatujte, protože Tyto adresáře je těžké zapomenout.

    Vše by bylo v pořádku, ale busybox vyžaduje ke svému fungování knihovny, které je nutné zkopírovat do naší distribuce. Je velmi snadné zjistit, které:

    ldd /distro/bin/busybox

    Program nám ukáže knihovny potřebné pro náš shell. Okamžitě říkám: linuxová brána je vytvořena jádrem a nelze ji zkopírovat.

    Při kopírování knihoven můžete odříznout informace o ladění (jak radí Roberto):

    objcopy --strip-debug odkud

    Vytváření Linuxu z Linuxu

    Musíte vytvořit několik systémových textových souborů:

    Potřebujeme /etc/inittab. Překvapím vás: na začátku života systém ani neví, co je Root. Máme dokonce nejmenovaného uživatele, ale soubor celosystémových nízkoúrovňových funkcí (ONF) musí být přítomen. Pilotní obsah souboru je následující:

    # Úplně první soubor, který se spustí, /sbin/init poté.
    ::sysinit:/etc/rc.d/rc.S

    # Spusťte shell v konzole.
    ::respawn:-/bin/sh

    # Příkazy, které se mají provést před vypnutím a restartem.
    ::vypnutí:/sbin/swapoff -a >/dev/null 2>&1
    ::vypnutí:/bin/umount -a -r >/dev/null 2>&1

    Další soubor je /etc/fstab. Toto je tabulka, která popisuje, co a kam namontovat při bootování. Ta věc je zbytečná! Potřebujeme připojit proc, jinak nebude fungovat vůbec nic, takže do souboru zapíšeme:

    žádné /proc proc výchozí 0 0

    Mount také potřebuje /etc/mtab. Vytvořte jej a nechte jej prázdný.

    Ale mount udělá to, co potřebuje, jen když ho o to výslovně požádáme. A zeptáme se ve stejném spouštěcím souboru /etc/rc.d/rc.S (rc.d je složka). Zdvořile se ptáme:

    /bin/mount -av -t nonfs

    Potřebujeme také profilový soubor (b) (a) sh, tam je obecně svoboda pro představivost. Vytvořte soubor /etc/profile a vyplňte jej následujícím:

    PATH="$PATH:/bin:/sbin:/usr/bin:/usr/sbin:"
    MENŠÍ=-MM
    TERM=linux
    HOME=/root
    PS1=">"
    PS2=">"
    ignoreeof=10
    export PATH ZOBRAZIT MENEJ TERMÍN PS1 PS2 HOME ignorovat

    Budete také potřebovat soubor /etc/shell, který označuje, že existuje shell:

    /bin/sh
    /bin/popel
    /bin/bash

    To je vlastně vše. Náš Ramdisk můžeme zapsat do souboru.

    mkdir /os - složka pro "připraveno".
    umount /dev/ram0 - odpojí část paměti RAM.
    dd if=/dev/ram0 of=/os/initrd bs=1k count=5000 - vytvořit soubor.
    gzip /os/initrd - komprimuje soubor initrd

    Vytvořte spouštěcí flash disk

    "Cílová čára" našeho malého vývoje. Vezmeme USB flash disk, vložíme, naformátujeme ve vfatu (lze i v ext, ale nezapomeňte, že ne všichni uživatelé Windows se ještě zastřelili).

    Na flash disku vytvořte spouštěcí složku, obsahuje složky initrd a kernel.

    Ze složky / os zkopírujte komprimovaný Ramdisk do složky boot / initrd na jednotce flash, nazvěte ji „main.gz“. Ze složky se zdroji jádra zkopírujte bzImage do složky boot / kernel na USB flash disku, nazvěte ji „main.lk“. Získáváme soubory bootloaderu Syslinux (na internetu nebo z jiné distribuce: zde na tom nezáleží), konkrétně syslinux.bin, syslinux.boot, syslinux.cfg. Zkopírujeme je do kořenového adresáře našeho flash disku. Do souboru syslinux.cfg zapíšeme něco takového:

    výchozí mm
    výzva 1
    časový limit 100
    štítek mm
    jádro /boot/kernel/main.lk

    štítek mc
    jádro /boot/kernel/main.lk

    štítek cm
    jádro /boot/kernel/custom.lk
    připojit initrd=/boot/initrd/main.gz load_ramdisk=1 ramdisk_size=5000 rw root=/dev/ram0
    štítek cc
    jádro /boot/kernel/custom.lk
    připojit initrd=/boot/initrd/custom.gz load_ramdisk=1 ramdisk_size=5000 rw root=/dev/ram0
    štítek hd
    localboot 0x80

    Podpořili jsme tedy vlastní initrd a jádro, které lze pro účely experimentu připojit k naší distribuci.

    Pojďme zjistit, jaké zařízení je náš flash disk v systému (můžete spustit mount bez parametrů a uvidíte). Toto je buď /dev/sdb1 nebo /dev/sdc1 nebo /dev/sdd1. Před zahájením instalace se vyplatí flash disk odpojit.

    Nainstalujte syslinux (pokud balíček není v systému, apt-get install syslinux):

    syslinux -d cesta_zařízení

    Soubor ldlinux.sys by se měl objevit v kořenovém adresáři flash disku. Pokud ano, pak syslinux.bin, syslinux.boot již nejsou potřeba.

    Neřeknu vám, jak nastavit BIOS na bootování z USB flash disku – je to snadné. Jen podotknu, že je velmi pohodlné vytvořit si složku /boot/initrd/init, do které můžete /boot/initrd/main připojit pro další práci s ní. Jen ho nezapomeňte dekomprimovat a zkomprimovat pomocí gzip.

    Dobře, teď je po všem.

    Jako jsem vám právě řekl, jak vytvořit systém Linux od nuly. Snadné, že? Poté můžete upravit skript /sbin/init, protože vás čeká ještě spousta práce! Budete muset napsat skript pro připojení flash disku, který chrootuje do kořenového adresáře. V opačném případě budete nuceni pracovat s oddílem 5 MB ReadOnly. Ale to je úplně jiný příběh.