In welcher Art von C ist ein Betriebssystem geschrieben?

Lesezeit: 8 Minuten

Es macht Sinn, dass so etwas wie ein Betriebssystem in C geschrieben wird. Aber wie viel davon und was für ein C? Ich meine, wenn Sie in C etwas Heap-Speicher benötigen, würden Sie malloc aufrufen. Aber tut ein OS sogar haben ein Haufen? Soweit ich weiß malloc fragt das Betriebssystem nach Speicher und fügt es dann einer verknüpften Liste oder einem binären Baum oder so etwas hinzu. Was ist mit einem Call-Stack? Das Betriebssystem ist dafür verantwortlich, all dies einzurichten Sachen die andere Anwendungen verwenden, aber wie macht es das? Wenn Sie eine Datei in C öffnen oder erstellen möchten, stehen Ihnen die entsprechenden Funktionen zur Verfügung fragen Sie das Betriebssystem für diese Datei. Also … Welche Art von C ist auf der anderen Seite dieses Anrufs? Oder am anderen Ende einer Speicherzuweisung?

Und wie viel von einem Betriebssystem würde eigentlich in C geschrieben werden? Alles davon? Was ist mit architekturabhängigem Code? Was ist mit den höheren Abstraktionsebenen – wird das jemals in höheren Programmiersprachen wie C++ geschrieben?

Ich meine, ich frage das nur aus reiner Neugier. Ich lade gerade den neuesten Linux-Kernel herunter, aber es dauert ewig. Ich bin mir nicht sicher, ob ich am Ende in der Lage sein werde, dem Code zu folgen – oder ob ich in einem unausweichlich komplexen Netz von Dingen gefangen sein werde, die ich noch nie zuvor gesehen habe.

  • Vielleicht ist das von Interesse: http://stackoverflow.com/questions/43180/how-to-get-started-in-operating-system-development

    – Knall

    8. Juli 2009 um 7:57 Uhr

  • Abstimmung zum Schließen als zu breit oder meinungsbasiert. Wenn es “Was ist in OS XXX geschrieben” wäre, wäre es beantwortbar. Für jedes Betriebssystem, jede kompilierte Sprache mit asm() kann verwendet werden.

    – Ciro Santilli OurBigBook.com

    15. August 2015 um 20:27 Uhr

  • “vor 6 Jahren aktiv” :/

    – Carson Myers

    15. August 2015 um 20:30 Uhr

Benutzeravatar von cygil
Cygil

Ausgezeichnete Fragen, alle. Die Antwort lautet: Wenig bis gar keine Standard-C-Bibliothek ist im „Dialekt“ von C verfügbar, der zum Schreiben eines Betriebssystems verwendet wird. Im Linux-Kernel werden beispielsweise die Standard-Speicherzuweisungsfunktionen malloc, nmalloc, free usw. durch spezielle Kernel-interne Speicherzuweisungsfunktionen kmalloc und kfree mit besonderen Einschränkungen in der Verwendung ersetzt. Das Betriebssystem muss seinen eigenen „Heap“ bereitstellen – im Linux-Kernel müssen physische Speicherseiten, die für die Verwendung durch den Kernel zugewiesen wurden, nicht auslagerbar und oft physisch zusammenhängend sein. Sehen Dieser Linux-Journalartikel über kmalloc und kfree. In ähnlicher Weise verwaltet der Kernel des Betriebssystems seinen eigenen speziellen Call-Stack, dessen Verwendung aus dem Gedächtnis eine spezielle Unterstützung durch den GCC-Compiler erfordert.

Und wie viel von einem Betriebssystem würde eigentlich in C geschrieben werden? Alles davon?

Soweit mir bekannt ist, sind Betriebssysteme überwiegend in C geschrieben. Einige architekturspezifische Funktionen sind in Assembler codiert, aber normalerweise sehr wenig, um die Portabilität und Wartbarkeit zu verbessern: Der Linux-Kernel hat etwas Assembler, versucht aber, ihn so weit wie möglich zu minimieren möglich.

Was ist mit architekturabhängigem Code? Was ist mit den höheren Abstraktionsebenen – wird das jemals in höheren Programmiersprachen wie C++ geschrieben?

Normalerweise wird der Kernel in reinem C geschrieben, aber manchmal sind die übergeordneten Frameworks und APIs in einer höheren Programmiersprache geschrieben. Zum Beispiel ist das Cocoa-Framework/API auf MacOS in Objective C geschrieben, und die BeOS-APIs auf höherer Ebene wurden in C++ geschrieben. Ein Großteil des .NET-Frameworks von Microsoft wurde in C# geschrieben, wobei die „Common Language Runtime“ in einer Mischung aus C++ und Assembler geschrieben wurde. Das unter Linux am häufigsten verwendete QT-Widget-Set ist in C++ geschrieben. Dies führt natürlich zu philosophischen Fragen darüber, was als „das Betriebssystem“ gilt.

