Hallöle,
mal wieder ne Frage (die letzte is ja schon seehr lang her)
Also ich hab jetz mein os soweit am laufen, tastaturtreiber und timer-programmierung haben funktioniert. Jetzt hab ich gedacht ich tu noch ein e CPU-erkennung einbauen. Seitdem kommt immer ein page-fault, weil der auf irgendeinen speicherbereich zugreifen will den ich gar nich in den page-tables drinhab, da er nicht benötigt wird.
Ich denke da hab ich irgendeinen fehler mit nem pointer gemacht, ich habe auch schon eine Vermutung wo er sein koennte, aber ich komme einfach nicht drauf was da falsch ist, deswegen poste ich hier mal den code fuer meine bildschirmausgabe und nen screenshot von der exception, und hoffe hier kann mir jemand helfen
und er code:
Ich denke das Problem liegt in der scroll_down() funktion bei dem memcpy und memset...
//textmode.c Ausgabefunktionen für Textmode
#include "textmode.h"
#include "../kernel/livinos.h" //fuer memcpy und memsetD
unsigned int gpos=0;
unsigned short *pScreen=(unsigned short*) 0xB8000;
unsigned short gattr=0x0700;
static char hexmap[] = {
'0', '1', '2', '3', '4', '5', '6', '7',
'8', '9', 'A', 'B', 'C', 'D', 'E', 'F'};
unsigned short attribut(unsigned char vogr, unsigned char higr)
{
unsigned short temp;
temp= higr;
temp=temp<<4;
temp= temp | vogr;
temp=temp<<8;
//gattr=temp;
return temp;
};
void set_attribut(unsigned char vogr, unsigned char higr)
{
gattr=attribut(vogr,higr);
return;
};
void gotoxy(unsigned char x, unsigned char y)
{
gpos= x+(y*COLS);
return;
};
void scroll_down()
{
unsigned blank, temp;
blank = 0x20 | (gattr << 8);
if (GETY >= 25)
{
temp = GETY - 25 +1;
memcpy(pScreen, pScreen + temp*80, (25 - temp) * 80 * 2);
memsetw(pScreen + (25-temp) *80, blank, 80);
gpos = 1920;
}
return;
};
void move_cursor()
{
outportb(0x3D4, 14);
outportb(0x3D5, gpos>>8);
outportb(0x3D4, 15);
outportb(0x3D5, (unsigned char) gpos);
};
void putch(unsigned char ch)
{
switch(ch) {
case '\n':
gotoxy(0,GETY+1);
break;
case '\r':
gotoxy(0,GETY);
break;
default:
pScreen[gpos++]= (unsigned short) ch | gattr;
break;
};
scroll_down();
move_cursor();
return;
};
void puts(char *s)
{
while(*s)
putch(*(s++));
return;
};
void clearscreen(unsigned char character, unsigned short attr)
{
unsigned short temp=gattr;
unsigned int i;
gattr=attr;
gotoxy(0,0);
for(i=0;i<=1999;i++)
{
putch(character);
};
gotoxy(0,0);
gattr=temp;
return;
};
/*detect_vid()
*gibt 1 zurueck wenn Farbgrafikkarte gefunden, sonst 0
*/
unsigned char detect_vid(void)
{
unsigned char temp;
char c=(*((unsigned short*) 0x410)&0x30);
if(c==0x30)
temp=0; //mono
else
temp=1; //color
return temp;
};
/* kprintf
*/
void kprintf(char *format,...)
{
int *args = ((int*)&format) + 1;
char *t, d[10], xx[8];
xx[8]=0;
unsigned char aktarg=0;
unsigned int u;
int n, i;
//erstes argument in args[0]
while (*format)
{
if (*format== '%') {
format++;
if (*format == 0) break;
switch (*format) {
case 's': //string
//format++;
t = args[aktarg];
while (*t != 0) {
putch(*t);
t++;
}
break;
case 'c': //einzelnes zeichen
//format++;
putch(args[aktarg]);
break;
case 'x': //32 bit hex
//format++;
u = args[aktarg];
//putch('0');
//putch('x');
for(i=7;i>=0;i--) {
xx[i]=hexmap[u & 0x0F];
u >>= 4;
}
puts(xx);
break;
case 'd': //signed integer
//format++;
n = args[aktarg];
if (n < 0) {
u = -n;
putch('-');
} else {
u = n;
}
goto u2;
case 'u': //unsigned integer
//format++;
u = args[aktarg];
u2:
i=9;
do {
d[i] = (u%10) + '0';
u /= 10;
i--;
} while (u && i>=0);
while (++i < 10) {
putch(d[i]);
}
break;
case 'X': //8 bit hex
//format++;
n = args[aktarg];
//putch('0');
//putch('x');
putch(hexmap[(n & 0xF0) >> 4]);
putch(hexmap[n & 0x0F]);
break;
default:
putch(*format);
} //ende switch
aktarg++;
} else { //gehoert zu if '%'
putch(*format);
}
format++;
} //ende while
}
Schonmal danke im vorraus,
livinskull