Autor Thema: GLIBC implementation  (Gelesen 23430 mal)

woigl

  • Beiträge: 93
    • Profil anzeigen
    • http://www.nogos.org
Gespeichert
« am: 21. August 2005, 08:11 »
Um mein OS portabel zu halten empfielt es sich ja sich an die GLIBC zu halten und diese im eigenen Kernel zu implementieren.

Dabei fehlt mir aber noch ein wenig das verstaendniss wie die GLIBC Funktionen von einer Applikation mit dem Kernel kommunizieren. Wie hat Linux dies realisiert?

Legend

  • Beiträge: 635
    • Profil anzeigen
    • http://os.joachimnock.de
Gespeichert
« Antwort #1 am: 21. August 2005, 10:20 »
http://www.tldp.org/LDP/khg/HyperNews/get/syscall/syscall86.html

Obwohl das scheinbar vor 2.6er Zeiten geschrieben wurde, da man soweit ich weiss keine eigenen Syscalls mehr hinzufügen darf.

Aber wieso wird ein OS portabler wenn es sich an die glibc hält???
Enthält die nicht auch einen Teil Posix?
*post*

woigl

  • Beiträge: 93
    • Profil anzeigen
    • http://www.nogos.org
Gespeichert
« Antwort #2 am: 21. August 2005, 11:05 »
Zitat von: Legend
http://www.tldp.org/LDP/khg/HyperNews/get/syscall/syscall86.html

Obwohl das scheinbar vor 2.6er Zeiten geschrieben wurde, da man soweit ich weiss keine eigenen Syscalls mehr hinzufügen darf.

Aber wieso wird ein OS portabler wenn es sich an die glibc hält???
Enthält die nicht auch einen Teil Posix?


Ja und genau da verliere ich den Überblick...

...also mal als Beispiel will ich den GCC unter meinem OS laufen lassen... ...was benötigt dazu mein Kernel alles?

Legend

  • Beiträge: 635
    • Profil anzeigen
    • http://os.joachimnock.de
Gespeichert
« Antwort #3 am: 21. August 2005, 11:12 »
Ich glaub eher du willst zu deinem Kernel ne passende C Bibliothek mitliefern - oder willst du nen 2. Linux Kernel machen?
*post*

woigl

  • Beiträge: 93
    • Profil anzeigen
    • http://www.nogos.org
Gespeichert
« Antwort #4 am: 21. August 2005, 11:24 »
Zitat von: Legend
Ich glaub eher du willst zu deinem Kernel ne passende C Bibliothek mitliefern - oder willst du nen 2. Linux Kernel machen?


nein keinen 2ten Linux Kernel sondern einen Kernel der Ansi C versteht - und somit denke ich das der gcc portierbar sein müsste... oder?

Legend

  • Beiträge: 635
    • Profil anzeigen
    • http://os.joachimnock.de
Gespeichert
« Antwort #5 am: 21. August 2005, 11:40 »
Nun gut, um gcc zu bauen hat man schon das Problem das man ./configure vorbeikommen muss - was ein riesiges shell Script ist. Von daher erwarten einen beim gcc noch ganz andere Probleme.

Was den Standard selber angeht, so finde ich grad nix sinnvolles, nur Änderungen zum Vorgänger und Kritik an dem Standard.
*post*

woigl

  • Beiträge: 93
    • Profil anzeigen
    • http://www.nogos.org
Gespeichert
« Antwort #6 am: 21. August 2005, 12:55 »
Zitat von: Legend
Nun gut, um gcc zu bauen hat man schon das Problem das man ./configure vorbeikommen muss - was ein riesiges shell Script ist. Von daher erwarten einen beim gcc noch ganz andere Probleme.

Was den Standard selber angeht, so finde ich grad nix sinnvolles, nur Änderungen zum Vorgänger und Kritik an dem Standard.


Okay, aber wenn ich dich richtig verstanden habe muß ich eigentlich nur den ANSI C Standard einbauen... um somit mehr oder weniger kompatibel zu sein?!  :?:

Legend

  • Beiträge: 635
    • Profil anzeigen
    • http://os.joachimnock.de
Gespeichert
« Antwort #7 am: 21. August 2005, 13:13 »
Sagen wir mal so - ohne ANSI C Funktion wird genau KEIN Programm von einer anderen Platform laufen. Weil eigentlich jedes Linux, jedes Windowsprogramm irgendwo diese Funktionen benutzt.

Für mehr Kompatibilität müsstest du noch mehr unterstützen - und dann geht es auch schon meistens direkt ans Design! ;)

Je kompatibler man ist, desto weniger innovativ kann man sein.
*post*

