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

Seiten: [1] 2 3
1
Softwareentwicklung / Re: [All In One]-Question lolxdfly
« am: 09. August 2014, 20:19 »
Ja.
Habe jetzt den Timer schon etwas entschäft  :-)
2
Softwareentwicklung / Re: [All In One]-Question lolxdfly
« am: 09. August 2014, 17:30 »
Eine kleine Frage: Sollte mir Folgendes Sorgen bereiten?

SMM: enter
EAX=00000001 EBX=80000b58 ECX=00000000 EDX=00000cfc
ESI=000e857d EDI=0003802d EBP=80000070 ESP=00006ee0
EIP=000ef7b2 EFL=00000002 [-------] CPL=0 II=0 A20=1 SMM=0 HLT=0
ES =0010 00000000 ffffffff 00cf9300 DPL=0 DS   [-WA]
CS =0008 00000000 ffffffff 00cf9b00 DPL=0 CS32 [-RA]
SS =0010 00000000 ffffffff 00cf9300 DPL=0 DS   [-WA]
DS =0010 00000000 ffffffff 00cf9300 DPL=0 DS   [-WA]
FS =0010 00000000 ffffffff 00cf9300 DPL=0 DS   [-WA]
GS =0010 00000000 ffffffff 00cf9300 DPL=0 DS   [-WA]
LDT=0000 00000000 0000ffff 00008200 DPL=0 LDT
TR =0000 00000000 0000ffff 00008b00 DPL=0 TSS32-busy
GDT=     000fce38 00000037
IDT=     000fdcf0 00000000
CR0=00000011 CR2=00000000 CR3=00000000 CR4=00000000
DR0=00000000 DR1=00000000 DR2=00000000 DR3=00000000
DR6=ffff0ff0 DR7=00000400
CCS=000e8550 CCD=00000001 CCO=LOGICB 
EFER=0000000000000000
SMM: after RSM
EAX=00000001 EBX=80000b58 ECX=00000000 EDX=00000cfc
ESI=000e857d EDI=0003802d EBP=80000070 ESP=00006ee0
EIP=000ef7b2 EFL=00000002 [-------] CPL=0 II=0 A20=1 SMM=0 HLT=0
ES =0010 00000000 ffffffff 00c09300 DPL=0 DS   [-WA]
CS =0008 00000000 ffffffff 00c09b00 DPL=0 CS32 [-RA]
SS =0010 00000000 ffffffff 00c09300 DPL=0 DS   [-WA]
DS =0010 00000000 ffffffff 00c09300 DPL=0 DS   [-WA]
FS =0010 00000000 ffffffff 00c09300 DPL=0 DS   [-WA]
GS =0010 00000000 ffffffff 00c09300 DPL=0 DS   [-WA]
LDT=0000 00000000 0000ffff 00008200 DPL=0 LDT
TR =0000 00000000 0000ffff 00008b00 DPL=0 TSS32-busy
GDT=     000fce38 00000037
IDT=     000fdcf0 00000000
CR0=00000011 CR2=00000000 CR3=00000000 CR4=00000000
DR0=00000000 DR1=00000000 DR2=00000000 DR3=00000000
DR6=ffff0ff0 DR7=00000400
CCS=00000000 CCD=ffffff9c CCO=EFLAGS 
EFER=0000000000000000
     0: v=21 e=0000 i=0 cpl=0 IP=0008:001007a0 pc=001007a0 SP=0010:001fffd4 EAX=00102100
EAX=00102100 EBX=00009500 ECX=000b8000 EDX=000003d5
ESI=00000000 EDI=00105000 EBP=001ffff0 ESP=001fffd4
EIP=001007a0 EFL=00000202 [-------] CPL=0 II=0 A20=1 SMM=0 HLT=0
ES =0010 00000000 ffffffff 00cf9300 DPL=0 DS   [-WA]
CS =0008 00000000 ffffffff 00cf9a00 DPL=0 CS32 [-R-]
SS =0010 00000000 ffffffff 00cf9300 DPL=0 DS   [-WA]
DS =0010 00000000 ffffffff 00cf9300 DPL=0 DS   [-WA]
FS =0010 00000000 ffffffff 00cf9300 DPL=0 DS   [-WA]
GS =0010 00000000 ffffffff 00cf9300 DPL=0 DS   [-WA]
LDT=0000 00000000 0000ffff 00008200 DPL=0 LDT
TR =0000 00000000 0000ffff 00008b00 DPL=0 TSS32-busy
GDT=     00102940 00000027
IDT=     00102980 000007ff
CR0=80000011 CR2=00000000 CR3=00000000 CR4=00000000
DR0=00000000 DR1=00000000 DR2=00000000 DR3=00000000
DR6=ffff0ff0 DR7=00000400
CCS=00000004 CCD=001fffd4 CCO=SUBL   
EFER=0000000000000000
     1: v=21 e=0000 i=0 cpl=0 IP=0008:001007a0 pc=001007a0 SP=0010:001fffd4 EAX=00102100
EAX=00102100 EBX=00009500 ECX=000b8000 EDX=000003d5
ESI=00000000 EDI=00105000 EBP=001ffff0 ESP=001fffd4
EIP=001007a0 EFL=00000202 [-------] CPL=0 II=0 A20=1 SMM=0 HLT=0
ES =0010 00000000 ffffffff 00cf9300 DPL=0 DS   [-WA]
CS =0008 00000000 ffffffff 00cf9a00 DPL=0 CS32 [-R-]
SS =0010 00000000 ffffffff 00cf9300 DPL=0 DS   [-WA]
DS =0010 00000000 ffffffff 00cf9300 DPL=0 DS   [-WA]
FS =0010 00000000 ffffffff 00cf9300 DPL=0 DS   [-WA]
GS =0010 00000000 ffffffff 00cf9300 DPL=0 DS   [-WA]
LDT=0000 00000000 0000ffff 00008200 DPL=0 LDT
TR =0000 00000000 0000ffff 00008b00 DPL=0 TSS32-busy
GDT=     00102940 00000027
IDT=     00102980 000007ff
CR0=80000011 CR2=00000000 CR3=00000000 CR4=00000000
DR0=00000000 DR1=00000000 DR2=00000000 DR3=00000000
DR6=ffff0ff0 DR7=00000400
CCS=00000004 CCD=001fffc8 CCO=EFLAGS 
EFER=0000000000000000
     2: v=21 e=0000 i=0 cpl=0 IP=0008:001007a0 pc=001007a0 SP=0010:001fffd4 EAX=00102100
EAX=00102100 EBX=00009500 ECX=000b8000 EDX=000003d5
ESI=00000000 EDI=00105000 EBP=001ffff0 ESP=001fffd4
EIP=001007a0 EFL=00000202 [-------] CPL=0 II=0 A20=1 SMM=0 HLT=0
ES =0010 00000000 ffffffff 00cf9300 DPL=0 DS   [-WA]
CS =0008 00000000 ffffffff 00cf9a00 DPL=0 CS32 [-R-]
SS =0010 00000000 ffffffff 00cf9300 DPL=0 DS   [-WA]
DS =0010 00000000 ffffffff 00cf9300 DPL=0 DS   [-WA]
FS =0010 00000000 ffffffff 00cf9300 DPL=0 DS   [-WA]
GS =0010 00000000 ffffffff 00cf9300 DPL=0 DS   [-WA]
LDT=0000 00000000 0000ffff 00008200 DPL=0 LDT
TR =0000 00000000 0000ffff 00008b00 DPL=0 TSS32-busy
GDT=     00102940 00000027
IDT=     00102980 000007ff
CR0=80000011 CR2=00000000 CR3=00000000 CR4=00000000
DR0=00000000 DR1=00000000 DR2=00000000 DR3=00000000
DR6=ffff0ff0 DR7=00000400
CCS=00000004 CCD=001fffc8 CCO=EFLAGS 
EFER=0000000000000000
     3: v=21 e=0000 i=0 cpl=0 IP=0008:001007a0 pc=001007a0 SP=0010:001fffd4 EAX=00102100
EAX=00102100 EBX=00009500 ECX=000b8000 EDX=000003d5
ESI=00000000 EDI=00105000 EBP=001ffff0 ESP=001fffd4
EIP=001007a0 EFL=00000202 [-------] CPL=0 II=0 A20=1 SMM=0 HLT=0
ES =0010 00000000 ffffffff 00cf9300 DPL=0 DS   [-WA]
CS =0008 00000000 ffffffff 00cf9a00 DPL=0 CS32 [-R-]
SS =0010 00000000 ffffffff 00cf9300 DPL=0 DS   [-WA]
DS =0010 00000000 ffffffff 00cf9300 DPL=0 DS   [-WA]
FS =0010 00000000 ffffffff 00cf9300 DPL=0 DS   [-WA]
GS =0010 00000000 ffffffff 00cf9300 DPL=0 DS   [-WA]
LDT=0000 00000000 0000ffff 00008200 DPL=0 LDT
TR =0000 00000000 0000ffff 00008b00 DPL=0 TSS32-busy
GDT=     00102940 00000027
IDT=     00102980 000007ff
CR0=80000011 CR2=00000000 CR3=00000000 CR4=00000000
DR0=00000000 DR1=00000000 DR2=00000000 DR3=00000000
DR6=ffff0ff0 DR7=00000400
CCS=00000004 CCD=001fffc8 CCO=EFLAGS 
EFER=0000000000000000
     4: v=21 e=0000 i=0 cpl=0 IP=0008:001007a0 pc=001007a0 SP=0010:001fffd4 EAX=00102100
