Beiträge anzeigen

Diese Sektion erlaubt es dir alle Beiträge dieses Mitglieds zu sehen. Beachte, dass du nur solche Beiträge sehen kannst, zu denen du auch Zugriffsrechte hast.


Nachrichten - SSJ7Gohan

Seiten: 1 ... 17 18 [19] 20
361
OS-Design / Implementation von Kernelmodulen
« am: 21. June 2005, 16:10 »
Ausserdem müsste ich dann bei systemcalls wie z.B. einer read-Operation Daten zwischen Prozessen kopieren, und das ist meiner Meinung nach zu langsam. ^^

An einen festgelegten Ort möchte ich die Module auch nicht laden, da mir das zu unflexibel ist. Ich werde mir dann mal Relocatables im ELF Format ansehen.
362
OS-Design / Implementation von Kernelmodulen
« am: 20. June 2005, 21:19 »
Hio,
ich habe einen Microkernel, der die Prozessverwaltung und das Memorymanagement übernimmt. Jetzt möchte ich Kernel-Module laden und entladen können die dann in alle Prozesse gemappt werden und vom Kernel über einfache Calls aufgerufen werden sollen. Ich möchte die wichtigsten Treiber nicht als eigene Prozesse laufen lassen, da das die Performance erheblich beeinträchtigen würde.
Mein Problem liegt gedoch darin, wie ich die Kernel-Module laden und ausführen soll:
Normalerweise werden die Programme ja so gelinkt, das sie im Speicher an einer bestimmten Stelle stehen (Text Segment beginnt bei 0x12345 usw. ). Bei den Kernelmodulen weiß ich jedoch erst zur Laufzeit, wohin sie geladen werden. Wie ist es also möglich, sie zu laden? Ich müsste sie ja zur Laufzeit dynamisch linken, weiß jemand, wie das geht? Oder gibt es noch andere Möglichkeiten, die nicht allzu stark die Performance beeinflussen?

mfg,
SSJ7Gohan
363
Offtopic / Linuxsockets
« am: 20. June 2005, 16:55 »
Non-Blocking IO ist aber schlechter als select(), da man sonst auf alles Sockets lesen muss, wogegen man bei select() nur von den Sockets ließt, wo auch tatsächlich Daten zur Verfügung stehen.
Eigene Threads oder Prozesse sind warscheinlich für deine Anwendung die beste Möglichkeit, die sind jedoch nicht portabel und schwerer zu handhaben.
364
Offtopic / Linuxsockets
« am: 20. June 2005, 15:58 »
Unter UNIX ist select() sogar noch mächtiger als unter Windows, da man so alle Filedescriptoren überprüfen kann.

Beispielcode:
#include <sys/types.h>
#include <sys/stat.h>

// auf manchen systemen braucht man select.h

timeval timeout;
fd_set set;

// timeout auf 0 um nicht zu blockieren
timeout.tv_sec = 0;
timeout.tv_usec = 0;

// fd_set leeren
FD_ZERO( &set );

// alle descriptoren hinzufügen
FD_SET( STDIN_FILENO, &set );

// select ausführen
// 1. parameter = höchster filedescriptor + 1
// 2. parameter = fd_set für read
// 3. parameter = fd_set für write
// 4. parameter = fd_set für error
// 5. parameter = timeout

select( STDIN_FILENO + 1, &set, 0, 0, timeout );

// überprüfen ob daten verfügbar sind:
if( FD_ISSET( STDIN_FILENO, &set ) ) {
//daten lesen
}


Das timeout und das fdset sollte vor jedem select neu gesetzt werden, da es von der implementierung überschrieben werden kann.

Wenn eine Verbindung ankommt, kannst du das überprüfen, indem du mit select() überprüfst, ob auf einem socket daten zum lesen verfügbar sind.
365
Lowlevel-Coding / Keyboard treiber und C/C++
« am: 15. June 2005, 21:21 »
wenn du den header von c aus includest darfst du extern "C" nicht benutzen, da es eine solche Konstruktion in C nicht gibt.

Ich würde das mit bedingter Kompilierung machen:
#ifdef __cplusplus
extern "C" {
#endif

// hier stehen deine c++ funktions-prototypen

#ifdef __cplusplus
}
#endif
366
Lowlevel-Coding / Keyboard treiber und C/C++
« am: 15. June 2005, 20:45 »
Du hast in der Headerfile kein extern "C" angegeben, in der C++ File schon. Du musst extern "C" in der Headerfile angeben, wenn du die Funktion in einer Headerfile deklarierst.
367
Lowlevel-Coding / Keyboard treiber und C/C++
« am: 15. June 2005, 19:21 »
Nein, du deklarierst sie im .cpp file als extern "C".

@Golum
Dann kannst du auch gleich im Headerfile folgendes verwenden:

#ifdef __cplusplus
extern "C" {
#endif

[...]
#ifdef __cplusplus
}
#endif
368
Lowlevel-Coding / Keyboard treiber und C/C++
« am: 15. June 2005, 18:39 »
Wenn man die Funktion als static deklariert darf sie auch innerhalb einer Klasse sein.

Ausserdem kann man mit NASM keine GCC Compiler Builtins benutzen.^^
369
Lowlevel-Coding / Keyboard treiber und C/C++
« am: 15. June 2005, 18:11 »
Das ist Unsinn, die Name Manglings variiren je nach Compiler und Version des Compilers, d.h. das OS wäre z.B. nicht zu neueren Versionen des GCC kompatibel als der, die der Entwickler hat.

Alle Funktionen, die von C/ASM aus aufgerufen werden, müssen als extern "C" deklariert werden. ASM und C Funktionen müssen auch in den Headern als extern "C" deklariert werden.

Ausserdem sollte man beachten, das man in ASM den Funktionen einen Unterstrich (_) voransetzt, falls man Windows benutzt. Wenn man Linux benutzt darf man das nicht, sonst findet der Linker die Funktionen nicht.

Beispiel:
C Funktion:
int do_something() {
return 10;
}

CPP Funktion:
extern "C" int do_something_other() {
return 20;
}

ASM Funktion (Ich gehe davon aus, das Win benutzt wird):
[global _asm_function]
_asm_function:
mov eax, 30
ret


Headerfile um von C++ auf die C/ASM Funktionen aufrufen zu können:
[...]
extern "C" unsigned int asm_function();
extern "C" int do_somethings();
[...]


Jetzt lassen sich sowohl die C/ASM als auch die C++ Funktionen von der jeweils anderen Sprache aufrufen.
370
Lowlevel-Coding / Keyboard treiber und C/C++
« am: 15. June 2005, 14:06 »
set_vector und enable_irq stehen in der kernel.cpp?
Du muss set_vector und enable_irq als extern "C" deklarieren, sonst wandelt der compiler sie in namen wie __Z12InitKeyboardv um.
371
Lowlevel-Coding / Fataler Fehler in C++ Tutorial?
« am: 12. June 2005, 19:39 »
Mit "-X c" teilst du gcc glaubich mit, das der Code CPP ist.
372
Offtopic / Kleines Projekt zum Theme Spieleprogrammierung
« am: 09. June 2005, 22:48 »
Ich würde es besser finden, keine Winapi zu benutzen, sondern stattdessen irgenteine Lib (SDL usw.) zu benutzen, aber das ist Geschmackssache und du wirst es warscheinlich nicht mehr ändern wollen.