woigl

  • Beiträge: 93
    • Profil anzeigen
    • http://www.nogos.org
Gespeichert
« Antwort #8 am: 21. August 2005, 16:17 »
Zitat von: Legend
Sagen wir mal so - ohne ANSI C Funktion wird genau KEIN Programm von einer anderen Platform laufen. Weil eigentlich jedes Linux, jedes Windowsprogramm irgendwo diese Funktionen benutzt.

Für mehr Kompatibilität müsstest du noch mehr unterstützen - und dann geht es auch schon meistens direkt ans Design! ;)

Je kompatibler man ist, desto weniger innovativ kann man sein.


okay, muss dir hierbei recht geben... ...man sollte doch innovativ bleiben!

SSJ7Gohan

  • Beiträge: 398
    • Profil anzeigen
Gespeichert
« Antwort #9 am: 21. August 2005, 16:56 »
Naja, man kann aber die POSIX Funktionen immernoch als eine Art Wrapper einbauen, so wie Cygwin das macht.

Das ./configure Problem kann man lösen, indem man gcc cross-compiliert.
Man erstellt die Executeable einfach unter Linux und portet sich dann eine einfache shell, dann sollte sich auch ./configure ausführen lassen. So schwer sollte das eigentlich garnicht sein, GCC auf einem Hobby-OS laufen zu lassen, denn der GCC ist eigentlich sehr portabel gecodet.

woigl

  • Beiträge: 93
    • Profil anzeigen
    • http://www.nogos.org
Gespeichert
« Antwort #10 am: 21. August 2005, 17:10 »
Jep, das mit den Wrapper ist cool...

Ja mal sehen - werds dann mal versuchen den GCC rueber zu bringen.

woigl

  • Beiträge: 93
    • Profil anzeigen
    • http://www.nogos.org
Gespeichert
« Antwort #11 am: 25. August 2005, 11:50 »
Ich habe da aber noch eine ganz spezifische Frage und versuche diese nun so gut als möglich zu erklären...

Also ich habe erstens einen Kernel und dann eine Bibliothek welche im C geschrieben ist. Diese Bibliothek wird dann bei Programmen dazu gelinkt und muss Kernel Funktionen ausführen. Nehmen wir als Beispiel mal einen Dateizugriff her, da das Dateisystem im Kernel implementiert ist muß ich ja aus der Bibliothek irgendwie darauf zugreifen. Wie kann man dies effektiv realisieren?

Wie wird das bei anderen OS gemacht?

Legend

  • Beiträge: 635
    • Profil anzeigen
    • http://os.joachimnock.de
Gespeichert
« Antwort #12 am: 25. August 2005, 12:44 »
Bei Unixen generell z.B. ist open ein Systemaufruf, dementsprechend kann man z.B. bei Linux den Syscall-ISR aufrufen mit den richtigen Parametern! ;)
*post*

woigl

  • Beiträge: 93
    • Profil anzeigen
    • http://www.nogos.org
Gespeichert
« Antwort #13 am: 25. August 2005, 13:55 »
Zitat von: Legend
Bei Unixen generell z.B. ist open ein Systemaufruf, dementsprechend kann man z.B. bei Linux den Syscall-ISR aufrufen mit den richtigen Parametern! ;)


okay aber wie sieht es mit scanf aus? wie werden die Daten hin und her gegeben?

SSJ7Gohan

  • Beiträge: 398
    • Profil anzeigen
Gespeichert
« Antwort #14 am: 25. August 2005, 14:01 »
Ich würde persönlich nur die Elementaren Funktionen in den Kernel packen (wenn du einen Monolitischen Kernel machst). Das heißt also, Funktionen wie open, read, write, close und andere io funktionen würde ich in den Kernel machen. Die Auswertung der Ausgabe oder Eingabe würde ich jedoch von der lib machen lassen. Das hat den Vorteil, das es flexibler ist, und sich einfacher auf andere Umgebungen als C portieren lässt.

Legend

  • Beiträge: 635
    • Profil anzeigen
    • http://os.joachimnock.de
Gespeichert
« Antwort #15 am: 25. August 2005, 14:30 »
Zitat von: woigl
Zitat von: Legend
Bei Unixen generell z.B. ist open ein Systemaufruf, dementsprechend kann man z.B. bei Linux den Syscall-ISR aufrufen mit den richtigen Parametern! ;)


okay aber wie sieht es mit scanf aus? wie werden die Daten hin und her gegeben?


