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

Seiten: [1] 2
1
Hallo,

ich hab mich zwar nicht wirklich mit dieser Bochs VBE Extension beschäftigt, aber nach dem Überfliegen von http://wiki.osdev.org/Bochs_VBE_Extensions vermute ich, dass das Problem hier liegen könnte:

outb(VBE_DISPI_IOPORT_INDEX, IndexValue);
outb(VBE_DISPI_IOPORT_DATA, DataValue);

Du schreibst mit outb ein Byte in den IO-Port, nach dem was hier steht sind die BGA Register aber 16 Bit groß:
Zitat
writing the data value to the 16-bit IO-port VBE_DISPI_IOPORT_DATA (0x01CF)

Ich hoffe das hilft dir weiter.
2
Lowlevel-Coding / Re: anfängerfrage: problem mit tutorial
« am: 07. November 2015, 00:47 »
Ich hab jetzt mal versucht mich etwas genauer mit deinem Code zu befassen (mit dem Erstellen der Einträge für GDT und IDT), dabei ist mir aufgefallen, dass du für die IDT Einträge den Selector 0x8 verwendest, der sich auf den Eintrag 1 in der GDT beziehen müsste:
gdt[1] = createGDTEntry(0, ~0, READABLE, 0);Für ein Codesegment fehlt da denke ich das EXECUTABLE Flag.
3
Lowlevel-Coding / Re: anfängerfrage: problem mit tutorial
« am: 06. November 2015, 17:31 »
Hallo OdinX,

ich habe deinen Code kurz überflogen, dabei sind mir zwei Dinge aufgefallen: zum einen sieht es so aus, dass enable_interrupts nie aufgerufen wird (vielleicht hast du die entsprechende Code-Stelle aber auch einfach nicht gezeigt) und dann scheinst du hier

for (i = 0; i < 256; i++) {
               createIDTEntry(i, &interrupt_handler_1);
}

für jeden Interrupt den interrupt_handler_1 einzutragen, ist das so gewünscht? Und wenn ja, werden Hardware Interrupts auch richtig behandelt (senden das End of Interrupt), sodass du zum Beispsiel auch immer weitere Timer-Interrupts erhältst?

Das erstellen der Einträge für GDT und IDT habe ich mir jetzt nicht genauer angesehen, sieht aber auf den ersten Blick gut aus.
Ich hoffe das hilft dir etwas weiter.
4
Lowlevel-Coding / Ist mein Paging total kaputt?
« am: 02. July 2013, 19:50 »
Hallo,

ich war ja in den letzten Tagen mal wieder etwas aktiver im IRC, deshalb werden wohl schon einige wissen, was mein Problem ist.
Ich wollt jetzt einfach mal fragen, ist das Paging, so wie ich es programmiert hab total kaputt? Sollte ich nochmal neu anfangen? Oder ist das ein Fehler, den man lösen kann?  :?

In Qemu funktioniert es, in einer VM und auf echter Hardware nicht. Die genaue Problemstelle ist im Quellcode markiert.
Er scheint zu versuchen von einer Adresse auszuführen, an der nichts ist und sie also auch nicht gemappt ist, ich weiß jedoch nicht warum.
Ich weiß grad nicht mehr welche Adresse das war, kann es aber nachsehen, wenn ich wieder an meinem PC bin.

Ich hoffe, dass irgendjemand Lust hat sich meine langen, vielleicht total kaputten Code anzusehen.
https://docs.google.com/file/d/0B3zUIFJ_B5J6T3VsOHVya3hvcEU/edit?usp=sharing
5
ich würde gerne wissen wie ein Betriebssystem das C-Programme ausführen kann gewährleistet, dass Inline-Assembler keinen "Unfug" anstellt. Was hindert ein solches Programm daran, mit bestimmten Assemblerbefehlen z.B. den PC zum Absturz zu bringen oder gar Schlimmeres. Assembler soll ja meines Wissens nach alles können was der Prozessor so hergibt.

Ja, Assembler kann alles, was der Prozessor hergibt. Aber ein Programm im Protected Mode läuft normalerweise im Usermode (Ring 3). Im Ring 3 hat man keinen Zugriff auf den vollständigen Befehlssatz. Nicht zugelassene Befehle (z.B. cli) erzeugen dann einen General Protection Fault.

Ich hoffe damit geholfen zu haben.
6
Lowlevel-Coding / Re: Keyboard Controller Capslock
« am: 02. February 2013, 14:23 »
Wird bei irgendwelchen Tasten auch 0xE0 oder 0xE1? Bei einem Extented Scancode wird zuerst über einen IRQ 0xE0 oder 0xE1 gesendet, in einem weiteren kommt der eigentliche Scancode.

z.B.
NUM / (Scancode 53) bzw. - (Scancode 53)

NUM / ist ein Extented Scancode, es wird zuerst 0xE0 gesendet, - ist kein Extented Scancode, es wird sofort der Scancode gesendet.

Du musst jetzt in deinem IRQ-Handler in einer Variable speichern, ob zuvor 0xE0 gesendet wurde.

Ich hoffe ich hab es richtig und verständlich erklärt. Viel Spaß beim Programmieren.
7
Lowlevel-Coding / Re: Keyboard Controller Capslock
« am: 02. February 2013, 13:37 »
Das Problem sind die Extented Scancodes, diese bestehen aus mehreren Bytes, die einzeln gesendet werden (so wie bei dir bei PAUSE).
www.lowlevel.eu/wiki/KBC hier kannst du mehr darüber nachlesen (im Abschnitt IRQ-Handler).
Ich hoffe das hilft dir weiter.
8
Lowlevel-Coding / vmm_alloc Problem
« am: 28. January 2013, 14:28 »
Hallo,

Ich bin bei meinem OS jetzt so weit, das Paging funktionieren sollte (es stürzt jedenfalls nicht mehr ab :-D).

Mein Problem ist jetzt die vmm_alloc Funktion, wenn ich nach einer freien Adresse suche bekomme ich immer die gleiche zurück.
Wenn ich also zweimal hintereinander vmm_alloc aufrufe, wird z.B. immer 0x02060000 als Adresse zurückgegeben.
Ich hab schon in meinem Code gesucht, aber ich kann den Fehler einfach nicht finden.(Vielleicht ist ja auch mein ganzer Code ein Fehler :lol:)

Hier der Code: http://pastebin.com/j4vCjU0T . Vielleicht kann ja jemand das Problem finden.
9
Lowlevel-Coding / Re: Interrupts funktionieren nicht
« am: 23. January 2013, 18:03 »
Hallo.
Um zu wissen, wo er nachgucken soll muss die idt geladen werden. Hast du sie geladen? Wenn nicht kannst du hier http://www.lowlevel.eu/wiki/IDT nachlesen, wie das geht.
10
Offtopic / Screen of Death
« am: 14. November 2012, 21:16 »
Hallo.
Es wäre mal interessant zu sehen wie eure Screens of Death so aussehen.
Vielleicht war ja einer von euch sehr kreativ dabei, seinen Screen of Death zu gestalten.

Hier ist mein Screen of Death:


Ich freue mich schon darauf eure zu sehen :-D
11
Lowlevel-Coding / Re: Funktionen in Programm lösen Fehler aus
« am: 20. October 2012, 11:34 »
Wie erkenne ich, ob der Stack nicht richtig eingerichtet ist? Ich habe es so wie in OS-Dev für Einsteiger gemacht.
12
Lowlevel-Coding / Funktionen in Programm lösen Fehler aus
« am: 19. October 2012, 22:19 »
Hallo,

Ich versuche bei meinem Kernel gerade ein Programm als Modul durch Grub laden zu lassen.
Ich mach es etwa so wie in http://www.lowlevel.eu/wiki/Teil_8_-_Ein_erstes_Programm.
Ich verwende für das Testprogramm noch eine flache Binaries.
Das Programm startet gut, auch der erste Syscall funktioiniert ganz gut, doch wenn ich in diesem Programm eine Funktion enthalten ist wird ein #GP ausgelöst.
Warum :?

So wird das Programm geladen:
        struct mbs_mods *mod = mbs->mbs_mods_addr;

uintptr_t addr = mod->mod_start;
uintptr_t addr_end = mod->mod_end;

memcpy( (void*) 0x200000, (void*)addr, (addr_end - addr) );

init_task((void*)0x200000, 1);

Und so sieht das Programm aus:
#include "stdint.h"

void put_char(char chr)
{
asm( "int $0x30" : : "a" (0x001), "b" (chr) );
}

void _start(void)
{
put_char('A');
//asm( "int $0x30" : : "a" (0x001), "b" ('A') );
while(1);
}
13
Lowlevel-Coding / Re: Physische Speicherverwaltung - Adresse 0x0
« am: 16. October 2012, 23:47 »
Vielen Dank für die schnellen Antworten.
Ich denke, damit kann ich jetzt was programmieren :-).
14
Lowlevel-Coding / Re: Physische Speicherverwaltung - Adresse 0x0
« am: 16. October 2012, 22:59 »
Vielen Dank.
Ich habe es dann so gemacht die Adresse 0x0000 als belegt zu markieren.

Jetzt habe ich noch zwei fragen:
1. Was muss ich noch als belegt markieren (Bitmap, Multiboot-Structure) und wie ermittle ich die entsprechenden Adressen?
2. Kann ich den Eintrag mbs_mem_upper aus der Multiboot-Structure dazu benutzen die gesamt Größe das Speichers zu ermitteln?
15
Lowlevel-Coding / Re: Physische Speicherverwaltung - Adresse 0x0
« am: 16. October 2012, 21:27 »
Ich glaube, ich habe die Physische Speicherverwaltung so aufgebaut, das sie ganze Seiten zurückgibt.

Seite 0 hat die Adresse 0x0000 also 0
Seite 1                        0x1000 also 4096
Seite 2                        0x2000 also 8192
usw.

Oder ist das so falsch?
16
Lowlevel-Coding / Physische Speicherverwaltung - Adresse 0x0
« am: 16. October 2012, 20:52 »
Hallo,
ich bin gerade dabei, bei meinem Kernel die Physische Speicherverwaltung zu schreiben.
Es ist ja so, dass wenn kein Speicher mehr frei ist NULL zurückgegeben wird, wenn jedoch der Speicher an der Adresse 0x0 frei ist wird ja auch 0 zurückgegeben.
Ist es richtig einfach die Adresse 0x0 immer als belegt zu markieren :?
17
Lowlevel-Coding / Re: Probleme durch Multitasking
« am: 08. October 2012, 22:00 »
Vielen Dank für die schnellen Antworten!
Es ist wirklich der andere Task, der die Tastatur stört.
Ich frage mich jedoch, warum dann alle anderen Tasten ohne Probleme funktionieren.
18
Lowlevel-Coding / Re: Probleme durch Multitasking
« am: 08. October 2012, 20:58 »
Wenn ich die Back-Space Taste drücke wird die Eingabe nicht mehr gelöscht. Ich habe um zu testen, ob alles funktioniert in einem Task ein sehr einfaches Rechenprogramm geschrieben. Wenn man dort eine Zahl eingibt und sie ändern möchte sollte man die Back-Space Taste drücken können, um die Zahl Ziffer für Ziffer wieder zu löschen. Ohne Multitasking funktionierte das auch noch, aber jetzt im Task nicht mehr.
Hier noch der Codes des sehr einfachen Rechenprogramms:
void task_a(void)
{
    while (1)
{
int zahl_1 = 0;
int zahl_2 = 0;
char rechenzeichen = 0;
int ergebnis = 0;
        kprintf("\nBitte Zahl_1 eingeben: ");
zahl_1 = getn();
getch();

kprintf("\nBitte Rechenzeichen eingeben: ");
rechenzeichen = getchar();
getch();

kprintf("\nBitte Zahl_2 eingeben: ");
zahl_2 = getn();
getch();

switch(rechenzeichen)
{
case '+':
ergebnis = zahl_1 + zahl_2;
break;

case '-':
ergebnis = zahl_1 - zahl_2;
break;

case '*':
ergebnis = zahl_1 * zahl_2;
break;

case '/':
ergebnis = zahl_1 / zahl_2;
break;

case '%':
ergebnis = zahl_1 % zahl_2;
break;

default:
kprintf("\n \t Ungueltiges Rechenzeichen!");
break;
}
kprintf("\n \t Ergebnis: %d", ergebnis);
    }
}
19
Lowlevel-Coding / Probleme durch Multitasking
« am: 08. October 2012, 20:46 »
Hallo,
ich habe bei meinem Kernel jetzt Multitasking hinzugefügt. Es funktioniert auch ganz gut, doch es gibt jetzt Probleme beim einlesen von Tastatureingaben.
Ich habe die Funktionen getchar() und getn() für die Eingabe von  Zeichen und Zahlen. Mit der Back-Space Taste können Zeichen und Ziffern wieder gelöscht werden, doch jetzt funktioniert es nicht mehr. Ich hab das Multitasking zum Test einmal wieder heraus genommen und es funktionierte wieder.
Hier einmal der Code meines Tastaturtreibers:
#include "IO_Ports.h"
#include "stdint.h"
#include "string.h"
#include "stdarg.h"

#ifndef KEYBOARD_H
#define KEYBOARD_H

int eingabe_j_n = 0;

int eingabe_g_k = 0;

#define MAX_SCANCODE 0x3a

char TASTEN_K[MAX_SCANCODE] = {27,   '1',  '2',   '3', '4',  '5',  '6',  '7',  '8',  '9',  '0', 'ß', '´', 8, '\t', 'q', 'w', 'e', 'r', 't', 'z', 'u', 'i', 'o', 'p', 'ü', '+' , '\n' , 0 , 'a', 's', 'd', 'f', 'g', 'h', 'j', 'k', 'l', 'ö', 'ä', '<', 0, '#', 'y', 'x', 'c', 'v', 'b', 'n', 'm', ',', '.', '-', 0, 0, 0, ' ', 0};

char TASTEN_G[MAX_SCANCODE] = {27,   '!',  '"',   '§', '$',  '%',  '&',  '/',  '(',  ')',  '=', '?', '`', 8, '\t', 'Q', 'W', 'E', 'R', 'T', 'Z', 'U', 'I', 'O', 'P', 'Ü', '*' , '\n' , 0 , 'A', 'S', 'D', 'F', 'G', 'H', 'J', 'K', 'L', 'Ö', 'Ä', '>', 0, '\'', 'Y', 'X', 'C', 'V', 'B', 'N', 'M', ';', ':', '_', 0, 0, 0, ' ', 0};

void cmd_keyboard(uint8_t cmd)
{
int i = 1;
while (i == 1)
{
if(inb(0x64) & 0x2)
{
}
else
{
i = 0;
}
}
    outb(0x60, cmd);
}

uint8_t read_scancode()
{
while (!(inb(0x64) & 0x1))
{
}

uint8_t scancode = inb(0x60);

return scancode;

while(inb(0x64) &0x1)
{
inb(0x60);
}

}

char translate_scancode(uint8_t scancode)
{
if(scancode == 0x2a || scancode == 0x36 || scancode == 0x3a)
{
if(eingabe_g_k == 1)
{
eingabe_g_k = 0;
cmd_keyboard(0xed);
outb(0x60,0x00);
}
else
{
eingabe_g_k = 1;
cmd_keyboard(0xed);
outb(0x60,0x02);
}
return 0;
}
if (scancode > MAX_SCANCODE)
{
return 0;
}

uint8_t i = 0x01;
while(i <= MAX_SCANCODE)
{
if (scancode == i)
{
if(eingabe_g_k == 0)
{
return TASTEN_K[i-1];
}
else if(eingabe_g_k == 1)
{
return TASTEN_G[i-1];
}
}
i++;
}

}

int getchar()
{
A:;
char chr;

while(eingabe_j_n != 1)
{
}

uint8_t scancode = read_scancode();

chr = translate_scancode(scancode);
if(chr == 8)
{
del_last_char();
}

else if (chr != 0)
{
put_char(chr);
}

else if(chr == 0)
{
eingabe_j_n = 0;

goto A;
}

eingabe_j_n = 0;

return chr;
}

int getch()
{
A:;
char chr;

while(eingabe_j_n != 1)
{
}

uint8_t scancode = read_scancode();

chr = translate_scancode(scancode);
if(chr == 0)
{
eingabe_j_n = 0;

goto A;
}

eingabe_j_n = 0;

return chr;
}


int getn()
{
int zahl = 0;
char chr = 0;
while(chr != '\n')
{
chr = getch();
if(chr == 8)
{
zahl = zahl / 10;
del_last_char();
}
else if(chr > 57 || chr < 48)
{

}
else
{
put_char(chr);
int ziffer = chr - 48;
zahl = zahl * 10 + ziffer;
}
}

return zahl;
}

void init_keyboard()
{
set_color(0x0e);kprintf("\tStarte Tastatur...");

while(inb(0x64) &0x1)
{
kprintf(".");
inb(0x60);
}

cmd_keyboard(0xF4);

read_scancode();

set_color(0x06);kprintf("\tTastatur gestartet!\n");set_color(0x07);
}

void handle_keyboard()
{
eingabe_j_n = 1;
}

#endif
20
Lowlevel-Coding / Re: strcmp
« am: 20. August 2012, 16:09 »
So, ich habe jetzt eine Lösung gefunden, die bei mir Funktionier:
int strcmp(const char * str_1 , const char * str_2)
{
int i;
int ret = 0;
for(i = 0; str_1[i] != '\0' && str_2[i] != '\0' ; i++)
{
if(str_1[i] > str_2[i])
{
ret = 1;
}
else if(str_1[i] < str_2[i])
{
ret = -1;
}
}
return ret;
}

Wenn jemand noch Fehler findet, oder etwas zu verbessern weiß, kann er sich ja melden.
Seiten: [1] 2

Einloggen