Lowlevel

Lowlevel => OS-Design => Thema gestartet von: woigl am 21. August 2005, 08:11

Titel: GLIBC implementation
Beitrag von: woigl 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?
Titel: GLIBC implementation
Beitrag von: Legend 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?
Titel: GLIBC implementation
Beitrag von: woigl 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?
Titel: GLIBC implementation
Beitrag von: Legend 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?
Titel: GLIBC implementation
Beitrag von: woigl 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?
Titel: GLIBC implementation
Beitrag von: Legend 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.
Titel: GLIBC implementation
Beitrag von: woigl 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?!  :?:
Titel: GLIBC implementation
Beitrag von: Legend 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.
Titel: GLIBC implementation
Beitrag von: woigl 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!
Titel: GLIBC implementation
Beitrag von: SSJ7Gohan 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.
Titel: GLIBC implementation
Beitrag von: woigl 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.
Titel: GLIBC implementation
Beitrag von: woigl 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?
Titel: GLIBC implementation
Beitrag von: Legend 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! ;)
Titel: GLIBC implementation
Beitrag von: woigl 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?
Titel: GLIBC implementation
Beitrag von: SSJ7Gohan 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.
Titel: GLIBC implementation
Beitrag von: Legend 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.
Titel: GLIBC implementation
Beitrag von: woigl 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?
Titel: GLIBC implementation
Beitrag von: Legend 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! ;)
Titel: GLIBC implementation
Beitrag von: woigl 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?
Titel: GLIBC implementation
Beitrag von: SSJ7Gohan 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.
Titel: GLIBC implementation
Beitrag von: Legend am 25. August 2005, 18:41
Nun ja, bei mir ist eine sinnvolle Abstraktion Objekte statt Dateien (das ist nicht mal besonders einfallsreich). Objekte existieren und ich kann Methoden in ihnen aufrufen - das dürfte schon auf alles zutreffen. Ähnliche Objekte haben dann die selben Methoden die man benutzen kann - so erreicht man da wo es nötig ist, spezielle APIs, und da wo es sinnvoll ist, gemeinsame APIs.

Allerdings spezifiziert ein Objekt zu sein aber auch nicht wirklich viel, so dass man sich noch Gedanken mit der Schicht darüber machen muss.
Titel: GLIBC implementation
Beitrag von: woigl am 25. August 2005, 18:48
Zitat von: Legend
Nun ja, bei mir ist eine sinnvolle Abstraktion Objekte statt Dateien (das ist nicht mal besonders einfallsreich). Objekte existieren und ich kann Methoden in ihnen aufrufen - das dürfte schon auf alles zutreffen. Ähnliche Objekte haben dann die selben Methoden die man benutzen kann - so erreicht man da wo es nötig ist, spezielle APIs, und da wo es sinnvoll ist, gemeinsame APIs.

Allerdings spezifiziert ein Objekt zu sein aber auch nicht wirklich viel, so dass man sich noch Gedanken mit der Schicht darüber machen muss.


Nun so weit ich dein OS gesehen habe verwendest du Corba...
Titel: GLIBC implementation
Beitrag von: Legend am 25. August 2005, 21:29
Nun hatte ich zumindestens vor, weil es genau sowas auch bereitstellt!
Wobei evtl. auch andere der Systeme interessant sind ... der Ansatz ist schon mal der wichtigste Teil ;)
Titel: GLIBC implementation
Beitrag von: Another Stupid Coder am 28. August 2005, 16:43
Zu der Sache mit dem Standard-C: Ich würde da eher TCC verwenden, der ist kleiner und leichter portabel, würde ich meinen.