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 - RedEagle

Seiten: 1 2 [3] 4 5 ... 13
41
OS-Design / Re: Tabelle für Deutsche Scancodes?
« am: 19. February 2010, 00:52 »
Naja - Es stimmt zumindest nicht mit [url http://www.computer-engineering.org/ps2keyboard/scancodes2.html]dieser (EN)[/url] Tabelle überein

bsp:

Zeichen - Tabelle: tu-chemnitz (EN) - Tabelle: computer-engineering.org (EN)
a - 0x1E - 0x1C
b - 0x30 - 0x32
c - 0x2E - 0x21
...

Diese ganze scancode-geschichte ist irgendwie sehr undurchsichtig - 1000 Tabellen geben 1000 andere Werte - Ich hatte damals schon Schwierigkeiten das die Tabelle, die ich damals nutze, teilweise nicht mit den Werten von bochs übereinstimmten.
Nur im Gegensatz zu damals würde ich den Treiber diesmal gerne richtig anpacken, und nicht irgendwas rein improvisieren. Deshalb hätte ich schon gerne gute Tabellen, am besten für verschiedene layouts wobei Englisch und Deutsch erstmal wichtigsten sind - Später können dann weitere durch hinzufügen einer Datei ergänzt werden...
42
OS-Design / Re: Tabelle für Deutsche Scancodes?
« am: 18. February 2010, 20:44 »
hm... nicht wirklich, da es sich nicht um den set 2 scancode handelt :D
Allerdings wird dort das Deutsche und Englische layout vergleichen, was eigentlich schon reicht... Ich hoffe das Funktioniert mit den 2. set auch so reibungslos, aber Feinheiten lassen sich ja per Try&Error korrigieren

Danke
43
OS-Design / Tabelle für Deutsche Scancodes?
« am: 18. February 2010, 11:20 »
Hi
Ich suche nun schon seit Stunden eine Tabelle mit den Scancodes für Deutsche Tastaturen - leider ohne Erfolg. Alle Tabellen, auch die, die angeblich deutsch sein sollen sind Englisch.

Kennt zufällig jemand nen Link, oder hat jemand 'ne pdf rumliegen?

btw: Sind die scancodes für shift/alt/strg/*lock und auch Sondertasten wie F1..F12, enter,space,... auf jeder Tastatur gleich? Die Positionen ändern sich ja eigentlich nicht
44
OS-Design / Re: API: Wie realisiert man es am besten?
« am: 14. February 2010, 16:57 »
Bei meinen 12MiB ist u.a. 1.44MiB für die system-(ram)disk, eine 1 MiB Bytemap für die pageverwaltung, 4 MiB für alle PT's, 1MiB RealMode-Zeug - mein bootloader bleibt im speicher - beim runterfahren erledigt der bootloader noch ein paar kleinigkeiten - u.A. die sys.RD auf floppy kopieren. GDT, IDT und stack liegen ebenfalls in den 12MiB
Da kommt schon einiges zusammen - wobei ich mir auch nicht wirklich gedanken um speicherschonende Techniken mache - Alle PCs mit i586er CPU die ich habe haben 128MiB RAM oder mehr - von daher kann ich mir ruhig mal 16MiB für mein OS genehmigen. :)
45
Lowlevel-Coding / Re: Globale Varablen funktionieren nicht
« am: 13. February 2010, 12:52 »
mit
objdump -h ckernel.okannst du dir anzeigen lassen, wie dein Kompiler ckernel.c zerlegt

Alle dort genannten sections (außer .comment und .note.GNU-stack) sollten auch in deinem linkerscript auftauchen - falls nicht ist das der Punk an dem dir die Daten verloren gehen :)
46
OS-Design / Re: API: Wie realisiert man es am besten?
« am: 13. February 2010, 12:03 »
12MB für den kernel (3 4MB-Pages), darauf kommt dann der heap
Ich würd bei mir mal auf ~16MB schätzen, wobei das schon extrem knapp werden kann.


Da der thread grad wieder in Gebrauch ist schildere ich mal mein derzeitiges vorgehen bei der API:
Wie XanClic empfohlen hat, habe ich den kernel-speicher in alle Prozesse gemapped. Meine pageverwalltung arbeitet quasi nur mit virtuellen Adressen - sodass ich für Kernel und Prozesse die selben Funktionen verwenden kann.
Ich habe dem VMS in 3 teile unterteilt, GLOBAL (hier liegt u.a. der Kernel samt Heap), LOCAL (hier liegen die pages die nur für einen Prozess zugreifbar sein müssen) und einen dritten Bereich in dem die PT's und das PD gemapped wurde (für die pageverwaltung)

Zur Vereinfachung der pageverwaltung habe ich zudem festgelegt, dass wenn mehr als 4MB reserviert werden sollen, dieses in 4MB-Pages getan wird. Braucht man also 6MB bekommt man 2 4MB Pages.
Ist vom speicherverbrauch vielleicht nicht sehr effektiv, aber dafür ist es 1. Schneller, 2. Einfacher und dadurch Stabieler.

Bei der API habe ich mir eine liste gebaut, in der ich einfach nur neue Funktionen einfügen muss, So wie es bei týndur wenn ich mich nicht irre.
47
Lowlevel-Coding / Re: Globale Varablen funktionieren nicht
« am: 13. February 2010, 11:51 »
Methode 1:
printhex(str);
printhex(str2);

Methode 2:
if(str == str2) prints("error");
48
Lowlevel-Coding / Re: Globale Varablen funktionieren nicht
« am: 12. February 2010, 20:50 »
wenn beim kopieren des kernels oder während des linkens was schief läuft könnte es sein, das die Daten der globalen variablen sich ändern - du hättest dann dort nicht die adressen drin stehen, die du ihnen im quellcode zugewiesen hast.
so kann es z.B. sein, das beide variablen auf 0x00000000 zeigen.
49
Lowlevel-Coding / Re: Globale Varablen funktionieren nicht
« am: 12. February 2010, 19:50 »
welche Adresse haben denn str und str2 (zur Laufzeit!)?
50
Lowlevel-Coding / Re: Globale Varablen funktionieren nicht
« am: 11. February 2010, 17:31 »
[..]Wenn ein System so wenig Kompatibilität zu diesen "alten" Methoden hat, würde mich das sehr wundern.[..]
Mein neuster PC (~4 Jahre alt) hat ebenfalls auch Probleme damit.
Es gibt eine methode per int 0x15 (?) die A20 geschichte zu regeln, hab es allerdings noch nicht ausprobiert
51
Lowlevel-Coding / Re: Globale Varablen funktionieren nicht
« am: 10. February 2010, 20:51 »
Wenn werte die 0 sein sollten, aber nicht 0 sind kann es daran liegen :mrgreen:

das es Probleme mit dem A20 gate gibt ist auch möglich
einfach mal was an eine adresse schreiben, und von der adresse +1MiB lesen - ist es das selbe liegts daran :)
52
Lowlevel-Coding / Re: Globale Varablen funktionieren nicht
« am: 10. February 2010, 19:55 »
hatte das Problem auch schon einige male
Ursache: Der kernel wurde zu groß, und dadurch nicht vollständig vom bootloader geladen.
Da du ebenfalls einen eigenen bootloader verwendest, würde ich das mal als mögliche Ursache betrachten.

Ich empfehle dir grub zu verwenden (was dir die meisten hier wahrscheinlich empfehlen würden), oder vorerst FAT12 in dein bootloader implementieren - im wiki gibt's einige links zu guten pdf's.
53
.bss nach .data schieben wollte/will ich nicht.
Und das .bss Segment mit Nullen füllen geht nicht, da der Kernel in einer Binärdatei liegt - ich also nicht weiß wie groß das .bss-Segment ist (Wobei es bestimmt ne Möglichkeit gibt an die Größe zu kommen)

Aber das  -fno-zero-initialized-in-bss - flag sieht gut aus
Funktioniert bestens :) - vielen Dank

Bleibt die Frage warum mir das erst nach 5 Jahren aufgefallen ist - ich will nicht wissen wie viel Stunden debuggen ich mir dadurch hätte sparen können  :mrgreen:
54
Softwareentwicklung / Globale, Initialisierte Variable in .bss!?
« am: 19. January 2010, 20:08 »
Hi
Ich habe ein Problem mit Globalen Variable

paging.cpp
//...

namespace paging
{
 DWORD PagingSpinLock = 0x00000000;

//...

Der Linker packt diese Variable in den .bss-Bereich:
mapfile
...
 .bss           0x0000000000a14818        0xc mem/paging.o
                0x0000000000a14818                paging::PagingSpinLock
...

Der Grund dafür: Der Compiler lässt sie in den .bss-Bereich packen:
objdump -x paging.o
...

00000000 g     O .bss   00000004 _ZN6paging14PagingSpinLockE

...

Warum wird diese Variable in den .bss-Teil gepackt?
Alle Globalen Variablen die mit 0 oder false initialisiert wurden befinden sich im .bss-Segment; die mit einem Wert ungleich 0 initialisiert wurde hingegen nicht.


Der Compiler kann doch nicht einfach davon ausgehen das diese Speicherbereiche =0 sind :? - Die Tatsache das sie !=0 sind sorgt nämlich für wirre Abstürze...

Meine Compiler-settings:
COMPILERSETTINGS="-I $HEADERS -DCPU=586 -m32 -c -Os -nostdlib -fno-builtin -fno-rtti -fno-exceptions"Compiler: g++ 4.4.1

Ich arbeite bereist seit einigen Jahren mit diesen Settings - aber bisher sind mir nie solche Probleme aufgefallen...
...erst seit wenigen Tagen

Meine Frage:
Was jetzt? Wie bringe ich den Compiler dazu initialisierte Variablen nicht in den .bss-Block zu packen?
Warum geht der überhaupt davon aus, dass das bss-segment mit Nullen gefüllt ist? Überall wird doch explizit erwähnt dass dieser Speicherbereich keine definierten Werte enthält...

Nochmal die g++-version im detail:
$ g++ -v
Using built-in specs.
Target: i586-suse-linux
Configured with: ../configure --prefix=/usr --infodir=/usr/share/info --mandir=/usr/share/man --libdir=/usr/lib --libexecdir=/usr/lib
--enable-languages=c,c++,objc,fortran,obj-c++,java,ada --enable-checking=release --with-gxx-include-dir=/usr/include/c++/4.4
--enable-ssp --disable-libssp --with-bugurl=http://bugs.opensuse.org/ --with-pkgversion='SUSE Linux' --disable-libgcj
--disable-libmudflap --with-slibdir=/lib --with-system-zlib --enable-__cxa_atexit --enable-libstdcxx-allocator=new --disable-libstdcxx-pch
--enable-version-specific-runtime-libs --program-suffix=-4.4 --enable-linux-futex --without-system-libunwind --with-arch-32=i586
--with-tune=generic --build=i586-suse-linux
Thread model: posix
gcc version 4.4.1 [gcc-4_4-branch revision 150839] (SUSE Linux)
55
OS-Design / Re: API: Wie realisiert man es am besten?
« am: 01. January 2010, 17:47 »
Dadurch das mein Kernel ein eigenes PD hat, spare ich mir die PDs der Prozesse anzupassen, wenn ich im Kernel zum Eigenbedarf Speicher reserviere.
In die PDs der Prozesse werden dann nur die Speicherbereiche gemappt, die für Taskwechsel nötig sind, der Heap des Kernels ist für sie ja unwichtig. Nach dem erstellen eines Prozesses braucht dann im Bereich des Kernelspeichers nichts mehr am PD geändert werden.

Ich werd's dann wohl mit dem rummappen machen.

Das Problem mit dem zahlreichen kopieren der Argumente löse ich, indem ich nur noch die Adresse weiterreiche, an der die Argumente liegen.

Danke für die Antwort
56
OS-Design / API: Wie realisiert man es am besten?
« am: 01. January 2010, 14:43 »
Hi
Ich beschäftige mich seit einigen Tagen mit der API meines Kernels. Leider bekomme ich mit jeder Lösung 1000 neue Probleme und alles ist irgendwie extrem aufwändig.

Meine bisherige Lösung, bzw. Lösungsansatz

Ein Prozess ruft eine C-Funktion auf - bsp.: APITEST("hello world");
APITEST selber ist aber in assembly realisiert - in APITEST werden nun die Argumente, welche sich ja auf dem Stack befinden, wiederum an eine neue Stackadresse kopiert (Als Argument der 0xFF-ISR), um dann int 0xFF aufzurufen.

Die "0xFF-ISR" erwartet die Argumente auf dem Stack, und ist ebenfalls in asm geschrieben, nur die Funktions-Nummer kommt per eax

Von dieser ISR geht es nun weiter: Die Argumente werden wieder an eine neue Position im Stack kopiert, und dann die eax - entsprechende C-Funktion aufgerufen.

kurz: C -----> ASM --int0xFF--> ASM -----> C

Dabei gibt es nun ein Probleme - der String "hello world" befindet sich im virtuellen Speicher des Prozesses, die Funktion zum ausgeben des Strings benötigt aber den virtuellen Speicher des Kernels (gut, das geht vielleicht auch ohne Kernelspeicher, aber spätestens bei Dateiarbeiten muss ich mit dem Speicher des Kernels arbeiten)

Lösung: ich wechsle auf das PD des Kernels und mappe die Page, auf der sich der String befindet.

Problem: Was ist, wenn mehrere Prozesse das gleiche vor haben - ich kann also nicht die Page an der selben virtuellen Adresse mappen, wie sie im Prozess liegt - dadurch muss ich also alle Pointer die ich bekomme umrechnen.


Meine Frage nun:
Wie realisiere ich eine API am besten, die ich sowohl von asm, als auch C aus gut ansprechen kann, und wie regle ich das mit den Speicherräumen?
57
Offtopic / Re: Kein Zugriff auf wchar_t-Array
« am: 02. December 2009, 11:40 »
*msFile ist const
Du weist dem ding einen Konstanten String zu.

58
bin ich auch gerade drauf gekommen :D (bin die AT&T-Syntax nicht gewohnt)

Das macht die Sache aber nur noch mysteriöser :(

void WaitForKOT_()
{
 while(!NewKOT); //NewKOT wird beim interrup gesetzt
BREAKPOINT;
 return;
}

Aber auch wenn NewKOT == false ist, gehts zum breakpoint.
Ich habe mir vor & nach der schleife den Wert von NewKOT ausgeben lassen - er ist auf jeden fall immer false... - zumindest lt Ausgabe.

Ich werde mal gucken, ob das NewKOT im opcode das selbe ist, wie meins...

--edit--

Ja, die Adressen stimmen überein (war ja auch so zu erwarten)
Allerdings bleibt der Wert von NewKOT = false  :?

Hm... Dann mache ich mal von neuem auf die Suche...
Vieleicht ist er ja nur für einige millisekunden true...
59
der code, den der Kompiler daraus erzeugt ist das Problem:
mov    0x0,%al ; al = 0
test   %al,%al ; al==al (bzw al==0)
je     178 <_ZN3KOT11WaitForKOT_Ev+0x3> ; wenn al==al (oder al==0) springe zurück

Das Problem ist, das al sich niemals ändert - al ist immer 0 oder sehe ich das falsch?
Es wird zu keinem Zeitpunkt der Wert geholt, der unter NewKOT liegt

Was mich jetzt noch weiter verwirrt:
Eigentlich sollte es eine endlosschleife sein, da test %al, %al das ZF immer auf 0 setzt weil al immer 0 ist und somit je immer zurück springt.

Aufgefallen ist mir die Funktion aber dadurch, dass sie NICHT wartet  :?
60
Lowlevel-Coding / g++ entfernt trotz volatile relevanten code
« am: 05. August 2009, 14:33 »
Hi
Ich habe folgende Funktion:
volatile bool NewKOT = false; //global

void WaitForKOT_()
{
 while(!NewKOT); //NewKOT wird beim interrup gesetzt
 return;
}

mein g++ 4.3.1 macht da folgendes raus:

00000175 <_ZN3KOT11WaitForKOT_Ev>:
 175:   55                      push   %ebp
 176:   89 e5                   mov    %esp,%ebp
 178:   a0 00 00 00 00          mov    0x0,%al
 17d:   84 c0                   test   %al,%al
 17f:   74 f7                   je     178 <_ZN3KOT11WaitForKOT_Ev+0x3>
 181:   5d                      pop    %ebp
 182:   c3                      ret

Warum?
Ich habe doch durch volatile angegeben, dass sich der Wert von NewKOT unabhängig von der Funktion ändern kann.
Das sieht ohnehin so aus, als würde er NewKOT als Konstant annehmen, da der Wert nicht einmal aus dem Speicher geholt wird.

ps.: meine Compiler-einstellungen
[/i]COMPILERSETTINGS="-I $HEADERS -DCPU=586 -m32 -c -Os -nostdlib -fno-builtin -fno-rtti -fno-exceptions"[/i]
Seiten: 1 2 [3] 4 5 ... 13

Einloggen