Der Aufbau sieht schonmal gut aus, ich habe jedoch 3 Kritikpunkte:
1. ProcessFrame() sollte nur aufgerufen werden, wenn keine Nachrichten mehr verarbeitet werden müssen.
2. Die Limitierung auf 30 Frames ist nicht sehr schön meiner Meinug nach, ich würde lieber die Geschwindigkeit des Spiels nicht auf Frames, sondern auf der vergangenen Zeit basieren lassen.
3. timeGetTime() oder queryPerformanceTimer() verwenden, getTickCount hat nur eine Auflösung von etwa 10ms.
373
tyndur / Zeichensatz
« am: 09. June 2005, 22:26 »
IMHO wäre es besser, erstmal eine libc zu coden und dann FreeType als Rasterer zu benutzen, das ist portabel, einfacher als Bitmapfonts einzubauen und bis es eine GUI gibt braucht man ja eh keine Fonts da man die Ausgabe im Textmodus machen kann.
374
tyndur / Zeichensatz
« am: 09. June 2005, 15:58 »
Normalerweise (bei TrueType oder ähnlichen Schriftarten) werden die Fonts als Vektoren gespeichert und dann beim Rendern gerastert. So kann die Font ohne Qualitätsverluste beliebig vergrößert werden. Es gibt aber auch Fonts die einfache Bitmaps sind. Zum Fontrendern könnte man FreeType verwenden, das ist eine Bibliotek dafür, die nur die C stdlib benötigt.
375
Lowlevel-Coding / Farcall vs. Interrupt
« am: 09. June 2005, 15:52 »
Ja, mir ist das schon klar, das man ein Programm so linken kann, das die Addressen bei 0x1000 beginnen, ein anderes wo sie bei 0x2000 beginnen usw.
Aber dann kann man nicht mehrere Instanzen eines Programms gleichzeitig laufen lassen und alle Programme müssen auf einander abgestimmt sein.

An einem dynamischen Linken wärend der Laufzeit wirst du also kaum vorbeikommen.
376
Lowlevel-Coding / Farcall vs. Interrupt
« am: 08. June 2005, 21:38 »
Naja, aber auf normaler Weise kompilierte Programme gehen davon aus, das sie einen virtuellen Addressraum haben. Wenn das Textsegment von zwei Programmen übereinander liegt, würden sie ja nicht richtig funktionieren. Deshalb _muss_ man eigentlich Paging einbauen, um Multitasking zu verwenden, da das ja mit Segmenten nicht möglich ist, oder?
377
Lowlevel-Coding / Farcall vs. Interrupt
« am: 08. June 2005, 16:31 »
Das heißt, du lässt das Multitasking ganz weg?
Ich halte es nicht für sinnvoll, das System so auf Geschwindigkeit zu trimmen, für höchstens 2-5% mehr Geschwindigkeit hast du keinen Speicherschutz, kein Multitasking, keinen Virtullen Addressraum und alle Treiber und Dienste auf die ein Process zugreifen kann müssen in den Kernel kompiliert werden, da man ja nur einen Prozess gleichzeitig starten kann.
378
Lowlevel-Coding / Farcall vs. Interrupt
« am: 07. June 2005, 18:33 »
Du brauchst ja auch garnicht für jeden Prozess Segmente, du brauchst 6 Segmente insgesammt, falls du Software Multitasking benutzt.
1. NULL Descriptor
2. Kernel Code
3. Kernel Data
4. Process Code
5. Process Data
6. TSS

Für Hardware Multitasking brauchst du natürlich mehr Descriptoren, für jeden Task halt einen mehr.

Dank Paging können die Prozesse ja nichmal die Addressen des anderen Programms addressieren, also brauchst du nicht mehr Segmente.
379
OS-Design / VGA modus setzen
« am: 07. June 2005, 16:31 »
Es gibt für GRUB einen VBE-Patch, mit dem es möglich ist, von GRUB Vesa aktivieren zu lassen. Ein solcher GRUB ist z.B. im Comm-OS enthalten.
380
Offtopic / eigene api erstellen
« am: 05. June 2005, 08:42 »
In einer DLL nimmst du glaubich DLLMain() oder so, diese Funktion wird dann aufgerufen, wenn die DLL an einen Process angehängt wird. In deinen DLL Funktionen solltest du ganz normal winapi funktionen aufrufen können, man kann ja auch von Konsolenprogrammen aus Winapi Funktionen aufrufen.
Seiten: 1 ... 17 18 [19] 20

Einloggen