Der Linux-Kernel ist definitiv einen Blick wert, obwohl er, wie gesagt werden muss, riesig und für jeden einschüchternd ist, ihn von Grund auf zu lesen.

  • Wenn Sie sagen, dass der Kernel normalerweise in C geschrieben ist, lässt dies eines der wichtigsten Betriebssysteme aus, nämlich Windows, das ein hybrider C- und C++-Kernel ist; Der Ausführungsteil (NT) ist in C geschrieben, aber der Win32-Teil des Kernels (der sich hauptsächlich in win32k.sys befindet und für Schriftarten, Fenster, Grafiken, DirectX usw. verantwortlich ist) ist hauptsächlich in C++ geschrieben.

    – SicherheitsMatt

    5. Dezember 2012 um 21:37 Uhr

Benutzeravatar von Michael Sofaer
Michael Sofaer

Was für ein C?

Hauptsächlich ANSI C, mit viel Zeit für die Betrachtung des generierten Maschinencodes.

Aber hat ein Betriebssystem überhaupt einen Haufen?

Malloc fragt das Betriebssystem nach einem Zeiger auf einen Speicher, den es verwenden darf. Wenn ein Programm, das auf einem Betriebssystem (Benutzermodus) ausgeführt wird, versucht, auf Speicher zuzugreifen, der ihm nicht gehört, gibt es einen Segmentierungsfehler aus. Ein Betriebssystem darf direkt auf den gesamten physischen Speicher des Systems zugreifen, Malloc ist nicht erforderlich, keine Seg-Fehler an einer beliebigen Adresse.

Was ist mit einem Call-Stack?

Tatsächlich arbeitet der Aufrufstapel oft auf Hardwareebene mit einem Verbindungsregister.

Für den Dateizugriff benötigt das Betriebssystem Zugriff auf einen Festplattentreiber, der wissen muss, wie das Dateisystem auf der Festplatte gelesen werden kann (es gibt viele verschiedene Arten). Manchmal hat das Betriebssystem eines eingebaut, aber ich denke, es ist häufiger dass der Bootloader ihm zunächst einen übergibt und einen anderen (größeren) lädt. Der Festplattentreiber hat Zugriff auf die Hardware-E/A der physischen Festplatte und baut darauf auf.

Benutzeravatar von amazingsaint
verblüffter Heiliger

C ist eine Sprache auf sehr niedrigem Niveau, und Sie können viele Dinge direkt tun. Alle Methoden der C-Bibliothek (wie malloc, printf, crlscr ​​usw.) müssen zuerst implementiert werden, um sie von C aus aufzurufen (siehe zum Beispiel libc-Konzepte). Ich gebe unten ein Beispiel.

Lassen Sie uns sehen, wie die Methoden der C-Bibliothek unter der Haube implementiert werden. Wir gehen von einem clrscr-Beispiel aus. Wenn Sie solche Methoden implementieren, greifen Sie direkt auf Systemgeräte zu. Zum Beispiel wissen wir für clrscr (Löschen des Bildschirms), dass sich der Videospeicher auf 0xB8000 befindet. Um auf den Bildschirm zu schreiben oder ihn zu löschen, beginnen wir damit, dieser Stelle einen Zeiger zuzuweisen.

In video.c

void clrscr()
{

   unsigned char *vidmem = (unsigned char *)0xB8000;
   const long size = 80*25;
   long loop;

   for (loop=0; loop<size; loop++) {
      *vidmem++ = 0;
      *vidmem++ = 0xF;
   }
}

Lassen Sie uns jetzt unseren Mini-Kernel schreiben. Dadurch wird der Bildschirm gelöscht, wenn die Steuerung vom Bootloader an unseren „Kernel“ übergeben wird. In main.c

void main()
{
   clrscr();
   for(;;);
}

Um unseren „Kernel“ zu kompilieren, können Sie gcc verwenden, um ihn in ein reines Bin-Format zu kompilieren.

gcc -ffreestanding -c main.c -o main.o
gcc -c video.c -o video.o
ld -e _main -Ttext 0x1000 -o kernel.o main.o video.o
ld -i -e _main -Ttext 0x1000 -o kernel.o main.o video.o
objcopy -R .note -R .comment -S -O binary kernel.o kernel.bin

