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

Seiten: 1 [2]
21
Lowlevel-Coding / Re: kprintf - Problem
« am: 13. January 2013, 15:39 »
void checkcursor()
{
if(cursor_y == 25)
{
scrolldown(1);
}
if(cursor_x == 79)
{
cursor_x = 0;
cursor_y++;
}
movecursor(cursor_x, cursor_y);
}

void movecursor(uint8_t col, uint8_t row)
{
uint16_t tmp;
tmp = row * SCREEN_WIDTH + col;
outb(0x3D4, 14);
outb(0x3D5, tmp >> 8);
outb(0x3D4, 15);
outb(0x3D5, tmp);
}

cursor_x und cursor_y habe ich global in der Datei console.c deklariert.

Ich werde auch gleich die Steuerzeichen in putc() implementieren.


MrTom3715
22
Lowlevel-Coding / Re: kprintf - Problem
« am: 13. January 2013, 14:00 »
Es passiert gar nichts. Es wird weitergeschrieben als wäre kein \n da.
23
Lowlevel-Coding / Re: kprintf - Problem
« am: 13. January 2013, 13:52 »
Das habe ich auch schon probiert. Kein Unterschied.
24
Lowlevel-Coding / kprintf - Problem
« am: 13. January 2013, 13:16 »
Hallo,

ich hab vor mein System aufzuräumen bleibe aber bei printf hängen.
Das Steuerzeichen /n funktioniert nicht.  :cry:
Bin mit meinem Latein am Ende.

Hier der Code:
void putc(char c)
{
video[(cursor_y * SCREEN_WIDTH) + cursor_x * 2] = c;
video[(cursor_y * SCREEN_WIDTH) + cursor_x * 2 + 1] = color;
cursor_x++;
printf_res++;
checkcursor();
}

void puts(const char* s)
{
while (*s)
{
putc(*s++);
}
}

void putn(unsigned long t, int s)
{
const char* symbol = "0123456789abcdefghijklmnopqrstuvwxyz";
char buffer[65];
char* r;

if (s > 36)
{
return;
}
r = buffer + 64;
*r = '\0';
do
{
*--r = symbol[t % s];
t /= s;
}
while (t);
puts(r);
}

int printf(const char* fmt, ...)
{
va_list ap;
const char* s;
unsigned long n;
va_start(ap, fmt);
printf_res = 0;

while (*fmt)
{
if (*fmt == '%')
{
fmt++;
switch (*fmt)
{
case 's':
s = va_arg(ap, char*);
puts(s);
break;
case 'p':
case 'x':
n = va_arg(ap, unsigned long int);
putn(n, 10);
break;
case 'd':
case 'u':
n = va_arg(ap, unsigned long int);
putn(n, 10);
break;
case '%':
putc('%');
break;
case '\0':
goto end;
default:
putc('%');
putc(*fmt);
break;
}
}
else if(*fmt == '\n')
{
cursor_y++;
cursor_x = 0;
checkcursor();
}
else if(*fmt == '\t')
{
if(cursor_x > SCREEN_WIDTH - TABULATOR_WIDTH)
{
cursor_x = 0;
cursor_y++;
checkcursor();
}
else
{
cursor_x = cursor_x + TABULATOR_WIDTH;
}
}
else if (*fmt == '\b')
{
cursor_x--;
video[(cursor_y * SCREEN_WIDTH) + cursor_x * 2] = ' ';
}
else if (*fmt == '\r')
{
cursor_x = 0;
}
else if (*fmt == '\v')
{
if(cursor_y > SCREEN_HEIGHT - TABULATOR_HEIGHT)
{
scrolldown(SCREEN_HEIGHT - cursor_y);
}
else
{
cursor_x = 0;
cursor_y = cursor_y + TABULATOR_HEIGHT;
}
}
else if (*fmt == '\f')
{
cls();
}
else if (*fmt == '\\')
{
video[(cursor_y * SCREEN_WIDTH) + cursor_x * 2] = 0x5C;
video[(cursor_y * SCREEN_WIDTH) + cursor_x * 2 + 1] = color;
cursor_x++;
}
else
{
putc(*fmt);
}
fmt++;
}
end:
va_end(ap);
return printf_res;
}

Ich hoffe ihr könnt mir helfen.


MrTom3715
25
Softwareentwicklung / Re: CPU Register auslesen
« am: 08. January 2013, 21:30 »
Vielen Dank,
ich habe jetzt den CPU Zustand gesichert und kann jetzt die Werte abrufen.
Dankeschön :-)

MrTom3715
26
Softwareentwicklung / CPU Register auslesen
« am: 08. January 2013, 18:46 »
Hallo,

ich bin gerade dabei mein "Bluescreen" zu programmieren.
Eax, ebx, ecx, edx, esi und edi kann ich schon in eine Variable schreiben und diese ausgeben.
Wie mache ich das aber nun mit ebp, eip, esp, cs, ss und Flags?

Eax wird ja so ausgelesen:
asm volatile ("inb  %%dx, %%al" : "=a" (n) : );
Wie muss ich den Ausgabeparameter ändern um ebp, eip, esp, cs, ss und Flags in die Variable n zu schreiben.

Ändert das Verfahren, das ich oben angewendet habe, auch die Register?


MrTom3715
27
Dankeschön funktioniert.

Wenn ich aber mehrere Ordner erstelle, schreibe ich dann in der nächsten Zeile einfach noch einmal das gleiche mit dem anderen Ordnernamen.


MrTom3715
28
Danke für deine Antwort.

Ich habe jetzt aber noch nicht verstanden wie ich das ins Makefile schreiben soll.

Ich muss in die Makefile CFLAGS = ... -i Ordnername der Dateien eingeben.

Jetzt meine Frage:
Was muss ich statt den ... schreiben und wohin in das Makefile.

Mein Makefile sieht im Moment so aus:
SRCS = $(shell find -name '*.[cS]')
OBJS = $(addsuffix .o,$(basename $(SRCS)))

CC = gcc
LD = ld

ASFLAGS = -m32
CFLAGS = -m32 -Wall -g -fno-stack-protector -nostdinc
LDFLAGS = -melf_i386 -Tkernel.ld

kernel: $(OBJS)
$(LD) $(LDFLAGS) -o $@ $^

%.o: %.c
$(CC) $(CFLAGS) -c -o $@ $^

%.o: %.S
$(CC) $(ASFLAGS) -c -o $@ $^

clean:
rm $(OBJS)

.PHONY: clean

MrTom3715
29
Lowlevel-Coding / Probleme mit der IDT
« am: 04. January 2013, 20:46 »
Hallo,
ich bin gerade dabei die IDT zu programmieren, habe aber ein Problem.
Wenn ich kompilieren will meldet mir das Terminal, dass bei
static uint64_t idt[IDT_ENTRIES];IDT_ENTRIES nicht deklariert ist.

Hier meine ganze idt.c:
#ifndef INCLUDE_idt_H
#define INCLUDE_idt_H

#include "types.h"
#include "console.h"

//Exceptions:
extern void intr_stub_0();
extern void intr_stub_1();
extern void intr_stub_2();
extern void intr_stub_3();
extern void intr_stub_4();
extern void intr_stub_5();
extern void intr_stub_6();
extern void intr_stub_7();
extern void intr_stub_8();
extern void intr_stub_9();
extern void intr_stub_10();
extern void intr_stub_11();
extern void intr_stub_12();
extern void intr_stub_13();
extern void intr_stub_14();
extern void intr_stub_15();
extern void intr_stub_16();
extern void intr_stub_17();
extern void intr_stub_18();
extern void intr_stub_19();
//Interrupt-Requests:
extern void intr_stub_32();
extern void intr_stub_33();
extern void intr_stub_34();
extern void intr_stub_35();
extern void intr_stub_36();
extern void intr_stub_37();
extern void intr_stub_38();
extern void intr_stub_39();
extern void intr_stub_40();
extern void intr_stub_41();
extern void intr_stub_42();
extern void intr_stub_43();
extern void intr_stub_44();
extern void intr_stub_45();
extern void intr_stub_46();
extern void intr_stub_47();
//Syscalls:
extern void intr_stub_48();


static uint64_t idt[IDT_ENTRIES];

struct {
unsigned short int limit;
void* pointer;
} __attribute__((packed)) idtp = {
.limit = IDT_ENTRIES * 8 - 1,
.pointer = idt,
};


struct cpu_state {
unsigned long eax;
unsigned long ebx;
unsigned long ecx;
unsigned long edx;
unsigned long esi;
unsigned long edi;
unsigned long ebp;

unsigned long intr;
unsigned long error;

unsigned long eip;
unsigned long cs;
unsigned long eflags;
unsigned long esp;
unsigned long ss;
};



static void set_idt_entry(int i, unsigned long long base, unsigned int selektor, int flags)
{
idt[i] = base & 0xffff;
idt[i] |= (selektor & 0xffff) << 16;
idt[i] |= (flags & 0xffLL) << 40;
idt[i] |= ((base >> 16) & 0xffff) << 48;
}

void init_idt(void)
{
//set_idt_entry(0, (uint32_t)int_handler, 0x8, IDT_FLAG_RING0 | IDT_FLAG_PRESENT);
//set_idt_entry(0, (uint32_t)int_handler, 0x8, 0x8e);
//Exceptions:
set_idt_entry(0, (uint32_t)intr_stub_0, 0x8, 0x8e);
set_idt_entry(1, (uint32_t)intr_stub_1, 0x8, 0x8e);
set_idt_entry(2, (uint32_t)intr_stub_2, 0x8, 0x8e);
set_idt_entry(3, (uint32_t)intr_stub_3, 0x8, 0x8e);
set_idt_entry(4, (uint32_t)intr_stub_4, 0x8, 0x8e);
set_idt_entry(5, (uint32_t)intr_stub_5, 0x8, 0x8e);
set_idt_entry(6, (uint32_t)intr_stub_6, 0x8, 0x8e);
set_idt_entry(7, (uint32_t)intr_stub_7, 0x8, 0x8e);
set_idt_entry(8, (uint32_t)intr_stub_8, 0x8, 0x8e);
set_idt_entry(9, (uint32_t)intr_stub_9, 0x8, 0x8e);
set_idt_entry(10, (uint32_t)intr_stub_10, 0x8, 0x8e);
set_idt_entry(11, (uint32_t)intr_stub_11, 0x8, 0x8e);
set_idt_entry(12, (uint32_t)intr_stub_12, 0x8, 0x8e);
set_idt_entry(13, (uint32_t)intr_stub_13, 0x8, 0x8e);
set_idt_entry(14, (uint32_t)intr_stub_14, 0x8, 0x8e);
set_idt_entry(15, (uint32_t)intr_stub_15, 0x8, 0x8e);
set_idt_entry(16, (uint32_t)intr_stub_16, 0x8, 0x8e);
set_idt_entry(17, (uint32_t)intr_stub_17, 0x8, 0x8e);
set_idt_entry(18, (uint32_t)intr_stub_18, 0x8, 0x8e);
set_idt_entry(19, (uint32_t)intr_stub_19, 0x8, 0x8e);
//IRQs:
set_idt_entry(32, (uint32_t)intr_stub_32, 0x8, 0x8e);
set_idt_entry(33, (uint32_t)intr_stub_33, 0x8, 0x8e);
set_idt_entry(34, (uint32_t)intr_stub_34, 0x8, 0x8e);
set_idt_entry(35, (uint32_t)intr_stub_35, 0x8, 0x8e);
set_idt_entry(36, (uint32_t)intr_stub_36, 0x8, 0x8e);
set_idt_entry(37, (uint32_t)intr_stub_37, 0x8, 0x8e);
set_idt_entry(38, (uint32_t)intr_stub_38, 0x8, 0x8e);
set_idt_entry(39, (uint32_t)intr_stub_39, 0x8, 0x8e);
set_idt_entry(40, (uint32_t)intr_stub_40, 0x8, 0x8e);
set_idt_entry(41, (uint32_t)intr_stub_41, 0x8, 0x8e);
set_idt_entry(42, (uint32_t)intr_stub_42, 0x8, 0x8e);
set_idt_entry(43, (uint32_t)intr_stub_43, 0x8, 0x8e);
set_idt_entry(44, (uint32_t)intr_stub_44, 0x8, 0x8e);
set_idt_entry(45, (uint32_t)intr_stub_45, 0x8, 0x8e);
set_idt_entry(46, (uint32_t)intr_stub_46, 0x8, 0x8e);
set_idt_entry(47, (uint32_t)intr_stub_47, 0x8, 0x8e);
//Syscalls:
set_idt_entry(48, (uint32_t)intr_stub_48, 0x8, 0x8e);

load_idt();
}

void load_idt(void)
{
asm volatile("lidt %0" : : "m" (idtp));
}

void int_handler(void)
{
kprintf("Ein Interrupt!\n");
while(1);
}

#endif

Was habe ich falsch gemacht?

Danke für eure Antworten.