EAX=00102100 EBX=00009500 ECX=000b8000 EDX=000003d5
ESI=00000000 EDI=00105000 EBP=001ffff0 ESP=001fffd4
EIP=001007a0 EFL=00000202 [-------] CPL=0 II=0 A20=1 SMM=0 HLT=0
ES =0010 00000000 ffffffff 00cf9300 DPL=0 DS   [-WA]
CS =0008 00000000 ffffffff 00cf9a00 DPL=0 CS32 [-R-]
SS =0010 00000000 ffffffff 00cf9300 DPL=0 DS   [-WA]
DS =0010 00000000 ffffffff 00cf9300 DPL=0 DS   [-WA]
FS =0010 00000000 ffffffff 00cf9300 DPL=0 DS   [-WA]
GS =0010 00000000 ffffffff 00cf9300 DPL=0 DS   [-WA]
LDT=0000 00000000 0000ffff 00008200 DPL=0 LDT
TR =0000 00000000 0000ffff 00008b00 DPL=0 TSS32-busy
GDT=     00102940 00000027
IDT=     00102980 000007ff
CR0=80000011 CR2=00000000 CR3=00000000 CR4=00000000
DR0=00000000 DR1=00000000 DR2=00000000 DR3=00000000
DR6=ffff0ff0 DR7=00000400
CCS=00000004 CCD=001fffc8 CCO=EFLAGS 
EFER=0000000000000000
     5: v=20 e=0000 i=0 cpl=0 IP=0008:00101aff pc=00101aff SP=0010:001fff98 EAX=00000004

...

  2125: v=20 e=0000 i=0 cpl=0 IP=0008:00100e2d pc=00100e2d SP=0010:001fffb8 EAX=00000000
EAX=00000000 EBX=00009500 ECX=000b8000 EDX=00000000
ESI=00000000 EDI=00105000 EBP=001fffc0 ESP=001fffb8
EIP=00100e2d EFL=00000202 [-------] CPL=0 II=0 A20=1 SMM=0 HLT=0
ES =0010 00000000 ffffffff 00cf9300 DPL=0 DS   [-WA]
CS =0008 00000000 ffffffff 00cf9a00 DPL=0 CS32 [-R-]
SS =0010 00000000 ffffffff 00cf9300 DPL=0 DS   [-WA]
DS =0010 00000000 ffffffff 00cf9300 DPL=0 DS   [-WA]
FS =0010 00000000 ffffffff 00cf9300 DPL=0 DS   [-WA]
GS =0010 00000000 ffffffff 00cf9300 DPL=0 DS   [-WA]
LDT=0000 00000000 0000ffff 00008200 DPL=0 LDT
TR =0000 00000000 0000ffff 00008b00 DPL=0 TSS32-busy
GDT=     00102940 00000027
IDT=     00102980 000007ff
CR0=80000011 CR2=00000000 CR3=00000000 CR4=00000000
DR0=00000000 DR1=00000000 DR2=00000000 DR3=00000000
DR6=ffff0ff0 DR7=00000400
CCS=00000044 CCD=00000000 CCO=EFLAGS 
EFER=0000000000000000
3
Softwareentwicklung / Re: [All In One]-Question lolxdfly
« am: 02. August 2014, 18:54 »
Danke.. damit läuft es.
Und zu GetKBCInput: GetKBCInput soll den Input liefern, bis der Benutzer Return drückt. Hat also viel Ähnlichkeit mit getchar(); :)
Bei getchar(); werden jedoch nur die einzelnen chars returnt und ich fand, dass es für so einen Anwendungszweck besser einen ganzen string returnen sollte:
  if(GetKBCInput(COLOR_BLACK, COLOR_WHITE)=="lolxdfly")
monitor_write("Hello, KBC!\n", COLOR_BLACK, COLOR_WHITE);
4
Softwareentwicklung / Re: [All In One]-Question lolxdfly
« am: 02. August 2014, 17:20 »
Hi,
ich habe wiedermal angefangen an meinem Kernel weiter zuarbeiten..
Als erstes wollte ich den Ps2-Tastaturtreiber überarbeiten. Alles läuft soweit gut. Jedoch scheitere ich daran, das eingegebene auszulesen -.- 
Hier seht ihr meine Funktion, die den keycode verarbeiten soll:
typedef char* string; //aus string.h
string tmp = "";
void send_keycode(unsigned char keycode, bool isBreakcode)
{
if(keycode!=0 && !break_code)
{
if(keycode == RETURN)
{
readkbc = false;
return;
}
monitor_put(keycode, backg, forg);
tmp += keycode; //failed
//strcat(tmp, keycode); //<= hat den gleichen Effekt
}
}

string GetKBCInput(color bg, color fg)
{
backg = bg;
forg = fg;
readkbc = true;
for(;;)
{
if(!readkbc)
break;
}
monitor_write("\nDebug: ", COLOR_BLACK, COLOR_YELLOW);
monitor_write(tmp, COLOR_BLACK, COLOR_YELLOW);
return tmp;
}

Als Ausgabe bekomme ich lediglich: "Debug: ". Also muss tmp unverändert, also leer sein :/
Zuvor noch natürlich das Eingegebene. Das heißt, dass er alles richtig übersetzt und es verarbeitet, nur irgendwie scheint er tmp += keycode; zu ignorieren..

mfg
lolxdfly
5
Softwareentwicklung / Re: [All In One]-Question lolxdfly
« am: 10. May 2014, 23:29 »
Danke.
Hab jetzt so hinbekommen. Keine Ahnung woran es lag. Ich habe das komplette Paging System neugeschrieben(ohne Codeteile aus TuTs zu nehmen). War gar nicht so schwer wie ich anfangs dachte  :-D

Edit: Ist wohl doch schwerer  :|
Wenn ich paging aktiviere crasht der Kernel, sobald eine Taste grdrückt wird(Im kernel wird getinput(COLOR_BLACK, COLOR_WHITE); ausgeführt. Es crasht also, weil das paging irgendwie mein KBC behindert).
6
Softwareentwicklung / Re: [All In One]-Question lolxdfly
« am: 07. May 2014, 19:58 »
Okay... danke erstmal für die Informationen.
Natürlich habe ich mir den Paging Artikel durchgelesen, aber beim programmieren gehe ich nach einem anderen TuT vor. Daher müsste ich die Page Directory bereits drinne haben!

das es etwas mit end zutun hat war nur so ein Gedanke :/

Habe alles erneut debuggt, aber den Fehler habe ich noch nicht wirklich gefunden. Allerdings weiß ich an welche Stelle es im Code crasht:
    current_directory = newdir;
    asm volatile("mov %0, %%cr3":: "r"(&newdir->tablesPhysical));
    uint32_t cr0;
    asm volatile("mov %%cr0, %0": "=r"(cr0));
    cr0 |= 0x80000000; // Enable paging!
    asm volatile("mov %0, %%cr0":: "r"(cr0)); // <==crash here
Das sieht im Beispiel Code allerdings 100% genauso aus. Kann es daran liegen, dass der Beispielcode in C ist?
7
Softwareentwicklung / Re: [All In One]-Question lolxdfly
« am: 06. May 2014, 21:05 »
EDIT3:Habs gefunden, nicht gefixt :/
Ist genauso wie hier: nur mit 10187e: http://www.lowlevel.eu/wiki/Teil_9_-_Paging#Paging_aktivieren

EDIT4: Dürfte am link script liegen... die Adresse ist ein externes Symbl aus dem Link Script:
  end = .; _end = .; __end = .;soll ich dass einfach ans Ende dranklatschen? Hab leider überhaupt keine Ahnung was Link Scripte angeht :S
Das verstehe ich nicht. Ist an der Adresse 10187e das Symbol "end"?

Ne... war vllt etwas unglücklich formuliert.
Der Qemu log sagt folgendes:
check_exception old: 0xe new 0xe
     3: v=08 e=0000 i=0 cpl=0 IP=0008:0010188e pc=0010188e SP=0010:001fff90 EAX=80000011
Da ich sachen geändert habe hat sich die Adresse wieder geändert... vorher war es 10187e!

Dann habe ich mein Kernel disasm.:
  10187b: 0f 22 c0              mov    %eax,%cr0
  10187e: c9                    leave 
  10187f: c3                    ret   
Wie man sieht scheint der gleiche Fehler, wie hier beschrieben vorzuliegen: http://www.lowlevel.eu/wiki/Teil_9_-_Paging#Paging_aktivieren

In "meiner" Source findet man bezüglich der Speicheradresse das hier:
// end ist im linker script definiert!
extern uint32_t end;
uint32_t placement_address = (uint32_t)&end;

Die Deklarierung von end im LinkerScript sieht bei dem BeispielKernel wiefolgt aus:
ENTRY(start)
SECTIONS
{

    .text 0x100000 :
    {
        code = .; _code = .; __code = .;
        *(.text)
        . = ALIGN(4096);
    }

    .data :
    {
        data = .; _data = .; __data = .;
        *(.data)
        *(.rodata)
        . = ALIGN(4096);
    }

    .bss :
    {
        bss = .; _bss = .; __bss = .;
        *(.bss)
        . = ALIGN(4096);
    }

    end = .; _end = .; __end = .;
}
Ich denke mal ich hab das was im Linker Script bezüglich end falsch gemacht:
ENTRY(loader)
OUTPUT_FORMAT(elf32-i386)
OUTPUT_ARCH(i386:i386)

SECTIONS
{
  . = 0x0100000;

  .text :
  {
    *(.text*)
    *(.rodata)
  }

  .data  :
  {
    start_ctors = .;
    *(.ctors)
    end_ctors = .;

    *(.data)
  }

  .bss  :
  {
    *(.bss)
  }

  end = .; _end = .; __end = .;
 
  /DISCARD/ : { *(.dtors) *(.comment) }
}
8
Softwareentwicklung / Re: [All In One]-Question lolxdfly
« am: 06. May 2014, 14:11 »
Wenn ich die ganz blöde Frage stellen darf: Hast du nur den panic()-Prototypen oder auch wirklich eine Implementierung dafür? Und falls ja, wird die Implementierung auch mitgelinkt?
Ja ich habe auch eine fertige Funktion in der .cpp and ja die .o wird mitgelinkt!
extern void panic(char *message, char *file, uint32_t line)
{
    asm volatile("cli"); // Disable interrupts.

    video_write("PANIC(", COLOR_BLACK, COLOR_RED);
    video_write(message, COLOR_BLACK, COLOR_RED);
    video_write(") at ", COLOR_BLACK, COLOR_RED);
    video_write(file, COLOR_BLACK, COLOR_RED);
    video_write(":", COLOR_BLACK, COLOR_RED);
    video_write_dec(line, COLOR_BLACK, COLOR_LIGHT_GRAY);
    video_write("\n", COLOR_BLACK, COLOR_LIGHT_GRAY);
    // Halt by going into an infinite loop.
    for(;;);
}