Wenn Sie die ld-Parameter oben bemerkt haben, sehen Sie, dass wir den Standardladeort Ihres Kernels als 0x1000 angeben. Jetzt müssen Sie einen Bootloader erstellen. Von Ihrer Bootloader-Logik möchten Sie vielleicht die Kontrolle an Ihren Kernel übergeben, wie z

jump 08h:01000h

Normalerweise schreiben Sie Ihre Bootloader-Logik in Asm. Schon vorher müssen Sie sich vielleicht ansehen, wie ein PC bootet – Klicken Sie hier.

Beginnen Sie besser mit einem kleineren Betriebssystem, das Sie erkunden können. Sehen Sie sich dieses Roll Your Own OS Tutorial an

http://www.acm.uiuc.edu/sigops/roll_your_own/

Aber wie viel davon und was für ein C?

Einige Teile müssen in Assembler geschrieben werden

Ich meine, wenn Sie in C etwas Heap-Speicher benötigen, würden Sie malloc aufrufen. Aber hat ein Betriebssystem überhaupt einen Haufen? Soweit ich weiß, fragt malloc das Betriebssystem nach Speicher und fügt ihn dann einer verknüpften Liste oder einem Binärbaum oder so etwas hinzu.

Einige Betriebssysteme haben einen Haufen. Auf der untersten Ebene handelt es sich um Speicherplatten, die als Seiten bezeichnet werden. Ihre C-Bibliothek partitioniert dann mit ihrem eigenen Schema in variabler Größe mit malloc. Sie sollten etwas über den virtuellen Speicher lernen, der ein gängiges Speicherschema in modernen Betriebssystemen ist.

Wenn Sie eine Datei in C öffnen oder erstellen möchten, fragen die entsprechenden Funktionen das Betriebssystem nach dieser Datei. Also … Welche Art von C ist auf der anderen Seite dieses Anrufs?

Sie rufen Assembler-Routinen auf, die Hardware mit Anweisungen wie IN und OUT abfragen. Beim Rohspeicherzugriff haben Sie manchmal Speicherbereiche, die für die Kommunikation mit und von Hardware bestimmt sind. Dies wird DMA genannt.

Ich bin mir nicht sicher, ob ich am Ende in der Lage sein werde, dem Code zu folgen – oder ob ich in einem unausweichlich komplexen Netz von Dingen gefangen sein werde, die ich noch nie zuvor gesehen habe.

Ja du wirst. Sie sollten sich zuerst ein Buch über Hardware und Betriebssysteme besorgen.

Benutzeravatar von John Smith
John Smith

Ich meine, wenn Sie in C etwas Heap-Speicher benötigen, würden Sie malloc aufrufen. Aber hat ein Betriebssystem überhaupt einen Haufen? Soweit ich weiß, fragt malloc das Betriebssystem nach Speicher und fügt ihn dann einer verknüpften Liste oder einem Binärbaum oder so etwas hinzu. Was ist mit einem Call-Stack?

Vieles, was Sie in Ihrer Frage sagen, wird tatsächlich von der Laufzeitbibliothek im Userspace ausgeführt.

Alles, was das Betriebssystem tun muss, ist, das Programm in den Speicher zu laden und zu seinem Einstiegspunkt zu springen, die meisten Details danach können vom Benutzer-Space-Programm erledigt werden. Heap und Stack sind nur Bereiche des virtuellen Speichers des Prozesses. Stack ist nur ein Zeigerregister in der CPU.

Die Zuweisung von physischem Speicher erfolgt auf Betriebssystemebene. Das Betriebssystem weist normalerweise Seiten mit fester Größe zu, die dann einem Benutzerbereichsprozess zugeordnet werden.

Benutzeravatar von fa
Fa.

Sie sollten die lesen Linux-Gerätetreiber 3. Es erklärt ziemlich gut die Interna des Linux-Kernels.

Benutzeravatar von Macarse
Macarse

Ich würde nicht anfangen, den Linux-Kernel zu lesen, er ist für den Anfang zu kompliziert.

Osdev ist ein ausgezeichneter Ort, um mit dem Lesen zu beginnen. Ich habe ein kleines OS mit Informationen von Osdev für ein Schulfach gemacht. Es läuft auf vmware, bochs und qemu, sodass es einfach zu testen ist. Hier ist der Quellcode.

  • PintOs aus Stanford ist auch ein guter Ausgangspunkt … (ersetzt Nachos)

    – LB40

    8. Juli 2009 um 12:49 Uhr

1408610cookie-checkIn welcher Art von C ist ein Betriebssystem geschrieben?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy