Eine Anleitung zum Erstellen eines einfachen UNIX-ähnlichen Betriebssystems. So entwickeln Sie ein Betriebssystem für einen Computer

Ilja Alexandrow

Wir erstellen unser eigenes Betriebssystem auf Basis von Linux

Es gibt Hunderte von Linux-Distributionen und niemand weiß, wie viele noch erscheinen werden. Dutzende von Unternehmen und Tausende von Programmierern konkurrieren um die Erstellung des besten Linux-Projekts, und dennoch kann jeder erfahrene Benutzer zum Autor eines Heim-PC-Systems werden, das den Produkten der Giganten der IT-Branche in nichts nachsteht.

Im Laufe meiner langjährigen Arbeit mit Linux habe ich eine Vielzahl verschiedener Distributionen verwendet: Mandriva, Fedora, SlackWare, Debian, Ubuntu und viele andere. Einige Projekte gefielen mir mehr, andere weniger. Aber bei allen Distributionen mussten wir zwangsläufig mit gravierenden Mängeln rechnen, die die Arbeit sehr erschwerten. Einer ist zu ressourcenintensiv, der andere unterstützt nicht alle notwendigen Geräte und dem dritten mangelt es an diverser Software. Da fiel mir die berühmte östliche Weisheit ein: Wenn Sie etwas gut machen müssen, tun Sie es selbst.

Linux von Grund auf

Ich bin nicht der Einzige, der sich entschieden hat, eine eigene Linux-Version zu erstellen – ein Betriebssystem, bei dem der grundlegende Teil des Systems und der Kernel als Grundlage dienen, bei dem der Entwickler jedoch kein einziges zusätzliches Kilobyte zur Verfügung stellt , also von dir. Die große Zahl an Linux-Distributionen, die nicht den Benutzeranforderungen entsprechen, veranlasste Gerard Beekmans, eine Distribution zu erstellen, die es jedem ermöglichen würde, ein System nur mit den Komponenten und Funktionen aufzubauen, die er benötigt.

Der Wunsch eines talentierten Programmierers führte zum Linux from Scratch-Projekt (www.linuxfromscratch.org), abgekürzt als LFS. Mit diesem Projekt können Sie aus Quellcodes Ihr eigenes Linux-basiertes Betriebssystem von Grund auf entwerfen. Die LFS-Kompilierung erfolgt auf einem Computer mit bereits installiertem Linux-System, es eignet sich jedoch auch eine „fortgeschrittene“ Live-CD, zum Beispiel Knoppix.

In diesem Fall kann das für den Build verwendete Linux-System ein beliebiges sein – lediglich das Vorhandensein eines Compilers und von Systembibliotheken ist erforderlich. Linux From Scratch kann kaum als Distribution im üblichen Sinne des Wortes bezeichnet werden – es ist so etwas wie eine Hilfssoftware, die es Ihnen zusammen mit dem Basisteil des Betriebssystems ermöglicht, Ihre eigene, einzigartige Version des Betriebssystems zu erstellen.

Wie Sie wissen, hat Linus Torvalds seine entwickelt Betriebssystem unter dem Motto „Just for fun!“ - also nur zum Vergnügen. Man muss zugeben, dass LFS auf Servern wirklich nicht oft zu finden ist; dieses System wird in der Regel von Computer-Enthusiasten verwendet. Die Installation und Arbeit mit Linux von Grund auf hilft Ihnen, die Beziehung zwischen Betriebssystemkomponenten zu verstehen, was bei der Entwicklung Ihrer eigenen Linux-Distribution nützlich sein wird, und zwar nicht nur auf Basis von LFS. Daher ist LFS vor allem für diejenigen Menschen konzipiert, für die der Prozess der Zusammenstellung einer eigenen Distribution spannend und interessant ist – und glauben Sie mir, es gibt viele solcher Menschen.

Wenn Sie also bereit sind, einen ganzen Tag (oder sogar mehr) mit dem Entwerfen eines Systems zu verbringen, empfehle ich Ihnen, von der Website (2) LFS-packages-6.0 und LFS-book herunterzuladen und diesen Artikel weiterzulesen.

Partitionieren der Festplatte und Erstellen eines Verzeichnisbaums

Zum besseren Verständnis des Materials beschreiben wir den gesamten Prozess allgemein (siehe Abb. 1).

Im ersten Schritt wird die Festplatte mithilfe eines bereits installierten Distributionskits oder einer LiveCD geteilt. Für das neue System wird eine Partition auf der Festplatte zugewiesen. Danach müssen Sie auf dieser Partition alle notwendigen Programme und den Systemkernel statisch kompilieren. Als nächstes wird das Stammverzeichnis auf die Festplattenpartition geändert, die unserem neuen Betriebssystem zugewiesen ist. Sie müssen die Kompilierung wiederholen, aber dieses Mal muss die Software dynamisch erstellt werden (der Unterschied zwischen dynamischer und statischer Kompilierung wird weiter unten beschrieben). Der letzte Schritt umfasst den Aufbau der wichtigen Glibc-Bibliothek und die Konfiguration des installierten Betriebssystems. Wie Sie sehen, müssen Sie nichts besonders Kompliziertes tun.

Während des gesamten Prozesses ist Ihr Hauptassistent die Dokumentation aus dem LFS-Book-Paket, dessen russische Übersetzung hier zu finden ist: http://multilinux.sakh.com/download/lfsbook.tar.bz2. Das Buch beschreibt jeden Schritt der Erstellung eines Betriebssystems im Detail. Lesen Sie daher unbedingt dieses Handbuch, wenn Sie Probleme haben (dieser Artikel soll eine derart umfangreiche Dokumentation nicht ersetzen).

Wir erstellen Neuer Abschnitt– in meinem Fall ist das /dev/hda5, da die /dev/hda1-Partition bereits durch die Installation auf der Festplatte belegt ist Linux-Festplatte Slackware. Es wird empfohlen, dies zuerst zu tun Systemsicherung, so dass es im Schadensfall wiederhergestellt werden kann, obwohl die Wahrscheinlichkeit dafür nahezu Null ist. Und hier ist meiner Meinung nach alles klar: Wir weisen dem Root-Verzeichnis die erforderliche Menge (23 GB reichen aus), Platz in Höhe der doppelten Menge RAM für die Swap-Partition, auf Wunsch können Sie separate Partitionen für das Home erstellen Verzeichnis (/home) und für /boot. Die von vielen bevorzugte Partitionierungsoption – die Zuweisung des gesamten verfügbaren Speicherplatzes abzüglich der Auslagerungsdatei zum Stammverzeichnis und die anschließende Erstellung der Auslagerungsdatei selbst – ist jedoch auch beim Erstellen von LFS durchaus akzeptabel. Auf dem Computer des Autors verwenden sowohl Linux Slackware, das übergeordnete Betriebssystem, als auch LFS eines Festplatte Allerdings ist auch die Installation von LFS auf einer anderen Festplatte kein Problem.

Wählen Sie das Dateisystem nach eigenem Ermessen: Unter LFS gab es weder mit Ext3 noch mit ReiserFS Probleme. Doch Fans von XFS werden enttäuscht sein – Versuche, Linux From Scratch mit diesem FS zum Laufen zu bringen, waren erfolglos.

Jetzt mounten wir die für das neue Betriebssystem zugewiesene Partition:

$ mount /dev/hda5 /mnt/mylin

Der Einfachheit halber definieren wir die Variable MYLIN:

$ export MYLIN=/mnt/mylin

Gut für weitere Arbeit Es ist besser, einen separaten Benutzer mylin zu erstellen, den wir als Besitzer der gemounteten Partition zuweisen.

$ useradd mylin

$ chown –R mylin $MYLIN

Sie müssen einen Verzeichnisbaum im Stammverzeichnis der neuen Partition erstellen:

$cd$MYLIN

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

In den Verzeichnissen usr, usr/X11R6, usr/local erstellen wir die notwendige Struktur: Unterverzeichnisse bin usw., include, lib, sbin, share, src.

Dann machen wir dasselbe für die Verzeichnisse /var und /opt des zukünftigen Systems:

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

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

Vergessen wir nicht, dass es tiefere Hierarchien gibt, zum Beispiel /usr/share/man/man1. Der Umfang des Artikels erlaubt es uns jedoch nicht, hier alle Informationen über die Struktur des Dateibaums bereitzustellen. Daher müssen Sie entweder das Filesystem Hierarhy Standard-Dokument verwenden (zu finden unter: http://linux-ve.net). /MyLDP/file-sys/fhs-2.2-rus) oder studieren Sie sorgfältig die Struktur des Linux-Betriebssystems, das Sie bereits installiert haben. Nachdem wir die Festplatte vorbereitet haben, fahren wir mit der statischen Montage fort.

Statischer Aufbau

Warum verwenden wir statische Assembly? Bei der statischen Kompilierung wird der Quellcode der Bibliothek an den Anwendungscode angehängt, was eine Vergrößerung seiner Größe zur Folge hat, gleichzeitig aber seine Integrität erhalten bleibt. Bei der dynamischen Kompilierung befindet sich die Bibliothek in einer separaten Datei, auf die Anwendungen bei Bedarf zugreifen. Dadurch arbeiten alle Programme mit der gleichen Version der Bibliothek

Wenn wir jedoch den Befehl chroot verwenden, um das Stammverzeichnis für das neu zusammengestellte System, die „übergeordnete“ Bibliothek, festzulegen, installiertes System, die sich in /lib, /usr/lib und anderen befindet, ist nicht mehr zugänglich, so dass dynamisch kompilierte Programme nicht funktionieren werden, außerdem wird die Kompatibilität der Versionen von niemandem garantiert.

Um dies zu vermeiden, alles, was Sie brauchen Software Für unser zukünftiges System werden wir es zunächst statisch aufbauen. Beginnen wir mit dem Bash-Befehlsinterpreter. (Fans von ZSH oder TCSH können ihre bevorzugten Interpreter nach der Installation des Systems installieren, in der Build-Phase wird deren Verwendung jedoch vom Autor von LFS nicht bereitgestellt.) Sie sollten überprüfen, ob Sie über die Datei /usr/lib/libcurses.a verfügen, und falls nicht, installieren Sie das Paket nсursesdev. Alle Pakete müssen mit statischen Build-Flags erstellt werden: „--enable-static-link“, „--disable-shared“ oder „--static“. Welche im konkreten Fall die richtige ist, kann der Dokumentation zu einem bestimmten Paket oder der Ausgabe des Konfigurationsskripts entnommen werden, das mit dem Parameter „--help“ gestartet wird.

$ ./configure --help

Um später statisch kompilierte Programme nicht mit „dynamischen“ zu verwechseln, erstellen wir für sie ein spezielles Verzeichnis:

$ mkdir $MYLIN/stat

Vergessen Sie beim Erstellen und Installieren von Paketen nicht, den Parameter „--prefix=$MYLIN/stat“ hinzuzufügen, um Dateien in dieses Verzeichnis zu verschieben. Und schließlich installieren Sie Bash:

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

$make

$ make install

Nach dem gleichen Schema sammeln wir die restlichen notwendigen Pakete : binutils, bzip2, textutils, texinfo, tar, sh-utils, gcc, grep, gzip, gawk, diffutils, fileutils, make, patch, sed, und tatsächlich Linux-Kernel.

Ja, vergessen Sie beim Kompilieren des Kernels nicht, dass Sie für ältere Kernelversionen (2.2.x-2.4.x) gcc 2.95 und für verwenden müssen aktuelle Version 2.6.x wird empfohlen, gcc 3.x zu verwenden, um Probleme zu vermeiden.

Vergessen Sie nicht, einen Blick auf die entsprechenden Abschnitte des LFS-Buches zu werfen, dort wird über diese und viele andere Nuancen gesprochen. Im Allgemeinen unterscheidet sich das Kompilieren eines Kernels in LFS nicht von einem ähnlichen Vorgang, der bei Verwendung einer auf der Festplatte installierten Distribution durchgeführt wird. Entpacken wir die Kernel-Quellen in $MYLIN/usr/src/linux-2.6.xx und konfigurieren sie dann, indem wir Folgendes ausführen:

$ make menuconfig

Der Vorgang der Kernel-Parametereinstellung ist im Internet schon mehrfach beschrieben (6), es besteht kaum Bedarf, näher darauf einzugehen. Als nächstes geben wir die folgenden Befehle im Ordner mit ein Quelltexte Linux Kernel:

$ make bzImage

$ Module erstellen

Das war's, unter $MYLIN/usr/src/linux-2.6.xx/arch/i386/boot/bzImage gibt es einen neuen Kernel.

Als nächstes erstellen Sie die Dateien $MYLIN/etc/passwd und $MYLIN/etc/group. Im ersten registrieren wir vorerst einen einzelnen Benutzer – Root mit einem beliebigen Passwort, und im zweiten Gruppen von Benutzern (für den Anfang reicht auch eine Root-Gruppe).

An diesem Punkt sind unsere Vorbereitungen für den nächsten Schritt abgeschlossen und wir gehen zu einer subtileren dynamischen Montage über.

Dynamische Montage

Jetzt müssen wir das Stammverzeichnis in /mnt/mylin ändern, wo wir nur noch statisch zusammengestellte Dienstprogramme verwenden werden – wir können nicht mehr auf die Hilfe von Tools des „übergeordneten“ Betriebssystems zurückgreifen. Wir geben den Befehl in der Konsole aus:

$ 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

Mit diesem Befehl haben wir die Pfade zu den ausführbaren Dateien, den Terminaltyp, den Interpreter und den Typ der Eingabeaufforderung angegeben.

Um den Betrieb einiger Programme sicherzustellen, müssen Sie das PROC-Dateisystem auf dem neuen System installieren.

$ mount proc /proc -t proc

Der entscheidende Moment ist gekommen. Erstellen der glibc-Bibliothek. Er ist am verantwortungsvollsten, weil die meisten Menschen ohne sie arbeiten notwendige Programme Dies ist nicht der Fall und es macht keinen Sinn, Linux ohne die Hauptbibliothek zu verwenden. Das Erstellen von Glibc verursacht oft viele Probleme.

Während des Builds haben wir den Parameter „--prefix=$MYLIN/stat“ angegeben, sodass beim Ändern des Stammverzeichnisses alle statisch erstellten Pakete im Verzeichnis /stat der neuen Betriebssystempartition landen.

Entpacken Sie also das Archiv glibc-2.x.x.tar.gz (z. B. in das Verzeichnis /usr/src/) und gehen Sie in das Verzeichnis glibclinuxthreads. Wir müssen den Quellcode leicht korrigieren, da es zu diesem Zeitpunkt nicht möglich ist, einen Benutzer im System anhand seines Namens zu identifizieren (gerade aufgrund des Fehlens von Glibc und anderen Bibliotheken) und der Tatsache, dass Sie Glibc installieren müssen brauchen einen Perl-Interpreter, den wir nicht haben.

Wir ersetzen den Root-Benutzernamen im Login/Makefile durch seine UID, also 0, und die Variable $PERL im malloc/Makefile sollte durch den Pfad zum Interpreter – /usr/bin/perl – ersetzt werden, und das wird auch so sein werden bei der Konfiguration einfach ignoriert.

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

& machen

& installieren

$ make localedata/install-locales

$ /stat/bash --login

Wenn Sie alles richtig gemacht haben, wird glibc kompiliert, schließlich erscheint „root“ an der Eingabeaufforderung und Sie können alle Programme dynamisch neu kompilieren.

Lassen Sie uns die Kernel-Installation abschließen:

$ make module_install

$ make install

Um den neuen Kernel in das Verzeichnis /boot zu verschieben, führen Sie einen weiteren Befehl aus:

$ make deinstallieren

Wir sammeln alle installierten und einige neue Programme, jetzt ohne statische Kompilierungsflags. Wir benötigen (in dieser Phase ist es sehr wichtig, nicht zu vergessen, alles zusammenzustellen, was unten aufgeführt ist) (siehe Tabelle 1).

Tabelle 1. Erforderlicher Paketsatz für die Montage

Autoconf

grep

Perl

Automarke

groff

bash

gzip

procinfo

bin86

procps

binutils

weniger

psmisc

bzip2

reiserfs-progs

diffutils

libtool

e2fsprogs

Lilo

sh-utils

Schatten

Datei

machen

sysklogd

Dateiutils

makedev

sysvinit

findutils

Manpages

biegen

Modulen

texinfo

gaffen

Fluche

Textutils

netkitbase

util-linux

Bison

Netz-Tools

gettext

Patch

Nach der dynamischen Neukompilierung können Sie das Verzeichnis mit statisch erstellten Paketen löschen:

$ rm -rf /stat

Sie können aufatmen und Kaffee trinken – die schwierigsten, routinemäßigen Dinge bleiben zurück. Kommen wir zum nächsten Schritt – der Erstkonfiguration unseres Systems.

Erstkonfiguration des Systems

Bevor wir mit der Einrichtung beginnen, stelle ich fest, dass alle Änderungen in den Verzeichnisdateien des neuen Betriebssystems und nicht im übergeordneten System vorgenommen werden müssen.

Um die Systemzeit einzustellen, erstellen Sie eine Datei /etc/sysconfig/clock, die nur eine Zeile enthält:

UTC=0

Nun zeigt die Computeruhr die Zeit in Ihrer Zeitzone an – vorausgesetzt, der Zeitwert im BIOS ist richtig eingestellt.

Geben wir dem Computer einen Namen:

echo „HOSTNAME=my_linux“ > /etc/sysconfig/network

Jetzt geben wir in /etc/fstab die Partitionen an, die das System beim Booten mounten soll:

# Dateisystem-Mount-Point FS-Type-Optionen Dump FSCK-Reihenfolge

/dev/hda5/ext3 ist standardmäßig 1 1

/dev/hda3 swap swap pri=1 0 0

proc /proc proc ist standardmäßig 0 0

Beschreiben Sie statt /dev/hda3 und /dev/hda5 Ihre Partitionen (root und swap), ergänzen Sie die Datei ggf. mit Mount-Punkten für andere Partitionen der Festplatte und CD-ROM.

Jetzt machen wir unser System bootfähig.

Wenn Sie neben lFS auch andere Linux-Distributionen verwenden, müssen Sie sich jetzt anmelden altes System– dazu führen wir den Befehl aus:

$ beenden

Fügen Sie bereits im übergeordneten Betriebssystem Folgendes zur Datei /etc/lilo.conf hinzu:

#LFS

image=/boot/bzImage

Label=lfs

Wurzel=

Schreibgeschützt

Es ist klar, dass „/boot/bzImage“ der Pfad zum von Ihnen kompilierten Systemkernel ist und „Partition“ die Festplattenpartition ist, auf der sich das Stammverzeichnis befindet.

Wenn Sie nicht vorhaben, andere Betriebssysteme und Linux-Distributionen zu verwenden, fahren Sie direkt mit der Einrichtung von LILO in LFS fort.

In diesem Fall sieht lilo.conf etwa so aus:

boot=/dev/hda

Verzögerung=40

Kompakt

Vga=normal

Root=/dev/hda1

Schreibgeschützt

Image=/boot/zImage-2.6.12

Label=Linux

Nehmen Sie abhängig von Ihrer Konfiguration die erforderlichen Änderungen vor. Wir aktualisieren den Bootloader mit dem Befehl:

$ /sbin/lilo –v

Und wenn alle vorherigen Schritte korrekt ausgeführt wurden, befinden wir uns im neuen System. Es steht jedoch noch eine lange Phase der „Feinabstimmung“ an (besonderes Augenmerk sollte auf die Sicherheit des neuen Systems gelegt werden, da LFS standardmäßig ziemlich ungeschützt aussieht, wie jedes neu installierte Betriebssystem). Aber mit meinen eigenen Händen gesammelt Linux-Version du hast bereits.

P.S

Gerard Beekmans ist nicht der Einzige, der daran dachte, sein eigenes Linux zu entwickeln. Ein anderes Projekt, BYOLinux, unter der Leitung von Jonathan Thorpe, hat seine Entwicklung inzwischen eingestellt, obwohl die von ihm verfasste Dokumentation auch heute noch relevant ist, aber nicht so detailliert ist wie das LFS-Buch und nicht ins Russische übersetzt wurde. Der Hauptunterschied zwischen Johns Methode besteht darin, dass die Glibc-Bibliothek ohne Neukompilierung vom übergeordneten System auf das untergeordnete System übertragen wird. Dies ist nicht so effizient, vermeidet jedoch viele Probleme beim Zusammenbau. Einige FreeBSD-Benutzer möchten sich auch wie ein Betriebssystemdesigner fühlen.

Nun ist das durchaus möglich – unter http://ezine.daemonnews.org/200302/fbsdscratch.html gibt es einen Artikel über die vollständige Erstellung von FreeBSD aus Quellen – von Distributionen bis hin zu Ports, und zwar auf eine Weise, die nicht der üblichen „Neuerstellung“ ähnelt. des Systems, aber ähnlich der Methode von Gerard Beekman. Nun, jetzt hast du dein eigenes, einzigartiges System, erstellt unter Linux. Wenn Probleme auftreten, suchen Sie im LFS-Buch nach deren Lösung, dort ist alles ausführlich beschrieben. Ich empfehle außerdem, das Linux Network Administrator’s Guide vom Portal http://www.tldp.org herunterzuladen; obwohl es sich nicht direkt auf LFS bezieht, wird es bei der Systemeinrichtung hilfreich sein. Vergessen Sie nicht, dass jedes Programm auch verschiedene Man- und Infoseiten enthält, die auch Linux-Benutzern das Leben erleichtern sollen.

  1. LFS-Buch auf Russisch – http://multilinux.sakh.com/lfs.
  2. Das offizielle Portal des LFS-Projekts ist http://www.linuxfromscratch.org.
  3. ByoLinux-Portal – http://www.byolinux.org.
  4. Artikel über FreeBSD von Grund auf – http://ezine.daemonnews.org/200302/fbsdscratch.html.
  5. Zusammenstellungsartikel Linux-Kernel– http://vikos.lrn.ru/MyLDP/kernel/kompil-2-6.html.
  6. Bayrak A. Rezension von Knoppix 3.7 Russische Ausgabe. - Zeitschrift " Systemadministrator", Nr. 3, März 2005 – 16–18 S. ().

Wenn wir zum Punkt kommen...

Ein Betriebssystem ist eine Sache, die (normalerweise) Multitasking implementiert und die Verteilung der Ressourcen zwischen diesen Aufgaben und im Allgemeinen verwaltet. Zumindest müssen Sie sicherstellen, dass sich Aufgaben nicht gegenseitig beeinträchtigen und in verschiedenen Bereichen des Speichers arbeiten und abwechselnd mit Geräten arbeiten. Sie müssen auch die Möglichkeit bereitstellen, Nachrichten von einer Aufgabe an eine andere zu übertragen.

Außerdem muss das Betriebssystem, sofern ein Langzeitspeicher vorhanden ist, Zugriff darauf gewähren, also alle Funktionen für die Arbeit mit dem Dateisystem bereitstellen. Es ist ein Minimum.

Fast überall muss der allererste Bootcode in Assembler geschrieben werden – es gibt viele Regeln darüber, wo er sein sollte, wie er aussehen sollte, was er tun sollte und welche Größe er nicht überschreiten sollte.

Für einen PC müssen Sie einen Bootloader auf ASMA schreiben, der vom BIOS aufgerufen wird und der, ohne vier und ein paar hundert Bytes zu überschreiten, etwas tun und das Hauptbetriebssystem starten sollte – die Kontrolle an den Hauptcode übertragen, der in Die nahe Zukunft kann in C geschrieben werden.

Für ARM müssen Sie eine Interrupt-Tabelle auf ACMA erstellen (Reset, verschiedene Fehler, IRQ-, FIQ-Interrupts usw.) und die Kontrolle an den Hauptcode übertragen. Allerdings ist in vielen Entwicklungsumgebungen solcher Code für fast jeden Controller verfügbar.

Das heißt, dafür benötigen Sie:

  1. Kennen Sie die Assemblersprache der Zielplattform.
  2. Kennen Sie die Prozessorarchitektur und alle Arten von Dienstbefehlen und -registern, um sie für den Betrieb zu konfigurieren gewünschten Modus. Bei einem PC ist dies beispielsweise ein Übergang in den geschützten Modus oder in den 64-Bit-Modus... Bei ARM ist dies die Einstellung der Taktung des Kerns und der Peripheriegeräte.
  3. Erfahren Sie genau, wie das Betriebssystem startet und wo und wie Sie Ihren Code pushen müssen.
  4. Kennen Sie die C-Sprache – ohne Erfahrung ist es schwierig, großen Code in Asma zu schreiben, und die Wartung wird noch schwieriger. Daher müssen Sie den Kernel in C schreiben.
  5. Kennen Sie die Funktionsprinzipien des Betriebssystems. Nun, es gibt viele Bücher auf Russisch zu diesem Thema, obwohl ich nicht weiß, ob sie alle gut sind.
  6. Haben Sie viel, viel Geduld und Ausdauer. Es wird Fehler geben, die gefunden und korrigiert werden müssen. Sie müssen auch viel lesen.
  7. Habe viel, viel Zeit.

Weiter. Nehmen wir an, Sie haben etwas geschrieben. Wir müssen dieses Ding testen. Entweder Sie benötigen ein physisches Gerät, auf dem die Experimente stattfinden (Debugboard, zweiter Computer), oder einen Emulator dafür. Die zweite Möglichkeit ist normalerweise einfacher und schneller zu verwenden. Für PC zum Beispiel VMWare.

Auch im Internet gibt es jede Menge Artikel zu diesem Thema, wenn man gut recherchiert. Es gibt auch viele Beispiele für vorgefertigte Betriebssysteme mit Quellcodes.

Wenn Sie wirklich möchten, können Sie sich sogar den Quellcode des alten Kernels von NT-Systemen (Windows) ansehen, sowohl separat (der von Microsoft veröffentlicht wurde, mit Kommentaren und verschiedenen Arten von Referenzmaterialien) als auch in Verbindung mit dem alten Betriebssystem (durchgesickert).

Beim Lesen von Habr in den letzten zwei Jahren habe ich nur wenige Versuche gesehen, ein Betriebssystem zu entwickeln (insbesondere: von Benutzern und (auf unbestimmte Zeit verschoben) und (nicht aufgegeben, aber im Moment sieht es eher nach einer Beschreibung der Funktionsweise des geschützten Modus aus von x86-kompatiblen Prozessoren, was Sie zweifellos auch wissen müssen, um ein Betriebssystem für x86 zu schreiben); und eine Beschreibung des fertigen Systems von (allerdings nicht von Grund auf, obwohl daran nichts auszusetzen ist, vielleicht sogar umgekehrt )). Aus irgendeinem Grund denke ich, dass fast alle Systemprogrammierer (und einige Anwendungsprogrammierer) mindestens einmal darüber nachgedacht haben, ein eigenes Betriebssystem zu schreiben. In diesem Zusammenhang scheinen 3 Betriebssysteme aus der großen Community dieser Ressource eine lächerliche Zahl zu sein. Anscheinend kommt die Mehrheit derjenigen, die über ein eigenes Betriebssystem nachdenken, nicht über die Idee hinaus, ein kleiner Teil hört nach dem Schreiben des Bootloaders auf, ein paar schreiben Teile des Kernels, und nur die hoffnungslos Hartnäckigen schaffen etwas, das entfernt an ein Betriebssystem erinnert (im Vergleich mit etwas wie Windows/Linux) . Dafür gibt es viele Gründe, aber der Hauptgrund ist meiner Meinung nach, dass die Leute die Entwicklung aufgeben (manche sogar, bevor sie überhaupt angefangen haben), weil es nur wenige Beschreibungen zum Prozess des Schreibens und Debuggens eines Betriebssystems gibt, was ganz anders ist als das, was passiert während der Entwicklung von Anwendungssoftware.

Mit dieser kurzen Anmerkung möchte ich zeigen, dass die Entwicklung eines eigenen Betriebssystems nicht besonders schwierig ist, wenn man richtig anfängt. Nachfolgend finden Sie eine kurze und ziemlich allgemeine Anleitung zum Schreiben eines Betriebssystems von Grund auf.

Wie nicht nötig anfangen
Bitte verstehen Sie den folgenden Text nicht als explizite Kritik an Artikeln oder Anleitungen zum Schreiben eines Betriebssystems. Es ist nur so, dass in solchen Artikeln unter lauten Schlagzeilen zu oft der Schwerpunkt auf der Implementierung eines minimalen Werkstücks liegt und dieses als Prototyp des Kernels präsentiert wird. Tatsächlich sollten Sie über die Struktur des Kernels und das Zusammenspiel von Teilen des Betriebssystems als Ganzes nachdenken und diesen Prototyp als Standardanwendung „Hallo, Welt!“ in der Welt der Anwendungssoftware betrachten. Als leichte Begründung für diese Kommentare sei gesagt, dass es unten einen Unterabschnitt „Hello, World!“ gibt, dem in diesem Fall genau so viel Aufmerksamkeit geschenkt wird, wie nötig, und nicht mehr.

Es ist nicht erforderlich, einen Bootloader zu schreiben. Intelligente Leute haben die Multiboot-Spezifikation entwickelt, sie implementiert und detailliert beschrieben, was sie ist und wie man sie verwendet. Ich möchte mich nicht wiederholen, ich sage nur, dass es funktioniert, das Leben einfacher macht und dass es genutzt werden sollte. Übrigens ist es besser, die Spezifikation vollständig zu lesen, sie ist klein und enthält sogar Beispiele.

Es ist nicht erforderlich, das Betriebssystem vollständig in Assembler zu schreiben. Das ist nicht so schlimm, ganz im Gegenteil – schnelle und kleine Programme werden immer einen hohen Stellenwert haben. Da die Entwicklung dieser Sprache jedoch deutlich mehr Aufwand erfordert, führt die Verwendung von Assembler nur zu einem Rückgang der Begeisterung und in der Folge dazu, dass die Betriebssystemquellen in eine lange Schublade geworfen werden.

Es ist nicht erforderlich, eine benutzerdefinierte Schriftart in den Videospeicher zu laden und alles auf Russisch anzuzeigen. Das macht keinen Sinn. Es ist viel einfacher und universeller, Englisch zu verwenden und die Schriftart später zu ändern, indem Sie sie von herunterladen Festplatteüber den Dateisystemtreiber (gleichzeitig entsteht ein zusätzlicher Anreiz, mehr zu tun als nur zu starten).

Vorbereitung
Zunächst sollten Sie sich wie immer mit der allgemeinen Theorie vertraut machen, um eine Vorstellung vom bevorstehenden Arbeitsumfang zu bekommen. Gute Quellen zu dem betrachteten Thema sind die Bücher von E. Tanenbaum, die bereits in anderen Artikeln über das Schreiben eines Betriebssystems auf Habré erwähnt wurden. Es gibt auch Artikel, die bestehende Systeme beschreiben, und es gibt verschiedene Leitfäden/Mailings/Artikel/Beispiele/Sites mit Schwerpunkt auf der Betriebssystementwicklung, von denen einige am Ende des Artikels verlinkt sind.

Nach dem ersten Bildungsprogramm müssen Sie sich für die Hauptfragen entscheiden:

  • Zielarchitektur – x86 (realer/geschützter/langer Modus), PowerPC, ARM, ...
  • Kernel/OS-Architektur – Monolith, modularer Monolith, Mikrokernel, Exokernel, verschiedene Hybride
  • Sprache und ihr Compiler - C, C++, ...
  • Kernel-Dateiformat – elf, a.out, coff, binär, ...
  • Entwicklungsumgebung (ja, das spielt auch eine wichtige Rolle) - IDE, vim, emacs, ...
Als nächstes sollten Sie Ihr Wissen je nach gewähltem Thema und in den folgenden Bereichen vertiefen:
  • Videospeicher und die Arbeit damit - die Ausgabe als Betriebsnachweis ist von Anfang an notwendig
  • HAL (Hardware-Abstraktionsschicht) – auch wenn mehrere Hardware-Architekturen unterstützt werden und keine Pläne bestehen, die untersten Teile des Kernels ordnungsgemäß von der Implementierung abstrakter Dinge wie Prozesse, Semaphoren usw. zu trennen, wird dies der Fall sein nicht überflüssig sein
  • Speicherverwaltung – physisch und virtuell
  • Ausführungsmanagement - Prozesse und Threads, ihre Planung
  • Geräteverwaltung – Treiber
  • virtuelle Dateisysteme – um eine einzige Schnittstelle zu den Inhalten verschiedener Dateisysteme bereitzustellen
  • API (Application Programming Interface) – wie genau Anwendungen auf den Kernel zugreifen
  • IPC (Interprocess Communication) – früher oder später müssen Prozesse kommunizieren
Werkzeuge
Unter Berücksichtigung der gewählten Sprache und Entwicklungstools sollten Sie eine Reihe von Dienstprogrammen und deren Einstellungen auswählen, die es in Zukunft durch das Schreiben von Skripten so einfach und schnell wie möglich machen, ein Image zu erstellen, ein Image vorzubereiten und eine virtuelle Maschine zu starten ein Projekt. Schauen wir uns jeden dieser Punkte genauer an:
  • Alle sind für die Montage geeignet Standardmittel, wie make, cmake,... Hier können Skripte für den Linker und (speziell geschriebene) Dienstprogramme zum Hinzufügen eines Multiboot-Headers, Prüfsummen oder für andere Zwecke verwendet werden.
  • Unter Vorbereiten eines Images verstehen wir das Mounten und Kopieren von Dateien. Dementsprechend muss das Bilddateiformat so ausgewählt werden, dass es sowohl vom Dienstprogramm zum Mounten/Kopieren als auch von der virtuellen Maschine unterstützt wird. Natürlich verbietet niemand die Durchführung der Aktionen ab diesem Zeitpunkt, sei es als abschließender Teil der Baugruppe oder als Vorbereitung für den Start des Emulators. Es hängt alles von den konkreten Mitteln und den gewählten Einsatzmöglichkeiten ab.
  • Das Starten einer virtuellen Maschine ist nicht schwierig, Sie müssen jedoch daran denken, zuerst die Bereitstellung des Images aufzuheben (an dieser Stelle müssen Sie die Bereitstellung aufheben, da dieser Vorgang vor dem Starten der virtuellen Maschine keinen wirklichen Sinn macht). Es wäre auch nützlich, ein Skript zu haben, um den Emulator im Debug-Modus zu starten (falls verfügbar).
Wenn alle vorherigen Schritte abgeschlossen sind, sollten Sie schreiben Mindestprogramm, der als Kernel bootet und etwas auf dem Bildschirm ausgibt. Wenn Unannehmlichkeiten oder Mängel der gewählten Mittel festgestellt werden, ist es notwendig, diese (Mängel) zu beseitigen oder im schlimmsten Fall als selbstverständlich hinzunehmen.

In diesem Schritt müssen Sie möglichst viele Funktionen der Entwicklungstools überprüfen, die Sie in Zukunft verwenden möchten. Zum Beispiel das Laden von Modulen in GRUB oder die Verwendung von virtuelle Maschine physische Festplatte/Partition/Flash-Laufwerk anstelle eines Images.

Nachdem diese Phase erfolgreich ist, beginnt die eigentliche Entwicklung.

Bereitstellung von Laufzeitunterstützung
Da vorgeschlagen wird, in Hochsprachen zu schreiben, sollte darauf geachtet werden, einige der Sprachfunktionen zu unterstützen, die normalerweise von den Autoren des Compilerpakets implementiert werden. Für C++ gehören dazu beispielsweise:
  • Funktion für dynamische Auswahl Datenblock auf dem Stapel
  • Arbeiten mit Heap
  • Funktion zum Kopieren von Datenblöcken (memcpy)
  • Die Funktion ist der Einstiegspunkt in das Programm
  • Aufrufe an Konstruktoren und Destruktoren globaler Objekte
  • eine Reihe von Funktionen zum Arbeiten mit Ausnahmen
  • Stub für nicht realisierte rein virtuelle Funktionen
Beim Schreiben von „Hello, World!“ Das Fehlen dieser Funktionen macht sich möglicherweise nicht bemerkbar, aber wenn Code hinzugefügt wird, beginnt der Linker, sich über nicht erfüllte Abhängigkeiten zu beschweren.

Natürlich sollten wir auch die Standardbibliothek erwähnen. Eine vollständige Implementierung ist nicht erforderlich, aber eine Kernteilmenge der Funktionalität lohnt sich. Dann wird das Schreiben von Code viel vertrauter und schneller.

Debuggen
Schauen Sie sich nicht an, was am Ende des Artikels über das Debuggen gesagt wird. Tatsächlich ist dies ein sehr ernstes und schwieriges Problem bei der Betriebssystementwicklung, da herkömmliche Tools hier (mit einigen Ausnahmen) nicht anwendbar sind.

Folgendes können wir empfehlen:

  • Selbstverständlich, Debug-Ausgabe
  • Assert mit sofortigem Ausgang zum „Debugger“ (siehe nächster Absatz)
  • eine Art Konsolen-Debugger
  • Überprüfen Sie, ob der Emulator die Anbindung eines Debuggers, von Symboltabellen oder etwas anderem ermöglicht
Ohne einen im Kernel integrierten Debugger besteht die Gefahr, dass die Suche nach Fehlern zum Albtraum wird. Daher führt kein Weg daran vorbei, es irgendwann in der Entwicklung zu schreiben. Und da dies unvermeidlich ist, ist es besser, im Voraus mit dem Schreiben zu beginnen und so die Entwicklung erheblich zu erleichtern und viel Zeit zu sparen. Es ist wichtig, einen Debugger kernelunabhängig implementieren zu können, damit das Debuggen nur minimale Auswirkungen hat normale Arbeit Systeme. Hier sind einige Arten von Befehlen, die nützlich sein können:
  • Teil der Standard-Debugging-Operationen: Haltepunkte, Aufrufstapel, Werte drucken, Dump drucken, ...
  • Befehle zum Anzeigen verschiedener nützlicher Informationen, wie z. B. der Ausführungswarteschlange des Schedulers oder verschiedener Statistiken (es ist nicht so nutzlos, wie es zunächst scheinen mag)
  • Befehle zur Überprüfung der Konsistenz des Zustands verschiedener Strukturen: Listen des freien/benutzten Speichers, Heap oder Nachrichtenwarteschlange
Entwicklung
Als nächstes ist es notwendig, die Hauptelemente des Betriebssystems zu schreiben und zu debuggen, die im Moment seinen stabilen Betrieb und in Zukunft einfache Erweiterbarkeit und Flexibilität gewährleisten sollen. Zusätzlich zu Speicher-/Prozess-/(alles andere) Managern, der Treiberschnittstelle und Dateisysteme. Deren Gestaltung sollte unter Berücksichtigung der Vielfalt der Gerätetypen/FS mit besonderer Sorgfalt angegangen werden. Mit der Zeit können sie natürlich geändert werden, aber das ist ein sehr schmerzhafter und fehleranfälliger Prozess (und das Debuggen des Kernels ist keine leichte Aufgabe), also denken Sie daran: Denken Sie mindestens zehn Mal über diese Schnittstellen nach, bevor Sie mit der Implementierung beginnen ihnen.
Ähnliches SDK
Im Laufe der Projektentwicklung sollten neue Treiber und Programme hinzugefügt werden. Höchstwahrscheinlich werden bereits beim zweiten Treiber (möglicherweise eines bestimmten Typs)/Programm einige gemeinsame Merkmale auffallen (Verzeichnisstruktur, Assembly-Steuerdateien, Spezifikation von Abhängigkeiten zwischen Modulen, wiederholter Code im Haupt- oder Systemanforderungshandler (z. B. wenn die Treiber selbst ihre Kompatibilität mit dem Gerät prüfen )). Wenn ja, dann ist dies ein Zeichen dafür, dass Vorlagen dafür entwickelt werden müssen verschiedene Arten Programme für Ihr Betriebssystem.

Es ist keine Dokumentation erforderlich, die den Prozess des Schreibens dieses oder jenes Programmtyps beschreibt. Es lohnt sich jedoch, aus Standardelementen einen Rohling zu erstellen. Dadurch wird nicht nur das Hinzufügen von Programmen vereinfacht (was auch durch Kopieren möglich ist). bestehende Programme mit ihrer nachträglichen Änderung, was aber mehr Zeit in Anspruch nehmen wird), aber sie werden auch einfacher zu aktualisieren sein, wenn Änderungen an Schnittstellen, Formaten oder irgendetwas anderem vorgenommen werden. Es ist klar, dass solche Änderungen im Idealfall nicht stattfinden sollten, aber da die Betriebssystementwicklung eine untypische Sache ist, gibt es viele Orte für potenziell falsche Entscheidungen. Aber das Verständnis für den Irrtum der getroffenen Entscheidungen wird sich wie immer erst einige Zeit nach ihrer Umsetzung einstellen.

Weitere Maßnahmen
Kurz gesagt: Informieren Sie sich über Betriebssysteme (und vor allem über deren Design), entwickeln Sie Ihr System (Geschwindigkeit ist nicht wirklich wichtig, die Hauptsache ist, nicht ganz aufzuhören und von Zeit zu Zeit mit Neuem zum Projekt zurückzukehren Stärke und Ideen) und es ist natürlich, Fehler darin zu korrigieren (um sie zu finden, muss man manchmal das System starten und damit „spielen“). Mit der Zeit wird der Entwicklungsprozess immer einfacher, Fehler treten seltener auf und Sie werden in die Liste der „hoffnungslos hartnäckigen“ aufgenommen, der wenigen, die trotz der gewissen Absurdität der Idee, ihre eigene zu entwickeln eigenes Betriebssystem, habe es trotzdem gemacht.

Lernen Sie zunächst das Programmieren. Assembler-Kenntnisse sind erforderlich; Es wird dringend empfohlen, dass Sie auch Verständnis für andere haben weitere Sprachen Programmierung auf niedrigerer Ebene, zum Beispiel C.

Entscheiden Sie, auf welchem ​​Gerät Sie das Betriebssystem laden möchten. Dies kann eine CD, DVD, ein Flash-Speichergerät, eine Festplatte oder ein anderer Computer sein.