PS: Erlich gesagt habe ich keine Ahnung warum die Funktion hier als extern deklariert wurde, aber in dem TuT war es genauso und wenn man sie "normal" deklariert ändert das nichts am Error :/

EDIT: Habs X_X... dummer Fehler:

in .h: void panic(const char *message, const char *file, uint32_t line);
in .cpp: void panic(char *message, char *file, uint32_t line);

EDIT2:Ok.. wie ich es schon befürchtet hatte crasht es wenn ich Paging aktiviere...
im Qemu Log taucht folgendes auf:
Zitat
check_exception old: 0xffffffff new 0xe
check_exception old: 0xe new 0xe
Im ObjDump gibt es kein
Zitat
00102c17
!!!

EDIT3:Habs gefunden, nicht gefixt :/
Ist genauso wie hier: nur mit 10187e: http://www.lowlevel.eu/wiki/Teil_9_-_Paging#Paging_aktivieren

EDIT4: Dürfte am link script liegen... die Adresse ist ein externes Symbl aus dem Link Script:
  end = .; _end = .; __end = .;soll ich dass einfach ans Ende dranklatschen? Hab leider überhaupt keine Ahnung was Link Scripte angeht :S
9
Softwareentwicklung / Re: [All In One]-Question lolxdfly
« am: 06. May 2014, 13:58 »
Initialisierung von structs funktioniert nur in C, nicht in C++. Der Fix sollte vermutlich eher so aussehen:

struct gdt_pointer {
    uint16_t limit;
    void* pointer;
} __attribute__((packed));

gdt_pointer gdtp;

gdtp.limit = GDT_ENTRIES * 8 - 1;
gdtp.pointer = gdt;

Auch diese Version geht nicht... aber das ist mittlerweile egal. Habs selber hinbekommen  :wink:

Ich hab quasi von neu angefangen und and das meiste selber im eigenen Stiel gemacht. Mag sein, dass ich jz die Verbesserungen von C++ gegüber C nicht ganz ausnutze, aber das spielt ja denke ich keine große Rolle. Es läuft jetzt endlich das ganze GDT, IDT, IRQs und PIT Krams.
Im mom. bin ich beim Paging angelangt...

Ich habe vor den Codeaufbau wie er hier (http://www.jamesmolloy.co.uk/tutorial_html/6.-Paging.html) beschrieben ist als Beispiel zu nehmen. Ich bekomme nur eine undefenierte Referenz zu der panic Funktion...

#define PANIC(msg) (panic(msg, __FILE__, __LINE__)) //undefined reference to panic(....

extern void panic(const char *message, const char *file, uint32_t line);

Auch wenn panic als extern "C" void deklariert ist gibt es den linking error ;/
10
Softwareentwicklung / Re: [All In One]-Question lolxdfly
« am: 06. February 2014, 21:33 »
Hallo,
das GTD gibt mir zwei Compile Error:
Zitat
expected primary-expression before '.' token

Eigentlich ist relativ klar was da falsch gelaufen ist, aber der Fix der gehen sollte geht nicht:
struct __TEST {
    uint16_t limit;
    void* pointer;
} __attribute__((packed)) gdtp = {
    __TEST.limit = GDT_ENTRIES * 8 - 1,
    __TEST.pointer = gdt,
};
(Ich musste den anonymous struckt in einen normel umformen da dies sonst bei c++ probleme machen würde: non-local '<anonymous struct> gdtp' vairable uses anonymus types.)

Oder hab ich irgendwas anderes falsch gemacht?  :?

lolxdfly
11
Softwareentwicklung / Re: [All In One]-Question lolxdfly
« am: 21. January 2014, 17:32 »
Hallo,
innerhalb meiner "Pause" in der Kernelentwicklung habe ich viele neue Erfahrungen gewonnen, mitdessen Hilfe ich jetzt den KeyboardTreiber fertig gekommen habe. Er funktioniert auch fast fehlerfrei (kernel crash, wenn ein 'd' im Input gelesen wird). Damit funktioniert endlich das Login meines Kernels  :lol:

Da ich alles was mit Grafik und Maus zutun hat erstmal auf später verschoben habe, wollte ich jetzt erst einmal alles was mit Interrupts zutun hat zum laufen bekommen.
Ersteinmal muss ich sagen, dass dieses http://www.lowlevel.eu/wiki/PIC_Tutorial echt gut erklärt ist. Ich hab zum ersten mal alles verstanden, was auf der Seite stand.  :-D
Mein Problem ist das implementieren der Interrupt Service Routine. Da ich noch fast keine ASM-Erfahrungen habe fällt es mir schwer den ASM-Teil zu codieren.

Wenn man nach dem hier vorgeht http://www.lowlevel.eu/wiki/Teil_5_-_Interrupts muss man "nur" die Descriptor Tables implementieren. Vom ISR wird hier nichts gesagt :/
Oder sind das 2 verschieden Sachen?

lolxdfly

EDIT: der crash wenn ich das 'd' drücke habe ich behoben!! Bei den Interrups bin ich nix weiter...

EDIT2: Bin jetzt mit dem GDT angefangen. Sooo schwer ist das ja gar nicht. Überseh ich was oder geht aus dem TuT nicht hervor, welche Größe GDT_ENTRIES haben muss?
12
Softwareentwicklung / Re: [All In One]-Question lolxdfly
« am: 13. October 2013, 15:21 »
Quizfrage noch für lolxdfly: Welche Anweisungen in folgender Zeile sind bedingt und welche nicht?
if(led == 7) CapsLock=1; NumLock=1; ScrollLock=1;
hmm ich glaube es geht nur bis zum ersten Semikolon  :-D also hört es nach CapsLock=1; und NumLock=1; ScrollLock=1; sind nicht mehr bedingt... (mist)

War das jetzt richtig, dass ich mit outb(0x60, 0xED) den LED-Zustand setzte und dann mit inb(0x60) den LED-Status auslese?
Oder soll ich alle LEDs aus machen und dann den Scancode für die Tasten abscannen, die die LED-Status ändern können?
13
Softwareentwicklung / Re: [All In One]-Question lolxdfly
« am: 13. October 2013, 14:20 »
Es gibt wie immer mehrere Lösungen. Aus meiner Sicht ist die eleganteste Möglichkeit ein Zustandsautomat (state machine). Suche dir mal im Internet raus, wie das funktioniert. Implementieren kannst du es mit einem switch/case.

IN liest von einem Port. Du übergibst also die Adresse des Ports und bekommst einen Wert geliefert.
OUT schreibt auf einen Port. Du übergibst also die Adresse des Ports und zusätzlich einen Wert.

Wenn du auf einen Port etwas schreiben sollst und dann die Antwort lesen sollst, dann musst du erst OUT(Port, Daten) machen, um dann mit Ergebnis = IN(Port) das Ergebnis zu lesen.

Danke. Hmm trotzdem mache ich noch immer was falsch. Ich habe outb(0x60, 0xED) eingefügt! Außerdem habe ich vorsichtshalber den Binärcode in Dezimalcode umgerechnet, weil ich mir nicht sicher war, ob er den als binär erkennt:
bool ScrollLock=0;
bool NumLock=0;
bool CapsLock=0;
outb(0x60, 0xED); // Befehl 0xED an Port 0x60 schreiben
uint8_t led=inb(0x60); //Port 0x60 auslesen
if(led == 1) ScrollLock=1;
if(led == 2) NumLock=1;
if(led == 4) CapsLock=1;
if(led == 5) CapsLock=1; ScrollLock=1;
if(led == 6) CapsLock=1; NumLock=1;
if(led == 3) NumLock=1; ScrollLock=1;
if(led == 7) CapsLock=1; NumLock=1; ScrollLock=1;
14
Softwareentwicklung / Re: [All In One]-Question lolxdfly
« am: 12. October 2013, 14:09 »
Hallo,
danke für die Antworten :-).
Leider habe ich das Arbeiten mit Befehlen von Ports noch nie richtig hinbekommen (Habe es bis jetzt ja auch noch nie dringend gebraucht).
Ich habs mal so versucht:
bool ScrollLock=0;
bool NumLock=0;
bool CapsLock=0;
uint8_t led=inb(0xED); //Port:0x60 Befehl:0xED ...hmmm outb hätte 2 Wertübergaben, aber es returnt kein Wert
if(led == 00000001)         ScrollLock=1;
if(led == 00000010)            NumLock=1;
if(led == 00000100) CapsLock=1;
if(led == 00000110) CapsLock=1;    NumLock=1;
if(led == 00000011)    NumLock=1;   ScrollLock=1;
if(led == 00000111) CapsLock=1;    NumLock=1; ScrollLock=1;       
Kann mir jemand erklären, wie man es richig macht?

lolxdfly
15
Softwareentwicklung / Re: [All In One]-Question lolxdfly
« am: 09. October 2013, 17:15 »
Aber wie kann ich jetzt Make- und Breakcode unterscheiden? Lässt sich der Breakcode irgendwie identifizieren?
Wenn der Scancode kleiner als 128 ist, ist es ein Make-Code, sonst ist es ein Break-Code (für die Taste "Scancode-128").

Hallo,
ich habe jetzt glaub ich mein Problem erkannt! Die eine Frage zur Unterscheidung von Make und Breakcode war flasch gestellt! Was ich eigentlich fragen wollte war, wie man z.B. zwischen PgUp und 9(Numpad) unterscheidet. In den Tabellen, die man im Internet findet steht:
Zitat
Keypad 9  (PgUp)
Soll das heißen, dass die 9 auf dem Numpad und PageUp den gleichen Make und Breakcode haben? Irgendwie unterscheiden sie sich ja schon:
Zitat
9 gedrückt halten = 9
!=
Zitat
PgUp gedrückt halten = 999999...