MrTom3715
30
Softwareentwicklung / Includedateien & Co in verschiedene Ordner
« am: 04. January 2013, 20:32 »
Hallo,
ich habe jetzt schon einige Sachen programmiert.
Nun schaue ich meinen Source Ordner an und sehe nichts.
Kann ich mein Makefile ändern das ich z.B. die Includedateien in einen Ordner gebe und die Funktionen in einen anderen?
Muss ich dann auch noch etwas an den Dateien verändern??

Danke schon im Vorraus.

MrTom3715
31
Lowlevel-Coding / Re: kprintf - Steuerzeichen
« am: 12. November 2012, 20:14 »
Klappt Super!
Dankeschön!

MrTom3715
32
Lowlevel-Coding / Re: kprintf - Steuerzeichen
« am: 12. November 2012, 19:06 »
So die letzte Zeile ist frei, aber "Und das ist mein Zwilling" ist nicht da.
Ich habe die eine Schleife gelöscht und die andere geändert.


MrTom3715
33
Lowlevel-Coding / Re: kprintf - Steuerzeichen
« am: 12. November 2012, 19:01 »
Stimmt die Schleife ist unnötig werde es gleich mal ausprobieren.
Danke.

MrTom3715
34
Lowlevel-Coding / Re: kprintf - Steuerzeichen
« am: 12. November 2012, 18:50 »
Hallo,

ich habe x und y jetzt umbenannt und kputc(char c) erstellt:
void kputc(char c)
{
cursor_x++;
if(c == '\n')
{
cursor_y++;
cursor_x = -1;
if(cursor_y == 25)
{
scrolldown(1);
}
}
else
{
video[(cursor_y * 160) + cursor_x * 2] = c;
video[(cursor_y * 160) + cursor_x * 2 + 1] = 0x07;
}
}


void scrolldown(int times)
{
int n;
int i;
int p;
for (p = 0; p < times; p++)
{for (i = 0; i < 4000; i++)
{
for (n = 0; n < 160; n++)
video[n] = 0;
for (n = 0; n < 3840; n++)
video[n] = video[n + 160];
for (n = 3841; n < 4000; n++)
video[n] = 0;
}
}
}

Ich möchte den Text gerne manuell verschieben.
for (n = 0; n < 3840; n++)
video[n] = video[n + 160];
funktioniert aber nicht was ist falsch?

MrTom3715
35
Lowlevel-Coding / Re: kprintf - Steuerzeichen
« am: 11. November 2012, 19:57 »
Mein Code sieht jetzt so aus:
void kprintf(char * hw, ...)
{
char* video = (char*) 0xb8000;
int i;
int n;
int x;
int y;
int zeile;

for (i = 0; hw[i] != '\0'; i++)
{
y = i;
if(hw[i] == '\n')
{
zeile++;
n == 79 - i;
if(i == 3999)
{
memcpy(video, (void *)(((uintptr_t)video) + 2 * 80), 24 * 80);
memset((void *)(((uintptr_t)video) + 24 * 80 * 2), 0, 160);
zeile = 24;
}
else
{
for(x = i; x < n; x++)
video[x] = 0;
}
}
else
{
video[(zeile * 160) + y * 2] = hw[i];
        video[(zeile * 160) + y * 2 + 1] = 0x07;
}
    }

}

init.c:
for(i = 0; i< 24; i++)
kprintf("Hello World!\n");

kprintf("Ich bin eine neue Zeile\n");
kprintf("Und das ist mein Zwilling\n");

"Und das ist mein Zwilling" wird nicht angezeigt.
Was ist falsch?

MrTom3715
36
Lowlevel-Coding / Re: kprintf - Steuerzeichen
« am: 11. November 2012, 19:19 »
Bei mir fängt eine neue Zeile mit
video[(zeile * 160) + i * 2] = hw[i];an. Ist das normal?

MrTom3715
37
Lowlevel-Coding / Re: kprintf - Steuerzeichen
« am: 11. November 2012, 12:23 »
Vielen Dank für die ausführliche Erklärung Jidder.
Ich habe kein x und kein y. Ich werde es aber damit versuchen.

MrTom3715 :-)
38
Lowlevel-Coding / kprintf - Steuerzeichen
« am: 10. November 2012, 21:51 »
Hallo Liebe Community,

ich habe jetzt geschafft Hello World zu schreiben nur ich weiß nicht wie ich "\n" implementieren soll.
Ich hoffe ihr könnt mir helfen.


MrTom3715
Seiten: 1 [2]

Einloggen