1
Softwareentwicklung / Re: [All In One]-Question lolxdfly
« am: 09. August 2014, 20:19 »
Ja.
Habe jetzt den Timer schon etwas entschäft
Habe jetzt den Timer schon etwas entschäft
21. November 2024, 13:40
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.
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
if(GetKBCInput(COLOR_BLACK, COLOR_WHITE)=="lolxdfly")
monitor_write("Hello, KBC!\n", COLOR_BLACK, COLOR_WHITE);
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;
}
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?
EDIT3:Habs gefunden, nicht gefixt :/Das verstehe ich nicht. Ist an der Adresse 10187e das Symbol "end"?
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:Code: [Auswählen]end = .; _end = .; __end = .;
soll ich dass einfach ans Ende dranklatschen? Hab leider überhaupt keine Ahnung was Link Scripte angeht :S
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! 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// end ist im linker script definiert!
extern uint32_t end;
uint32_t placement_address = (uint32_t)&end;
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) }
}
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(;;);
}
check_exception old: 0xffffffff new 0xeIm ObjDump gibt es kein
check_exception old: 0xe new 0xe
00102c17!!!
end = .; _end = .; __end = .;
soll ich dass einfach ans Ende dranklatschen? Hab leider überhaupt keine Ahnung was Link Scripte angeht :S
Initialisierung von structs funktioniert nur in C, nicht in C++. Der Fix sollte vermutlich eher so aussehen:Code: [Auswählen]struct gdt_pointer {
uint16_t limit;
void* pointer;
} __attribute__((packed));
gdt_pointer gdtp;
gdtp.limit = GDT_ENTRIES * 8 - 1;
gdtp.pointer = gdt;
#define PANIC(msg) (panic(msg, __FILE__, __LINE__)) //undefined reference to panic(....
extern void panic(const char *message, const char *file, uint32_t line);
expected primary-expression before '.' token
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.)Quizfrage noch für lolxdfly: Welche Anweisungen in folgender Zeile sind bedingt und welche nicht?hmm ich glaube es geht nur bis zum ersten Semikolon also hört es nach CapsLock=1; und NumLock=1; ScrollLock=1; sind nicht mehr bedingt... (mist)Code: [Auswählen]if(led == 7) CapsLock=1; NumLock=1; ScrollLock=1;
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.
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;
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?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").
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:
9 gedrückt halten = 9!=
PgUp gedrückt halten = 999999...
if(c==0xE0 || c==0xE1)
return '\0';
#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
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);
}
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?
// 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...
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.