EDIT: Ich seh grade das das höchstwahrscheinlich an den extended Scancodes liegt. Habe versucht sie hiermit abzufangen... hat aber nicht geklappt :( :

if(c==0xE0 || c==0xE1)
return '\0';

lolxdfly
16
Softwareentwicklung / Re: [All In One]-Question lolxdfly
« am: 03. October 2013, 12:40 »
Hallo,
habe jetzt versuch alles mit einem Array zu machen. Allerdings gibt er bei manchen Buchstaben noch ein anderes Zeichen mit aus. Wenn ich das mit den Breakcode richtig verstanden habe kann es daran nich liegen O.o
Hier der Code:
#ifndef ScConverter_H
#define ScConverter_H
 
#include "stdint.h"
 
  char SC2Char(unsigned char c)
  {
unsigned char nonShifttabel[] = {0, 0, '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', 0, 0, 0,
0, 'q', 'w', 'e', 'r', 't', 'z', 'u', 'i', 'o', 'p', 0, '+', 0, 0,
'a', 's', 'd', 'f', 'g', 'h', 'j', 'k', 'l', 0, 0, '^', 0, '#',
'y', 'x', 'c', 'v', 'b', 'n', 'm', ',', '.', '-', 0, 0, 0, ' ', 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
'7', '8', '9', '-', '4', '5', '6', '+', '1', '2', '3', '0', ',', '<', 0, 0, 0, 0 };

        //kommt später:
/*unsigned char Shifttabel[] = {0, 0, '!', 0, '§', '$', '%', '&', '/', '(', ')', '=', '?', 0, 0,
0, 'Q', 'W', 'E', 'R', 'T', 'Z', 'U', 'I', 'O', 'P', 0, '*', 0, 0,
'A', 'S', 'D', 'F', 'G', 'H', 'J', 'K', 'L', 0, 0, '^', 0, 0,
'Y', 'X', 'C', 'V', 'B', 'N', 'M', ';', ':', '-', 0, 0, 0, ' ', 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
'7', '8', '9', '-', '4', '5', '6', '+', '1', '2', '3', '0', ',', '<', 0, 0, 0, 0 };*/
unsigned char c1;

if(nonShifttabel[c] != 0)
{
c1=nonShifttabel[c];
}
else
{
c1='\0';
}
return c1;
  }
#endif
17
Softwareentwicklung / Re: [All In One]-Question lolxdfly
« am: 29. September 2013, 15:53 »
Da hätte ich auch drauf kommen können  :-)
Aber in meiner ScConverter.h ist mein höchster Wert 86. Also habe ich noch nie was mit dem Breakcode gemacht. Trotzdem habe ich das Problem mit dem - und /(man drückt / und es kommt -). Was vielleicht wichtig zu erwähnen ist: am Ende habe ich in der ScConverter.h:
else
c1='\0';
und in der Video.cpp:
    key=inb(0x060);
    final_key=SC2Char(key); //ScanCode in Char
    if(oldkey!=key && final_key!='\0'){
      put(final_key);
    }

Die Scancodes habe ich von http://www.blitzforum.de/help/Scancodes
Stimmt mit denen was nicht?
18
Softwareentwicklung / Re: [All In One]-Question lolxdfly
« am: 29. September 2013, 14:09 »
Ich glaube du hast das Konzept von Make- und Breakcodes nicht richtig umgesetzt. Scancode 201 existiert nicht, sondern dass ist der Breakcode von 73, da 73 + 128 = 201. Die Scancodes von 0-127 heißen "make codes", und werden gesendet, wenn die Taste gedrückt wurde. Die Scancodes 128-255 heißen "break codes" und werden gesendet, wenn die Taste wieder losgelassen wurde. Das heißt die make codes sollten (fürs erste) bei dir veranlassen, dass das Zeichen ausgegeben wurde, und die break codes sollten nichts tun (außer du hast damit kompliziertes vor).
Ok. Aber wie kann ich jetzt Make- und Breakcode unterscheiden? Lässt sich der Breakcode irgendwie identifizieren?

 Ich habe erstmal den / entfernt. Wenn ich - gedrückt halte macht er ein Minus. Wenn ich / gredückt halte macht er ganz viel Minus. Das heiß er nimmt bei beiden den Makecode. Nur nimmt er den bei - nur einmal und bei / unendlich.  :?

Wenn ich z.B. das l auf 166 setzte, dann setzt er auch nur ein l wenn ich die Taste auch loslasse. (so wie es soll)
19
Softwareentwicklung / Re: [All In One]-Question lolxdfly
« am: 26. September 2013, 19:55 »
Hi,
habe in den vergangeden Tagen den Tastatursupport fast komplett selbst hinbekommen  :-). Ich lese den port 0x60 aus und übersetze den Scancode mittels einer Header-Datei in Charwerte.
Es werden mittlerweile alle Tasten außer ä,ö,ü,ß,´,Shift, Tab, [Pfleiltasten],[PageUp, Einfg...] unterstützt! Wie ich das mit Shift und Tab hinbekomme weiß ich bereits, aber bei den Umlauten hab
ich keine Ahnung wie ich das angehen soll. Im I-net stand da auch nichts zu. Das größere Problem ist allerdings, das manche Tasten mehrere Scancodes haben(so meine Vermutung :-D).
Wenn ich z.B. - drücke printet er -/ . Das gleiche passiert, wenn ich /(auf Numpad) drücke. Wenn ich aber das Minus auf dem Numpad drücke kommt auch nur ein minus.
Ein weiteres Beispiel ist PageUp. Dann printet er eine 9. Wenn ich dem Scancode 201 noch nur zum Test # zuweise, printet er 9 und #.
Das ist die Codestelle zu dem -:
        // unsigned char c = Scancode aus Wertübergabe