Entscheiden Sie, wie Ihr Betriebssystem aussehen soll. Sollte dies die Vollversion des Betriebssystems sein mit grafische Oberfläche Benutzeroberfläche (GUI) oder vielleicht etwas Minimalistischeres? Sie müssen wissen, in welche Richtung Sie gehen müssen, bevor Sie mit dem Prozess beginnen.

Prüfen Sie, welche Prozessorplattform Ihr Betriebssystem unterstützt. AI-32 und x86_64 sind die beiden häufigsten Versionen dafür persönliche Computer Daher können sie als die beste Wahl angesehen werden.

Entscheiden Sie, ob Sie lieber alles von Grund auf selbst machen möchten, oder ob es Kernel gibt, auf deren Basis Sie das System aufbauen möchten. Linux from Scratch ist ein Projekt für diejenigen, die beispielsweise ihre eigene Linux-Distribution erstellen möchten.

Wählen Sie, ob Sie Ihren eigenen Bootloader oder den vorgefertigten Grand Unified Bootloader (GRUB) verwenden möchten. Da das Codieren Ihres eigenen Boot-Programms umfassende Kenntnisse der Computerhardware und des BIOS erfordert, kann es den Programmierplan für den Live-Kernel verschieben.

Treffen Sie eine Entscheidung über die Programmiersprache, die Sie verwenden möchten. Natürlich ist es durchaus möglich, ein Betriebssystem in einer Sprache wie Pascal oder BASIC zu entwickeln, aber es ist besser, es in C oder Assembler zu schreiben. Die Assemblersprache ist unbedingt erforderlich, da einige wichtige Teile des Betriebssystems Kenntnisse dieser bestimmten Sprache erfordern. C++ hingegen enthält Stichworte zum Laufen erforderlich Vollversion Betriebssystem.

  • Um ein Betriebssystem mit C- oder C++-Code zu erstellen, verwenden Sie natürlich den einen oder anderen Compiler. Das bedeutet, dass Sie das Handbuch/die Anleitung/Dokumentation für den ausgewählten C/C++-Compiler lesen müssen, das im Lieferumfang der Software enthalten ist oder auf der Website des Händlers verfügbar ist. Sie müssen viele komplexe Dinge über den Compiler lernen, zusätzlich zu seinem Design und ABI, um C++ zu verbessern. Von Ihnen wird erwartet, dass Sie es verstehen verschiedene Formate Ausführungsaufgaben (ELF, PE, COFF, reguläre Binärdateien usw.) und beachten Sie, dass das native Windows PE-Format (.exe) urheberrechtlich geschützt ist.
  • Wählen Sie An(API). Eine Auswahl guter APIs ist POSIX, da es gut dokumentiert ist. Alle Unix-Systeme unterstützen POSIX zumindest teilweise, daher wäre es trivial, Unix-Programme auf Ihrem Betriebssystem zu bündeln.

    Entscheiden Sie sich für ein Design. Es gibt monolithische Kernel und Mikrokernel. Monolithische Kernel führen alle Dienste im Kernel aus, während Mikrokernel über einen kleinen Kernel verfügen, der mit einer benutzerdefinierten Implementierung von Diensten gekoppelt ist. Im Allgemeinen sind monolithische Kernel schneller, Mikrokernel verfügen jedoch über eine bessere Isolierung und einen besseren Schutz vor möglichen Fehlern.

    Berücksichtigen Sie Entwicklung und Teamarbeit. Auf diese Weise verbringen Sie weniger Zeit mit der Lösung großer Probleme und können ein Betriebssystem erstellen beste Qualität in einem kürzeren Zeitrahmen.

    Löschen Sie Ihre Festplatte nicht vollständig. Denken Sie daran, dass durch das Formatieren der Festplatte alle Ihre Daten dauerhaft gelöscht werden! Verwenden Sie GRUB oder einen anderen Manager, um Ihren Computer dupliziert von einem anderen Betriebssystem aus zu starten, bis Ihre Version voll funktionsfähig ist.

    Fangen Sie klein an. Achten Sie zunächst auf die kleinen Dinge wie Textanzeige und Unterbrechungen, bevor Sie sich komplexen Elementen wie Speicherverwaltung und Multitasking zuwenden.

    Speichern Sicherheitskopie neueste funktionierende Version. Dies bietet eine gewisse Sicherheit für den Fall, dass mit der aktuellen Version Ihres Betriebssystems oder späteren Ergänzungen etwas völlig schief geht. Wenn Ihr Computer ausfällt und nicht mehr booten kann, ist die Verfügbarkeit einer zweiten Kopie, mit der Sie arbeiten können, eine ausgezeichnete Gelegenheit, um die bestehenden Probleme zu beheben.

    Testen Sie Ihr neues Betriebssystem auf einer virtuellen Maschine. Anstatt Ihren Computer jedes Mal neu zu starten, wenn Sie Änderungen vornehmen oder Dateien von Ihrem Produktionscomputer auf die Testmaschine übertragen, können Sie eine Anwendung verwenden, um das Betriebssystem in einer virtuellen Maschine auszuführen, während Ihr aktuelles Betriebssystem weiterhin ausgeführt wird. Zu den VM-Anwendungen gehören VMWare (das auch über einen frei verfügbaren Server verfügt), alternative Open Source, Bochs, Microsoft Virtual PC (nicht kompatibel mit Linux) und XVM VirtualBox.

    Geben Sie eine Release-Version frei. Auf diese Weise können Benutzer Sie über mögliche Fehler in Ihrem Betriebssystem informieren.

  • Das Betriebssystem sollte auch benutzerfreundlich sein, also vergessen Sie nicht, es hinzuzufügen nützliche Funktionen, das ein integraler Bestandteil Ihres Designs wird.

    • Überlegen Sie nach Abschluss der Entwicklung, ob Sie den Code öffentlich verfügbar oder privat machen möchten.
    • Stellen Sie sicher, dass Sicherheitsfunktionen oberste Priorität haben, wenn Sie möchten, dass Ihr System funktionsfähig ist.
    • Starten Sie kein Betriebssystem-Entwicklungsprojekt mit dem Ziel, Programmieren zu lernen. Wenn Sie C, C++, Pascal oder eine der anderen relevanten Sprachen und Funktionen, einschließlich Zeigertypen, Bitoperationen auf niedriger Ebene, Bitumschaltung, Inline-Assembler usw., nicht kennen, sind Sie noch nicht bereit Betriebssystem erstellen.
    • Durchsuchen Sie Portale wie OSDev und OSDever, die Ihnen bei der Verbesserung Ihres eigenen Betriebssystems helfen. Bitte beachten Sie insbesondere, dass die OSDev.org-Community es bei den meisten Problemen vorzieht, dass Sie den Inhalt der Website selbst konsultieren, anstatt einem Forum beizutreten. Sollten Sie sich dennoch dazu entschließen, in die Reihen der Forumsmitglieder aufgenommen zu werden, müssen dafür bestimmte Voraussetzungen gegeben sein. Sie müssen über umfassende Kenntnisse in C oder C++ und der x86-Assemblersprache verfügen. Sie sollten auch allgemeine und komplexe Konzepte in der Programmierung wie verknüpfte Listen, Warteschlangen usw. verstehen. Die OSDev-Community legt in ihren Regeln ausdrücklich fest, dass niemand neue Programmierer betreuen wird. Wenn Sie versuchen, ein Betriebssystem zu entwickeln, ist es selbstverständlich, dass Sie ein Programmierer sind. Sie müssen außerdem das Prozessorhandbuch für die von Ihnen ausgewählte Prozessorarchitektur lesen; zum Beispiel x86 (Intel), ARM, MIPS, PPC usw. Ein solches Nachschlagewerk zum Prozessoraufbau lässt sich leicht über eine Google-Suche („Intel Manuals“, „ARM Manuals“ etc.) finden. Treten Sie nicht dem OSDev.org-Forum bei, um offensichtliche Fragen zu stellen. Dies führt einfach zu Antworten wie „Lesen Sie das verdammte Handbuch.“ Zunächst sollten Sie versuchen, Wikipedia und Handbücher für die verschiedenen Tools zu lesen, die Sie verwenden möchten.
    • Suchen Sie nach möglichen Funklöchern und anderen Fehlern. Lücken, Sackgassen und andere Probleme können sich auf das Design Ihres Betriebssystems auswirken.
    • Wenn Sie einen einfacheren Weg wünschen, stellen Sie sich das vor Linux-Distributionen- wie Fedora Revisor, Custom Nimble X, Puppy Remaster, PCLinuxOS mklivecd oder SUSE Studio und SUSE KIWI. Das erstellte Betriebssystem gehört jedoch dem Unternehmen, das diesen Dienst erstmals eingeführt hat (obwohl Sie unter der GPL das Recht haben, ihn frei zu verteilen, zu ändern und nach Belieben auszuführen).
    • Eine gute Lösung wäre, eine völlig neue Partition für das zu entwickelnde Betriebssystem zu erstellen.

    Warnungen

    • Durch unvorsichtiges Kopieren des Betriebssystems auf die Festplatte kann diese vollständig beschädigt werden. seid vorsichtig
    • Sie werden nicht in zwei Wochen ein komplett fertiges System haben. Beginnen Sie mit einem bootfähigen Betriebssystem und gehen Sie dann zu interessanteren Dingen über.
    • Wenn Sie etwas Rücksichtsloses tun, wie zum Beispiel zufällige Bytes auf zufällige I/O-Ports schreiben, zerstören Sie Ihr Betriebssystem und könnten (theoretisch) Ihre Hardware kaputt machen.
    • Erwarten Sie nicht, dass es einfach ist, ein hochwertiges Betriebssystem zu erstellen. Es gibt viele komplexe Zusammenhänge. Damit das Betriebssystem beispielsweise mehrere Prozessoren verarbeiten kann, muss Ihr Speichermanager über „Sperrmechanismen“ verfügen, um zu verhindern, dass zusätzliche Prozessoren gleichzeitig auf dieselbe Ressource zugreifen. Bei den verwendeten „Blöcken“ handelt es sich um einen Planer, der sicherstellt, dass jeweils nur ein Prozessor auf eine kritische Ressource zugreift, während alle anderen im Leerlauf sind. Die Funktion des Schedulers hängt jedoch von der Anwesenheit des Speichermanagers ab. Dies ist ein Beispiel für eine Deadlock-Abhängigkeit. Es gibt keine Standardmethode zur Lösung solcher Probleme. Von jedem Betriebssystementwickler wird erwartet, dass er über die nötigen Fähigkeiten verfügt, um eine eigene Lösung zu entwickeln.

    Quellen

    Was wirst du brauchen

    • Computer
    • Der Prozessor, auf dem Sie aufbauen werden
    • Ausreichend Rom(RAM) für eine virtuelle Maschine
    • Hauptbetriebssystem (wird für die Entwicklung verwendet Quellcode Monteur (usw.) sowie Montage und Verpackung in den frühen Arbeitsphasen; irgendwann wird Ihr eigenes Betriebssystem zum primären Betriebssystem)
    • Syntax-Farbcode-Editor (wird verwendet, wenn keine integrierte Entwicklungsumgebung vorhanden ist)
    • Compiler
    • CD/DVD-Laufwerk

  • Einer von die besten Wege Um bei jeder Aktivität Zeit zu sparen, muss man ein System dafür schaffen. Der Vorteil liegt darin, dass Sie durch die Automatisierung und Optimierung Ihrer Arbeit produktiver werden und mehr Zeit für andere Aufgaben haben, die Ihnen wichtig sind.

    Ein System ist eine Methode, ein Verfahren oder eine Routine, die erstellt wird, um eine sich wiederholende Aktivität mithilfe einer Strategie auszuführen. Mit Systemen können Sie Ihre Arbeit und Ihr Leben effizienter verwalten.

    Hier sind einige Lebensbereiche, für die Sie Ihr eigenes System erstellen können:

    • Systematisierung.
    • Systematisierung.
    • Systematisierung von Aufgaben zum Bloggen.
    • Systematisierung der Hausreinigung.
    • Systematisierung der Morgen- und Abendroutinen.
    • Systematisierung der E-Mail-Verarbeitung.
    • Systematisierung von Arbeitsaufgaben.

    Mit den folgenden fünf Schritten können Sie für nahezu jede Aktivität Ihr eigenes System erstellen.

    Machen Sie eine Bestandsaufnahme

    Beginnen Sie damit, die Maßnahmen zu identifizieren, die Sie regelmäßig durchführen, sowohl zu Hause als auch am Arbeitsplatz. Analysieren Sie Ihren Tag und schauen Sie sich alle Aktivitäten an, die Ihren Tagesplan ausmachen. Zum Beispiel: morgendliche Vorbereitung auf die Arbeit/Schule, Vorbereitung der Kinder auf die Schule, Fahrt zur Arbeit, Beantwortung von Fragen E-Mails Und Anrufe, Berichte schreiben, abends laufen gehen, Abendessen kochen, einen Blogbeitrag schreiben, Ihr Buch vermarkten usw.

    Gehen Sie zur spezifischen Aufgabenliste für das ausgewählte Element und stellen Sie sich Folgendes:

    • Wie machst du das jetzt?
    • Haben Sie das Gefühl, dass Sie es so effizient wie möglich erledigen?
    • Wo verschwenden Sie viel Zeit?
    • Wo verlierst du Geld?
    • Welche Handlungen haben Sie am meisten verärgert?
    • Was wird derzeit nicht so schnell wie möglich erledigt?
    • Was muss optimiert werden?

    Wählen Sie basierend auf Ihrem Inventar eine Aktivität aus, die Sie organisieren möchten.

    Analysieren Sie, was Sie gerade tun

    Führen Sie die Aktionen, die Sie organisieren möchten, im normalen Verfahren aus (d. h. verhalten Sie sich wie gewohnt). Dokumentieren Sie den Prozess, indem Sie Folgendes aufzeichnen:

    • Welche Schritte unternehmen Sie?
    • Welche Werkzeuge verwenden Sie?
    • Wo gibt es Engpässe (Zeit geht verloren, es kommt ständig zu Verzögerungen, etwas geht schief)?
    • Was enttäuscht Sie?
    • Wie lange dauert es, diese Aktivität abzuschließen?
    • Wie viel kostet das?
    • Welche Ergebnisse erzielen Sie?

    Überprüfen Sie anschließend das erhaltene Dokument und studieren Sie es.

    Planen Sie einen neuen Prozess

    Ein System ist, wie bereits erwähnt, ein Prozess, den Sie erstellen, um Aufgaben zu rationalisieren und die Effizienz zu steigern. Schauen Sie sich Ihr Dokument und die Aktivität an, die Sie optimieren möchten, und stellen Sie sich folgende Fragen:

    • Welches Ergebnis möchten Sie mit dieser Aktivität erreichen? Welches Ziel möchten Sie erreichen? Was ist das ideale Ergebnis?
    • Sind alle Schritte, die Sie unternehmen, notwendig? Können einige davon beseitigt werden?
    • Führen Sie die Schritte in der effizientesten Reihenfolge aus? Würden die Ergebnisse anders ausfallen, wenn Sie die Reihenfolge der Schritte ändern würden?
    • Wie geht das alles schneller?
    • Können Sie eine Checkliste, ein Diagramm usw. erstellen? mentale Karte oder ein Skript für diese Aktivität?
    • Ist es möglich, einige Schritte oder den gesamten Prozess zu automatisieren? Gibt es ein Programm, das man dafür nutzen kann?
    • Können einzelne Schritte oder der gesamte Prozess delegiert werden?
    • Müssen die von Ihnen verwendeten Tools aktualisiert werden?

    Schreiben Sie nun Ihre auf neues System und listet jeden Schritt im Detail auf.

    Führen Sie den Plan aus

    Sobald Sie einen Plan haben, müssen Sie ihn sofort in die Tat umsetzen. Möglicherweise benötigen Sie zunächst die Hilfe anderer oder müssen möglicherweise Software kaufen oder Tools aktualisieren.

    Es ist Zeit, den Prozess auszuführen und seine Funktionsweise zu testen. Tun Sie es und achten Sie auf die Ergebnisse. Stellen Sie sich folgende Fragen:

    • Haben Sie die gewünschten Ergebnisse erzielt?
    • Was funktioniert?
    • Was funktioniert nicht?
    • Wie viel Zeit haben Sie gespart?
    • Wie viel kostet das alles? Ist das System angesichts der Ergebnisse effektiv?
    • Erreichen Sie Ihr Ziel auf die einfachste Art und Weise?
    • Gibt es Lücken im Prozess?
    • Ist eine weitere Optimierung des Prozesses möglich?

    Nehmen Sie alle notwendigen Anpassungen und Änderungen vor. Aktualisieren Sie Ihr System, bis Sie die gewünschten Ergebnisse erhalten.

    Verbessern Sie das System kontinuierlich

    Es lohnt sich, Ihr System ständig zu überwachen, denn in einer Welt, die sich schnell verändert, kann es genauso schnell veraltet sein. Fragen Sie sich immer, ob Verbesserungen erforderlich sind.

    • Funktioniert das System so, wie es soll?
    • Können Sie die Kosten des Systems senken?
    • Können Sie das System noch effizienter machen?
    • Können Sie das System vereinfachen, um bessere Ergebnisse zu erzielen?

    Der Aufbau eines Systems erfordert immer einen Zeitaufwand. Aber wenn Sie zunächst mehr davon ausgeben, als Sie normalerweise ausgeben, werden Sie am Ende deutlich sparen. Und minimieren Sie die Auswirkungen von Betriebsstress.

    Wir wünschen Ihnen viel Glück!