Von deinem Terminal liest du per stdin, was dort eine Datei ist. Also benutzt du den read syscall, wie bei Dateien, und die C Lib verarbeitet das dann weiter - ich muss allerdings sagen das ich noch kein Linux gesehen habe das nicht irgendwo nach ner Menge SSH, su, lokal anmelden usw. doch irgendwann mal lustige Zeichen bei manchen speziellen Tasten produziert hat. Deswegen würde ich diesen simplen Ansatz überdenken.
*post*

woigl

  • Beiträge: 93
    • Profil anzeigen
    • http://www.nogos.org
Gespeichert
« Antwort #16 am: 25. August 2005, 15:20 »
Zitat von: Legend
Zitat von: woigl
Zitat von: Legend
Bei Unixen generell z.B. ist open ein Systemaufruf, dementsprechend kann man z.B. bei Linux den Syscall-ISR aufrufen mit den richtigen Parametern! ;)


okay aber wie sieht es mit scanf aus? wie werden die Daten hin und her gegeben?


Von deinem Terminal liest du per stdin, was dort eine Datei ist. Also benutzt du den read syscall, wie bei Dateien, und die C Lib verarbeitet das dann weiter - ich muss allerdings sagen das ich noch kein Linux gesehen habe das nicht irgendwo nach ner Menge SSH, su, lokal anmelden usw. doch irgendwann mal lustige Zeichen bei manchen speziellen Tasten produziert hat. Deswegen würde ich diesen simplen Ansatz überdenken.


Okay, klingt mal ganz gut... wie sieht es dann mit Windows aus? Wie machen es die MS Leute?

Legend

  • Beiträge: 635
    • Profil anzeigen
    • http://os.joachimnock.de
Gespeichert
« Antwort #17 am: 25. August 2005, 16:51 »
Also ich meine, wobei ich mir da nicht ganz sicher bin, das es bei MS viel mehr Syscalls gibt, evtl. auch für spezielle für Terminals. Auch unschön.

...

Wieso "auch"?

Weil das Konzept alles als Dateien anbieten zu wollen wie bei Unix (und damit auch bei Linux) fehlerhaft ist. Grundsätzlich ist es gut, zu versuchen einheitliche Werkzeuge anzubieten - aber nur dort wo Dinge auch überhaupt einheitlich behandelt werden können. So macht z.B. seek auf stdin oder auf deiner Netzwerkkarte keinen Sinn. Im Bereich der Geräteprogrammierung hat man sowieso dadurch nichts gewonnen, weil man für die interessanten Sachen sowieso geräteklassen-spezifische ioctls benutzen muss (ioctl ist auch ein Syscall).

Deswegen - wähle eine sinnvollere Abstraktion! ;)
*post*

woigl

  • Beiträge: 93
    • Profil anzeigen
    • http://www.nogos.org
Gespeichert
« Antwort #18 am: 25. August 2005, 17:47 »
Zitat von: Legend
Also ich meine, wobei ich mir da nicht ganz sicher bin, das es bei MS viel mehr Syscalls gibt, evtl. auch für spezielle für Terminals. Auch unschön.

...

Wieso "auch"?

Weil das Konzept alles als Dateien anbieten zu wollen wie bei Unix (und damit auch bei Linux) fehlerhaft ist. Grundsätzlich ist es gut, zu versuchen einheitliche Werkzeuge anzubieten - aber nur dort wo Dinge auch überhaupt einheitlich behandelt werden können. So macht z.B. seek auf stdin oder auf deiner Netzwerkkarte keinen Sinn. Im Bereich der Geräteprogrammierung hat man sowieso dadurch nichts gewonnen, weil man für die interessanten Sachen sowieso geräteklassen-spezifische ioctls benutzen muss (ioctl ist auch ein Syscall).

Deswegen - wähle eine sinnvollere Abstraktion! ;)


Ja aber genau das ist der Punkt - welche Abstraktionen sind sinnvoll?

bzw. wie sieht ein Beispiel mit einem Syscall aus?

SSJ7Gohan

  • Beiträge: 398
    • Profil anzeigen
Gespeichert
« Antwort #19 am: 25. August 2005, 18:26 »
Also, ich finde es gut, Dateien, Sockets, Pipes, Terminals usw. über I/O Streams anzusprechen. Bei shared memory, Treibern(/dev/) usw. macht das IMHO überhaupt keinen Sinn. Geräte/Komponenten die in etwa das gleiche machen, sollten über die selbe Schnittstelle ansprechbar sein. Andere Resourcen wie shared memory, sollten nicht über dasselbe Interface angesprochen werden.

Windows hat eigene API Funktionen, um auf die Konsole zu schreiben und von ihr zu lesen.

 

Einloggen