else if(c==53 || c==74) //Scancodeabfrage (normal || numpad)
{
c1='-'; //Charwert zuweisen
}
Ich weiß, dass es besser ist, wenn man es mit einem Array löst. Das kommt noch...
20
Softwareentwicklung / Re: [All In One]-Question lolxdfly
« am: 17. September 2013, 17:35 »
ich habe den Kernel abgeändert, sodass er VGA nutzt und eigentlich ein Pixel der Position x=10 und y=10 blau färben müsste.

Du hast das Wichtigste und Schwierigste vergessen: Den Grafikmodus zu aktivieren. Ich glaube das Konzept ist dir nicht ganz klar, deswegen werde ich das mal versuchen zu illustrieren. Wenn du in z. B. Windows in der Systemsteuerung die Bildschirmauflösung änderst, dann sendet der Grafiktreiber über die I/O-Schnittstelle Befehle an die Grafikkarte, die sie dazu veranlassen diese Änderung durchzuführen. Wenn du z. B. als Auflösung 1600x1200 wählst, werden andere Befehle an die Grafikkarte gesendet, als wenn du 1920x1080 wählst. Genauso gibts es Befehlsfolgen, die die Grafikkarte in den Textmodus versetzen oder in den 320x200 Grafikmodus. Je nach Modus, verwendet die Grafikkarte einen anderen Speicherbereich aus dem sie Daten für Darstellung ausliest. Für den Textmodus ist das 0xB8000, für 320x200 ist das 0xA0000 und für höhere Auflösungen wieder eine andere Adresse. Was aber nicht funktioniert ist einfach an diese Adressen Sachen zu schreiben und zu erwarten, dass Grafikkarte weiß, welche Auflösung, etc. sie verwenden soll. Der Grund dafür ist wie bereits erwähnt, dass du nicht die entsprechende Befehlssequenz an die Grafikkarte geschickt hast.

Wie TheThing weiter oben schon erwähnt hat, gibt es mehrere Möglichkeiten diese Befehlssequenz an die Grafikkarte zu schicken. Da du dich im Protected Mode befindest, musst du entweder selbst die Grafikkarte ansteuern oder in den Real Mode (bzw. VM86) wechseln und das BIOS dafür aufrufen. Ersteres ist kompliziert und sieht ungefähr so aus: http://files.osdev.org/mirrors/geezer/osd/graphics/modes.c (das ist natürlich Code für mehrere Auflösungen), und das zweite ist in etwa genauso kompliziert und sieht ungefähr so aus: http://git.tyndur.org/?p=tyndur.git;a=blob;f=src/kernel2/src/arch/i386/vm86.c;h=50cc9f3cb1bdbad78bd779459453cb4f0cea16ab;hb=HEAD

Du könntest versuchen die erste Möglichkeit umzusetzen und die modes.c auf einem modernen Compiler zu laufen zu bringen, oder du beschäftigst dich damit in deinem OS den VM86 zu implementieren (den verlinkten Code aus tyndur nicht kopieren). Von der Illusion, dass wir dir nur helfen müssen einen Pixel zu färben und dann kommst du schon weiter, solltest du dich trennen. Nicht nur hast du noch einiges vor dir, sondern du wirst noch auf viele weitere Hürden stoßen, und ohne dich mit den Grundlagen zu beschäftigen kommst du nicht weit. Wenn du hingegen nur eine grafische Oberfläche umsetzen willst, dann solltest du vielleicht kein OS schreiben, sondern auf einem anderen aufbauen (was spricht gegen XNA, wenn du das schon kannst?). Wenn du so wenig andere Betriebssysteme wie möglich zwischen dir und der Hardware haben willst, kannst du auch versuchen mit einer Bibliothek wie z. B. Allegro unter DOS deine Vorstellungen umzusetzen.

Edit: Sorry wenn das etwas harsch klang. Ich will dich nicht demotivieren. Aber ich will auch nicht um den heißen Brei reden und irgendwelche Illusionen aufbauen.

Puhh... Die modes.c ist ziemlich groß! und ziemlich kompliziert. Hmm mal sehen ob da was von verstehen kann. Ich gehe auch nochmal die Grundlagen durch.
Gegen XNA spricht im Grunde nichts. Ich habe ein EgoShooter fast komplett hinbekommen. Nur habe ich nicht die Zeit und die Lust alles mit blender zu designen.
 
Edit: Da ich nächste Woche 3 Klausuren schreibe (auch Informatik :-)) hab ich nicht so viel Zeit. Deswegen werde ich mich nach den Grundlage im Textmode an die Tastaturunterstützung setzen.
Seiten: [1] 2 3

Einloggen