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.


Themen - OsDevNewbie

Seiten: 1 2 [3] 4
41
Softwareentwicklung / fprintf Funktioniert nicht
« am: 11. March 2013, 21:09 »
Hallo,
ich habe jetzt mal die Funktion printf programmiet, die einfach die Funktion fprintf(stdout, format) aufruft. Ich will eine Zahl formatiert ausgeben lassen. Die Funktion gibt aber immer nur 0 aus. Woran kann denn das liegen? Ich habe es auch schon mit direktem Aufruf von fprintf versucht mit dem selben Ergebnis.
Hier mein Quellcode (Die Funktion fprintf ist noch nicht ganz fertig):
stdio.c
...
int fprintf(FILE *stream, const char *format, ...)
{
va_list arg;
va_start(arg, format);
uint64_t pos = 0;
static char buffer[64];
//char *buffer = malloc(64); //Mehr wird momentan nicht benötigt
if(stream == stdout)
{
for(; *format; format++)
{
switch(*format)
{
case '%': //Formatieren?
switch(*(++format))
{
case 'u': //Unsigned int
utoa(va_arg(arg, uint64_t), buffer);
puts(buffer);
pos += strlen(buffer);
break;
case 'i': //Signed int
case 'b':
itoa(va_arg(arg, int64_t), buffer);
puts(buffer);
pos += strlen(buffer);
break;
case 'f': //Float
ftoa(va_arg(arg, double), buffer);
puts(buffer);
pos += strlen(buffer);
break;
case 'X': //Hex 8
break;
case 'x': //Hex 4
break;
case 'y': //Hex 2
break;
case 's': //String
{
char *temp = va_arg(arg, char*);
puts(temp);
pos += strlen(temp);
}
break;
case 'c': //Char
putchar((char)va_arg(arg, int32_t));
pos++;
break;
case '%': //%
putchar("%");
pos++;
break;
default: //Ansonsten ungültig
format--;
pos--;
break;
}
break;
default: //Ansonsten schreibe das aktuelle Zeichen
putchar(*format);
pos++;
break;
}
}
}
else
pos = EOF;
//free(buffer);
va_end(arg);
return pos;
}

int printf(const char *format, ...)
{
return fprintf(stdout, format);
}
...
42
Lowlevel-Coding / Treiber gleich Prozess?
« am: 17. January 2013, 22:36 »
Hallo,
ich frage mich ob ein man ein Treiber als einen eigenen Prozess betrachten soll oder als eine Art Library? Also mit Letzterem meine ich so etwas ähnliches wie ein Kernel.
43
Lowlevel-Coding / Windowstreiber-Schnittstelle
« am: 15. January 2013, 18:24 »
Hallo,
gibt es irgendwo eine Dokumentation über die Treiber-Schnittstelle von Windows? Ich habe nämlich vor die Treiber von Windows für meinen Kernel zu benutzen, somit hat man auf jeden Fall einen funktionierenden Treiber für die meisten Geräte. Ich hab bis jetzt immer nur etwas über so ein Treiber-SDK gefunden.

Ich hoffe ihr könnt mir helfen. Danke.
44
Lowlevel-Coding / Multitasking: Task wird nicht gewechselt
« am: 30. December 2012, 19:02 »
Hallo,
ich erweitere meinen Kernel gerade um die Multitaskingfunktion. Dabei bin ich diesem Tutorial gefolgt. Alles funktioniert einwandfrei. Das Problem ist nur folgendes: Sobald Task a gestartet ist und den Bildschirm vollspamt wird kein Interrupt mehr ausgelöst (ausser die Exceptions). Ich verwende zu Testzwecken momentan noch den Tastatur-IRQ zum Schedulen. Aber wenn ich auf eine Taste drücke sollte doch trotzdem ein Interrupt ausgelöst werden oder nicht? Dem PIC wird auch ein EOI gesendet für den richtigen IRQ.

Hier meine pm.c:
/*
 * pm.c
 *
 *  Created on: 30.12.2012
 *      Author: pascal
 */

#include "pm.h"

static uint64_t nextPID;
static int64_t currentTask;
static uint64_t numTasks;
static ihs_t *TaskStates[2];

//Testweise
void task_a()
{
asm("sti");
while(1)
printf("A1A");
}

void task_b()
{
asm("sti");
while(1)
printf("B2B");
}

static uint8_t stack_a[4096];
static uint8_t stack_b[4096];
//Ende Test
/*
 * Prozessverwaltung initialisieren
 */
void pm_Init()
{
nextPID = 1; // 0 = Kernel
TaskStates[0] = pm_InitTask(stack_a, task_a);
TaskStates[1] = pm_InitTask(stack_b, task_b);
numTasks = 2;
currentTask = -1;
}

/*
 * Task initialisieren
 * Parameter: stack = Adresse zum Stack des Tasks
 * entry = Einsprungspunkt
 */

ihs_t *pm_InitTask(uint8_t *stack, void *entry)
{
/*
* CPU-Zustand für den neuen Task festlegen
*/
ihs_t new_state = {
.cs = 0x08,
.ss = 0x10,
.es = 0x10,
.ds = 0x10,
.gs = 0x10,
.fs = 0x10,

.rip = (uint64_t)entry,

//IRQs einschalten (IF = 1)
.rflags = 0x202
};

ihs_t *state = (void*)(stack + 4096 - sizeof(new_state));
*state = new_state;
state->rsp = (uint64_t)state;

return state;
}

/*
 * Scheduler. Gibt den Prozessorzustand des nächsten Tasks zurück. Der aktuelle
 * Prozessorzustand wird als Parameter übergeben und gespeichert, damit er
 * beim nächsten Aufruf des Tasks wiederhergestellt werden kann.
 */
ihs_t *pm_Schedule(ihs_t *cpu)
{
if(currentTask >= 0)
TaskStates[currentTask] = cpu;

currentTask++;
currentTask %= numTasks;

cpu = TaskStates[currentTask];

return cpu;
}
45
Softwareentwicklung / Pixel ansteuern im Long Mode
« am: 18. December 2012, 20:27 »
Hi,
ich habe zwar schon den Artikel zu VGA gelesen, aber ich wollte eine grössere Auflösung als 640x480 haben und bin über den VESA gestolpert, aber dieser benötigt ja trotzdem das BIOS und auf das kann ich ja im Long Mode nicht mehr zugreifen. Was gibt es denn als Alternative oder wie benutzt man in im Long Mode. Welche Auflösung und Farbtiefe ist denn in diesem Modus möglich?
46
Offtopic / Weihnachten!
« am: 17. December 2012, 23:08 »
Hallo liebe Community,
Weihnachten steht vor der Tür und die Geschenke purzeln. Ich hoffe das Christkind bringt euch ein schönes Geschenk :wink:.

Frohe Weihnachten euch allen!
47
Softwareentwicklung / Library und Programme
« am: 02. November 2012, 13:57 »
Hallo Community,
ich habe jetzt mein Programm (die Shell) von meinem Kernel getrennt. Dabei habe ich auch die User-Library aus dem Kernel genommen und in einen seperaten Ordner geschoben. Ich wollte nun mein Programm, mit der neuen Konstellation compilieren, und da gibt der Linker tonnenweise Fehler aus. Diese Fehler lauten in etwa so: "undefined reference to `malloc'" oder der entsprechenden Funktion in der Library.
Ich programmiere mit Eclipse und ich habe dort auch eingestellt, dass der Compiler den Lib-Ordner includen soll und dem Linker habe ich auch gesagt, dass er in diesem Ordner suchen soll. Aber die Fehlermeldungen bleiben. Beim Aufruf der eclipseinternen Konsole habe ich herausgefunden, dass der Linker auch "_start" nicht findet, obwohl ich diese Datei auch include. Was muss ich genau wie einstellen?
Ich danke euch schonmal im Voraus.
48
Hallo Community,
wie kann man im Long Mode herausfinden, wie viel RAM vorhanden ist? Mein Kernel wird zwar von GRUB geladen und dieser gibt auch den verfügbaren Speicherplatz zurück, aber nach ein paar Experimenten mit der Grösse des Speichers hat sich herausgestellt, dass GRUB maximal 3.5 GB :x, also 32-Bit-typisch, angibt, und das auch, wenn die Grösse des Speichers 6GB beträgt. (Getestet in VMWare, VirtualBox und mit realer Hardware (8GB)).
49
Lowlevel-Coding / CPU Reset beim Ändern der Pagingtabellen
« am: 13. July 2012, 12:34 »
Hallo,
ich verwende den Long Mode und in meinen Funktionen, die die Paging Tabellen verändern um eine Page zu mappen bzw. sie wieder freizugeben, gibt es Triplefault nachdem versucht wird auf die PML4 selber zuzugreifen (über die Addresse 0xFFFFFFFFF000). Hier ist die Ausgabe von Bochs:
[CPU0 RD]: PHY 0x0000000000a07000 (len=8): 0x00000000 0x00A0802B ; PML4E
[CPU0 RD]: PHY 0x0000000000a08000 (len=8): 0x00000000 0x00A0902B ; PDPTE
[CPU0 RD]: PHY 0x0000000000a09000 (len=8): 0x00000000 0x00A0A02B ; PDE
[CPU0 RD]: PHY 0x0000000000a0a000 (len=8): 0x00000000 0x0000000B ; PTE
[CPU0 WR]: PHY 0x0000000000a0a000 (len=8): 0x00000000 0x0000002B ; PTE
[CPU0 RD]: LIN 0x00000000000000d0 PHY 0x00000000000000d0 (len=8, pl=0): 0xF000FF53 0xF000FF53
[CPU0 RD]: LIN 0x00000000000000d8 PHY 0x00000000000000d8 (len=8, pl=0): 0xF000FF53 0xF000FF53
[CPU0 RD]: LIN 0x0000000000000080 PHY 0x0000000000000080 (len=8, pl=0): 0xF000FF53 0xF000FF53
[CPU0 RD]: LIN 0x0000000000000088 PHY 0x0000000000000088 (len=8, pl=0): 0xF000FF53 0xF000FF53
rax: 0x0000ffff_fffff000 rcx: 0x80000000_00a0720b
rdx: 0x00000000_00000000 rbx: 0x00000000_00a1e000
rsp: 0x00000000_00201fa1 rbp: 0x00000000_00201ff1
rsi: 0x00000000_00000001 rdi: 0x00000000_00a1e000
r8 : 0x00000000_00000000 r9 : 0x00000000_00000001
r10: 0x00000000_00000000 r11: 0x00000000_00000000
r12: 0x00000000_00000000 r13: 0x00000000_00000000
r14: 0x00000000_00000000 r15: 0x00000000_00000000
rip: 0x00000000_00100c6c
eflags 0x00210006: ID vip vif ac vm RF nt IOPL=0 of df if tf sf zf af PF cf
(0).[522443589] [0x0000000000100c6c] 0018:0000000000100c6c (unk. ctxt): mov rax, qword ptr ds:[rax+rdx*8] ; 488b04d0
Next at t=522443590
(0) [0x00000000fffffff0] f000:fff0 (unk. ctxt): jmp far f000:e05b         ; ea5be000f0
Wobei an der Addresse 100c6c der ausgeführte Code liegt.

Warum greift der Prozessor denn nicht auf den letzten Eintrag der PML4 zu sondern auf den ersten?
50
Lowlevel-Coding / Paging funktioniert nicht
« am: 02. July 2012, 01:01 »
Hallo,
beim Initialisieren der Pagingstrukturen gibt es ein Problem. Der Eintrag in die PML4 Table wird zwar richtig geschrieben, aber dann, wenn setPDP aufgerufen wird, ist die PML4 wieder auf null zurückgesetzt und ich weis nicht wieso.
Die Funktionen (paging.c):
Code: (C) [Auswählen]
void setPML4Entry(uint8_t i, uint8_t Present, uint8_t RW, uint8_t US, uint8_t PWT,
uint8_t PCD, uint8_t A, uint16_t AVL, uint8_t NX, uint64_t Address)
{
PML4.PML4E[i] = 0;
PML4.PML4E[i] = (Present & 1);
PML4.PML4E[i] |= (RW & 1) << 1;
PML4.PML4E[i] |= (US & 1) << 2;
PML4.PML4E[i] |= (PWT & 1) << 3;
PML4.PML4E[i] |= (PCD & 1) << 4;
PML4.PML4E[i] |= (A & 1) << 5;
PML4.PML4E[i] |= (AVL & 0x7LL) << 9;
PML4.PML4E[i] |= (Address & 0xFFFFFFFFFFLL) << 12;
PML4.PML4E[i] |= ((AVL >> 3) & 0x7FFLL) <<52;
PML4.PML4E[i] |= (NX & 1LL) << 63;
}

void setPDPEntry(uint8_t i, PDP_t *PDP, uint8_t Present, uint8_t RW, uint8_t US, uint8_t PWT,
uint8_t PCD, uint8_t A, uint16_t AVL, uint8_t NX, uint64_t Address)
{
PDP->PDPE[i] = 0;
PDP->PDPE[i] = (Present & 1);
PDP->PDPE[i] |= (RW & 1) << 1;
PDP->PDPE[i] |= (US & 1) << 2;
PDP->PDPE[i] |= (PWT & 1) << 3;
PDP->PDPE[i] |= (PCD & 1) << 4;
PDP->PDPE[i] |= (A & 1) << 5;
PDP->PDPE[i] |= (AVL & 0x7LL) << 9;
PDP->PDPE[i] |= (Address & 0xFFFFFFFFFFLL) << 12;
PDP->PDPE[i] |= ((AVL >> 3) & 0x7FFLL) <<52;
PDP->PDPE[i] |= (NX & 1LL) << 63;
}

void setPDEntry(uint8_t i, PD_t *PD, uint8_t Present, uint8_t RW, uint8_t US, uint8_t PWT,
uint8_t PCD, uint8_t A, uint16_t AVL, uint8_t NX, uint64_t Address)
{
PD->PDE[i] = 0;
PD->PDE[i] = (Present & 1);
PD->PDE[i] |= (RW & 1) << 1;
PD->PDE[i] |= (US & 1) << 2;
PD->PDE[i] |= (PWT & 1) << 3;
PD->PDE[i] |= (PCD & 1) << 4;
PD->PDE[i] |= (A & 1) << 5;
PD->PDE[i] |= (AVL & 0x7LL) << 9;
PD->PDE[i] |= (Address & 0xFFFFFFFFFFLL) << 12;
PD->PDE[i] |= ((AVL >> 3) & 0x7FFLL) <<52;
PD->PDE[i] |= (NX & 1LL) << 63;
}

void setPTEntry(uint8_t i, PT_t *PT, uint8_t Present, uint8_t RW, uint8_t US, uint8_t PWT,
uint8_t PCD, uint8_t A, uint8_t D, uint8_t G, uint16_t AVL,
uint8_t PAT, uint8_t NX, uint64_t Address)
{
PT->PTE[i] = 0;
PT->PTE[i] = (Present & 1);
PT->PTE[i] |= (RW & 1) << 1;
PT->PTE[i] |= (US & 1) << 2;
PT->PTE[i] |= (PWT & 1) << 3;
PT->PTE[i] |= (PCD & 1) << 4;
PT->PTE[i] |= (A & 1) << 5;
PT->PTE[i] |= (D & 1) << 6;
PT->PTE[i] |= (PAT & 1) << 7;
PT->PTE[i] |= (G & 1LL) << 8;
PT->PTE[i] |= (AVL & 0x7LL) << 9;
PT->PTE[i] |= (Address & 0xFFFFFFFFFFLL) << 12;
PT->PTE[i] |= ((AVL >> 3) & 0x7FFLL) << 52;
PT->PTE[i] |= (NX & 1LL) << 63;
}

Die Definitionen (paging.h):
Code: (C) [Auswählen]
#define MAP 3 //Anzahl der zu mappenden MBs. Mehrfaches von 2MB, d.h. 3*2MB werden gemappt; Max 1GB
#define PAGE_ENTRIES 512

static struct{
uint64_t PML4E[PAGE_ENTRIES];
}PML4;

typedef struct{
uint64_t PDPE[PAGE_ENTRIES];
}PDP_t;

typedef struct{
uint64_t PDE[PAGE_ENTRIES];
}PD_t;

typedef struct{
uint64_t PTE[PAGE_ENTRIES];
}PT_t;

Und hier die Intialisierung (im Hauptprogramm):
Code: (C) [Auswählen]
static PDP_t PDP;
static PD_t PD;
static PT_t PT[MAP];

//Erste 6MB mappen

setPML4Entry(0, 1, 1, 0, 1, 0, 0, 0, 0, (uint64_t)&PDP);
for(i = 1; i < PAGE_ENTRIES; i++)
setPML4Entry(i, 0, 0, 0, 0, 0, 0, 0, 0, 0);

setPDPEntry(0, &PDP, 1, 1, 0, 1, 0, 0, 0, 0, (uint64_t)&PD);
for(i = 1; i < PAGE_ENTRIES; i++)
setPDPEntry(i, &PDP, 0, 0, 0, 0, 0, 0, 0, 0, 0);

for(i = 0; i < MAP; i++)
setPDEntry(i, &PD, 1, 1, 0, 1, 0, 0, 0, 0, (uint64_t)&PT[i]);
for(i = MAP; i < PAGE_ENTRIES; i++) //Rest mit nullen auffüllen
setPDEntry(i, &PD, 0, 0, 0, 0, 0, 0, 0, 0, 0);

register int j;
for(i = 0; i < MAP; i++)
for(j = 0; j < PAGE_ENTRIES; j++)
setPTEntry(j, &PT[i], 1, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, (j * 4096) + (i * 512 * 4096));
asm(
"mov %0,%%eax;"
"mov %%eax,%%cr3;"
: : "r" (&PML4)
);

Ich hoffe ihr könnt mir helfen.
51
Hallo,
ich möchte einen Farjump zu einer Adresse vollziehen, die in einem Register drinnen steht. Zusätzlich möchte ich in ein anderes Codesegment wechhseln. Mein Code lautet:
asm("ljmp $0x20,%0" : :"r"(Adresse));
Ich habe schon gelesen, dass man vor dem Register ein Stern (*) hinmachen muss. Das habe ich auch getan, aber GCC gibt immer noch den Fehler aus, dass die Parameter für ljmp falsch sind.
Ich hoffe ihr könnt mir helfen. Danke.
52
Softwareentwicklung / ELF64-Datei laden
« am: 27. June 2012, 23:27 »
Hallo,
ich habe folgendes Problem: Da GRUB ja nur ELF32-Dateien laden kann und ich einen 64-bit Kernel schreibe muss ich mit GRUB ein kleines Programm laden, dass wiederum meine ELF64-Datei des Kernels ausliest und dann entsprechend behandelt. Das Problem ist das ich bei elf_header->e_machine den Wert 0x003E bekomme. Sollte dort nicht der Wert 0x0003 für EM_i386 stehen? Ich habe im Netz irgendetwas von EM_X86_64 gelesen, aber nie den Wert, der dafür eingesetzt werden muss. Alle anderen Werte scheinen zu stimmen.
Meine elf.h:
Code: (C) [Auswählen]
#ifndef ELF_H_
#define ELF_H_

#include "stdint.h"

typedef uint64_t elf64_addr;
typedef uint16_t elf64_half;
typedef uint64_t elf64_off;
typedef int32_t elf64_sword;
typedef uint32_t elf64_word;
typedef uint64_t elf64_xword;
typedef int64_t elf64_sxword;
typedef uint8_t elf64_uchar;


#define ELF_MAG0 0x7F //Datei-Identifikation
#define ELF_MAG1 'E'
#define ELF_MAG2 'L'
#define ELF_MAG3 'F'
#define ELF_MAGIC (ELF_MAG0 | ((ELF_MAG1 & 0xFFLL) << 8) | ((ELF_MAG2 & 0xFFLL) << 16) | ((ELF_MAG3 & 0xFFLL) << 24))

#define ELF_CLASS_NONE 0x00 //Datei-Klasse
#define ELF_CLASS_32 0x01 //32-Bit Datei
#define ELF_CLASS_64 0x02 //64-Bit Datei

#define ELF_DATA_NONE 0x00 //Prozessorspezifische Datenkodierung
#define ELF_DATA_2LSB 0x01 //Little Endian
#define ELF_DATA_2MSB 0x02 //Big Endian

typedef struct
{
uint32_t ei_magic; // ELF-Magic Number
uint8_t ei_class; // 32 oder 64 bit?
uint8_t ei_data; // Little oder Big Endian?
uint8_t ei_version; // dasselbe wie ELF_HEADER.e_version
uint8_t ei_osabi; //OS/ABI Identifikation
uint8_t ei_abiversion; //ABI Version
uint8_t ei_pad; // reserved (zero)
uint16_t ei_pad2; // reserved (zero)
uint32_t ei_pad3; //reserviert (NULL)
//uint8_t ei_nident; // ?
}elf_ident_header;


#define ELF_ET_NONE 0x0000 // kein Typ
#define ELF_ET_REL 0x0001 // relocatable
#define ELF_ET_EXEC 0x0002 // ausführbar
#define ELF_ET_DYN 0x0003 // Shared-Object-File
#define ELF_ET_CORE 0x0004 // Corefile
#define ELF_ET_LOPROC 0xFF00 // Processor-specific
#define ELF_ET_HIPROC 0x00FF // Processor-specific

#define ELF_EM_NONE 0x0000 // kein Typ
#define ELF_EM_M32 0x0001 // AT&T WE 32100
#define ELF_EM_SPARC 0x0002 // SPARC
#define ELF_EM_386 0x0003 // Intel 80386
#define ELF_EM_68K 0x0004 // Motorola 68000
#define ELF_EM_88K 0x0005 // Motorola 88000
#define ELF_EM_860 0x0007 // Intel 80860
#define ELF_EM_MIPS 0x0008 // MIPS RS3000

#define ELF_EV_NONE 0x00000000 // ungültige Version
#define ELF_EV_CURRENT 0x00000001 // aktuelle Version

typedef struct
{
elf_ident_header e_ident; // IDENT-HEADER (siehe oben)
elf64_half e_type; // Typ der ELF-Datei
elf64_half e_machine; // Prozessortyp
elf64_word e_version; // ELF-Version
elf64_addr e_entry; // Virtuelle addresse des Einstiegspunkt des Codes
elf64_off e_phoff; // Offset des Programm-Headers (ist 0 wenn nicht vorhanden)
elf64_off e_shoff; // Offset des Section-Headers (ist 0 wenn nicht vorhanden)
elf64_word e_flags; // processor-specific flags
elf64_half e_ehsize; // Grösse des ELF-header
elf64_half e_phentsize;// Grösse eines Programm-Header Eintrags
elf64_half e_phnum; // Anzahl Einträge im Programm-Header (ist 0 wenn nicht vorhanden)
elf64_half e_shentsize;// size of one section-header entry
elf64_half e_shnum; // Anzahl Einträge im Section-Header (ist 0 wenn nicht vorhanden)
elf64_half e_shstrndex;// tells us which entry of the section-header is linked to the String-Table
}elf_header;


#define ELF_PT_NULL 0x00000000 // ungültiges Segment
#define ELF_PT_LOAD 0x00000001 // ladbares Segment
#define ELF_PT_DYNAMIC 0x00000002 // dynamisch linkbares Segment
#define ELF_PT_INTERP 0x00000003 // position of a zero-terminated string, which tells the interpreter
#define ELF_PT_NOTE 0x00000004 // Universelles Segment
#define ELF_PT_SHLIB 0x00000005 // shared lib (reserviert)
#define ELF_PT_PHDIR 0x00000006 // gibt Position und Grösse des Programm-Headers an
#define ELF_PT_LOPROC 0x70000000 // reserved
#define ELF_PT_HIPROC 0x7FFFFFFF // reserved

#define ELF_PF_X 0x00000001; // ausführbares Segment
#define ELF_PF_W 0x00000002; // schreibbares Segment
#define ELF_PF_R 0x00000004; // lesbares Segment

typedef struct
{
elf64_word p_type; // Typ des Segments (siehe oben)
elf64_word p_flags; // Flags
elf64_off p_offset; // Dateioffset des Segments
elf64_addr p_vaddr; // Virtuelle Addresse, an die das Segment kopiert werden soll
elf64_addr p_paddr; // Physikalische Addresse (meist irrelevant)
elf64_xword p_filesz; // Grösse des Segments in der Datei
elf64_xword p_memsz; // Grösse des Segments, die es im Speicher haben soll
elf64_xword p_align; // Alignment. if zero or one, then no alignment is needed, otherwise the alignment has to be a power of two
}elf_program_header_entry;


//Funktionen
char elfCheck(elf_header *ELFHeader); //Par.: Zeiger auf ELF-Header
/*uintptr_t getElfContent(elf_header *ElfHeader);
uint32_t getElfAddress(elf_header *ElfHeader);*/
char elfLade(uintptr_t Datei, uint16_t Segment); //Par.: Datei = Addresse der Datei im Speicher; Segment = Segment in das kopiert werden soll (GDT)

#endif /* ELF_H_ */
Danke vielmals.
53
Hallo,
nachdem ich die GDT initialisiert habe lade ich die Segmentregister neu und es gibt einen Triple fault und ich verstehe nicht warum.
Hier mein Code
Code: (C) [Auswählen]
void setGDTEntry(int i, unsigned int base, unsigned int limit, char access, char flags)
{
gdt[i] = limit & 0xFFFF;
gdt[i] |= (base & 0xFFFFFF) << 16;
gdt[i] |= (access & 0xFF) << 40;
gdt[i] |= ((limit >> 16) & 0xF) << 48;
gdt[i] |= (flags & 0xF) << 52;
gdt[i] |= ((base >> 24) & 0xFF) << 56;
}

void GDTInit()
{
setGDTEntry(0, 0, 0, 0, 0); //NULL-Deskriptor
setGDTEntry(1, 0, 0xFFFFF, 0x9A, 0xC); //Codesegment, ausführ- und lesbar, 32-bit
setGDTEntry(2, 0, 0xFFFFF, 0x92, 0xC); //Datensegment, les- und schreibbar
setGDTEntry(3, 0, 0xFFFFF, 0x9A, 0xA); //Codesegment, ausführ- und lesbar, 64-bit

gdtr.limit = GDT_ENTRIES *8 -1;
gdtr.pointer = gdt;
asm("lgdt %0": :"m"(gdtr));
asm(
"mov $0x10,%ax;"
"mov %ax,%ds;"               //hier gibt es den Triple-Fault
"mov %ax,%es;"
"mov %ax,%ss;"
"mov %ax,%fs;"
"mov %ax,%gs;"
"ljmp $0x8,$.1;"
".1:"
);
}
Danke vielmals.
54
Softwareentwicklung / Module laden mit GRUB
« am: 25. June 2012, 19:18 »
Hallo,
ich lasse GRUB meinen Bootloader laden und zudem noch meinen Kernel als Modul. In der Multibootstruktur kann man den Namen auslesen, aber wenn ich den über meinen Bootloader ausgeben lasse, dann kommt nichts. Mein Code an dieser Stelle lautet:
Code: (C) [Auswählen]
print("Name des Moduls: ");
print((char*)MBS->mbs_mods_addr[0].name);
print("\n\r");
In der Multibootstruktur deklariere ich noch:
Code: (C) [Auswählen]
mbs_mods_addr* mbs_mods_addr;
Dieser Eintrag MBS->mbs_mods_addr[0].name sollte doch auf einen String zeigen oder nicht?
Ich hoffe ihr könnt mir helfen und sage deshalb schon einmal danke.
55
Hallo,
bei meinem Kernel gibt es einen Triple Fault, obwohl ich die Interrupts per cli ausgeschaltet habe :?. Ist das überhaupt möglich oder wurden die Interrupts doch nicht ausgeschaltet?
56
Softwareentwicklung / Kernel funktioniert nicht
« am: 28. May 2012, 00:12 »
Hallo ich bins schon wieder :roll:,
wenn bochs startet meldet sich GRUB und der ladet irgendwie meinen Kernel nicht und Bochs gibt nach kurzer Zeit folgende Meldung aus:
>>PANIC<< FATAL ERROR: all available memory is already allocated !

Ich habe meinen Kernel so programmiert, dass er sofort nach dem Laden eine Meldung ausgibt, noch vor der Stack-Initialisierung! Aber diese Meldung kommt nie.
Wenn ihr den Quelltext des Kernels sowie das Script zum Erstellen der GRUB-CD einsehen wollt schreibt mich einfach an.
Ich wäre dankbar für eine Antwort, ich weiss wirklich nicht mehr weiter.
57
Lowlevel-Coding / Bochs: Debugger einrichten
« am: 24. May 2012, 17:01 »
Hallo,
vielleicht habe ich nicht richtig gesucht, aber ist das normal, dass der Debugger nicht funktioniert, wenn man es über die Paketverwaltung von Ubuntu installieren lässt? Ich habe mir dann mal den Quellcode runtergeladen und versucht ihn zu konfigurieren. Dabei gibt er aus:
sh configure --enable-a20-pin --enable-x86-64 --enable-long-phy-address --enable-plugins --enable-debugger --enable-debugger-gui --enable-all-optimizations --enable-x86-debugger --with-x11
checking build system type... x86_64-unknown-linux-gnu
checking host system type... x86_64-unknown-linux-gnu
checking target system type... x86_64-unknown-linux-gnu
checking if you are configuring for another platform... no
checking for standard CFLAGS on this platform...
checking for gcc... gcc
checking whether the C compiler works... yes
checking for C compiler default output file name... a.out
checking for suffix of executables...
checking whether we are cross compiling... no
checking for suffix of object files... o
checking whether we are using the GNU C compiler... yes
checking whether gcc accepts -g... yes
checking for gcc option to accept ISO C89... none needed
checking for g++... g++
checking whether we are using the GNU C++ compiler... yes
checking whether g++ accepts -g... yes
checking whether make sets $(MAKE)... yes
checking for a sed that does not truncate output... /bin/sed
checking for grep that handles long lines and -e... /bin/grep
checking for egrep... /bin/grep -E
checking for ld used by gcc... /usr/bin/ld
checking if the linker (/usr/bin/ld) is GNU ld... yes
checking for /usr/bin/ld option to reload object files... -r
checking for BSD-compatible nm... /usr/bin/nm -B
checking whether ln -s works... yes
checking how to recognise dependent libraries... file_magic ELF [0-9][0-9]*-bit [LM]SB (shared object|dynamic lib )
checking how to run the C preprocessor... gcc -E
checking for ANSI C header files... yes
checking for sys/types.h... yes
checking for sys/stat.h... yes
checking for stdlib.h... yes
checking for string.h... yes
checking for memory.h... yes
checking for strings.h... yes
checking for inttypes.h... yes
checking for stdint.h... yes
checking for unistd.h... yes
checking dlfcn.h usability... yes
checking dlfcn.h presence... yes
checking for dlfcn.h... yes
checking how to run the C++ preprocessor... g++ -E
checking for g77... no
checking for xlf... no
checking for f77... no
checking for frt... no
checking for pgf77... no
checking for cf77... no
checking for fort77... no
checking for fl32... no
checking for af77... no
checking for xlf90... no
checking for f90... no
checking for pgf90... no
checking for pghpf... no
checking for epcf90... no
checking for gfortran... no
checking for g95... no
checking for xlf95... no
checking for f95... no
checking for fort... no
checking for ifort... no
checking for ifc... no
checking for efc... no
checking for pgf95... no
checking for lf95... no
checking for ftn... no
checking whether we are using the GNU Fortran 77 compiler... no
checking whether  accepts -g... no
checking the maximum length of command line arguments... 32768
checking command to parse /usr/bin/nm -B output from gcc object... ok
checking for objdir... .libs
checking for ar... ar
checking for ranlib... ranlib
checking for strip... strip
checking for file... /usr/bin/file
checking if gcc static flag  works... yes
checking if gcc supports -fno-rtti -fno-exceptions... no
checking for gcc option to produce PIC... -fPIC
checking if gcc PIC flag -fPIC works... yes
checking if gcc supports -c -o file.o... yes
checking whether the gcc linker (/usr/bin/ld -m elf_x86_64) supports shared libraries... yes
checking whether -lc should be explicitly linked in... no
checking dynamic linker characteristics... GNU/Linux ld.so
checking how to hardcode library paths into programs... immediate
checking whether stripping libraries is possible... yes
checking for shl_load... no
checking for shl_load in -ldld... no
checking for dlopen... no
checking for dlopen in -ldl... yes
checking whether a program can dlopen itself... yes
checking whether a statically linked program can dlopen itself... yes
checking if libtool supports shared libraries... yes
checking whether to build shared libraries... yes
checking whether to build static libraries... no
configure: creating libtool
appending configuration tag "CXX" to libtool
checking for ld used by g++... /usr/bin/ld -m elf_x86_64
checking if the linker (/usr/bin/ld -m elf_x86_64) is GNU ld... yes
checking whether the g++ linker (/usr/bin/ld -m elf_x86_64) supports shared libraries... yes
checking for g++ option to produce PIC... -fPIC
checking if g++ PIC flag -fPIC works... yes
checking if g++ supports -c -o file.o... yes
checking whether the g++ linker (/usr/bin/ld -m elf_x86_64) supports shared libraries... yes
checking dynamic linker characteristics... GNU/Linux ld.so
checking how to hardcode library paths into programs... immediate
checking whether stripping libraries is possible... yes
checking for shl_load... (cached) no
checking for shl_load in -ldld... (cached) no
checking for dlopen... (cached) no
checking for dlopen in -ldl... (cached) yes
checking whether a program can dlopen itself... (cached) yes
checking whether a statically linked program can dlopen itself... (cached) yes
appending configuration tag "F77" to libtool
checking for an ANSI C-conforming const... yes
checking for dirent.h that defines DIR... yes
checking for library containing opendir... none required
checking which extension is used for loadable modules... .so
checking which variable specifies run-time library path... LD_LIBRARY_PATH
checking for the default library search path... /lib /usr/lib
checking for objdir... .libs
checking whether libtool supports -dlopen/-dlpreopen... yes
checking for shl_load... (cached) no
checking for shl_load in -ldld... (cached) no
checking for dlopen in -ldl... (cached) yes
checking for dlerror... yes
checking for _ prefix in compiled symbols... no
checking whether deplibs are loaded by dlopen... yes
checking argz.h usability... yes
checking argz.h presence... yes
checking for argz.h... yes
checking for error_t... yes
checking for argz_append... yes
checking for argz_create_sep... yes
checking for argz_insert... yes
checking for argz_next... yes
checking for argz_stringify... yes
checking assert.h usability... yes
checking assert.h presence... yes
checking for assert.h... yes
checking ctype.h usability... yes
checking ctype.h presence... yes
checking for ctype.h... yes
checking errno.h usability... yes
checking errno.h presence... yes
checking for errno.h... yes
checking malloc.h usability... yes
checking malloc.h presence... yes
checking for malloc.h... yes
checking for memory.h... (cached) yes
checking for stdlib.h... (cached) yes
checking stdio.h usability... yes
checking stdio.h presence... yes
checking for stdio.h... yes
checking for unistd.h... (cached) yes
checking dl.h usability... no
checking dl.h presence... no
checking for dl.h... no
checking sys/dl.h usability... no
checking sys/dl.h presence... no
checking for sys/dl.h... no
checking dld.h usability... no
checking dld.h presence... no
checking for dld.h... no
checking mach-o/dyld.h usability... no
checking mach-o/dyld.h presence... no
checking for mach-o/dyld.h... no
checking for string.h... (cached) yes
checking for strchr... yes
checking for strrchr... yes
checking for memcpy... yes
checking for memmove... yes
checking for strcmp... yes
checking for closedir... yes
checking for opendir... yes
checking for readdir... yes
checking for X... libraries , headers
checking for gethostbyname... yes
checking for connect... yes
checking for remove... yes
checking for shmat... yes
checking for IceConnectionNumber in -lICE... yes
checking whether byte ordering is bigendian... no
checking for inline... inline
checking size of unsigned char... 1
checking size of unsigned short... 2
checking size of unsigned int... 4
checking size of unsigned long... 8
checking size of unsigned long long... 8
checking size of int *... 8
checking for getenv... yes
checking for setenv... yes
checking for select... yes
checking for snprintf... yes
checking for vsnprintf... yes
checking for strtoull... yes
checking for strtouq... yes
checking for strdup... yes
checking for strrev... no
checking for stricmp... no
checking for strcasecmp... yes
checking for sleep... yes
checking for usleep... yes
checking for nanosleep... yes
checking for abort... yes
checking for gettimeofday... yes
checking for socklen_t... yes
checking for struct sockaddr_in.sin_len... no
checking for mkstemp... yes
checking sys/mman.h usability... yes
checking sys/mman.h presence... yes
checking for sys/mman.h... yes
checking for timelocal... yes
checking for gmtime... yes
checking for mktime... yes
checking for tmpfile64... yes
checking for fseek64... no
checking for fseeko64... yes
checking for __builtin_bswap32... yes
checking for __builtin_bswap64... yes
checking for _FILE_OFFSET_BITS value needed for large files... 64
checking if large file support is available... yes
checking for cos... no
checking for floor... no
checking if math functions link without -lm... no
checking for sin... yes
checking for ceil... yes
checking if math functions link with -lm... yes
checking for struct timeval... yes
checking if compiler allows __attribute__... yes
checking for set... yes
checking for set.h... no
checking for map... yes
checking for map.h... no
checking for idle hack... no
checking for dlfcn.h... (cached) yes
checking for assert.h... (cached) yes
checking for plugins support... yes
checking ltdl.h usability... no
checking ltdl.h presence... no
checking for ltdl.h... no
checking if compiler allows LL for 64-bit constants... yes
checking for A20 support... yes
checking for x86-64 support... yes
checking for SMP support... no
checking for cpu level... 6
checking for larger than 32 bit physical address emulation... yes
checking for large ramfile support... no
checking for NE2000 support... no
checking for i440FX PCI support... no
checking for PCI host device mapping support... no
checking for USB UHCI support... no
checking for USB OHCI support... no
checking for experimental USB xHCI support... no
checking for PCI pseudo NIC support... no
checking for repeated IO and mem copy speedups... no
checking for gcc fast function calls optimization... no
checking for handlers chaining speedups... no
checking support for configurable MSR registers... yes
checking show IPS... yes
checking for use of .cpp as suffix... no
checking for Bochs internal debugger support... yes
checking for disassembler support... yes
checking enable Bochs internal debugger GUI... yes
checking for gdb stub enable... no
checking for I/O Interface to the debugger... yes
checking for ALL optimizations enabled... yes
ERROR: handlers-chaining speedups are not supported with internal debugger or gdbstub yet
checking whether user wants readline... yes
checking whether to use readline... checking if readline works without -lcurses... no
checking if readline works with -lcurses... no
no
WARNING: The readline library was disabled because it was not found.
checking readline/history.h usability... no
checking readline/history.h presence... no
checking for readline/history.h... no
checking for instrumentation support... no
checking enable logging... yes
checking enable assert checks... yes
checking for raw serial support... no
checking for CLGD54XX emulation... no
checking for FPU emulation... yes
checking for VMX support... no
checking for 3DNow! support... no
checking for alignment check support... yes
checking for misaligned SSE support... no
checking for MONITOR/MWAIT instructions support (experimental)... yes
checking for AVX instructions support... no
checking for x86 debugger support... yes
checking for CDROM support... yes
checking IOKit/storage/IOCDMedia.h usability... no
checking IOKit/storage/IOCDMedia.h presence... no
checking for IOKit/storage/IOCDMedia.h... no
checking for Sound Blaster 16 support... no
checking for ES1370 soundcard support... no
checking for standard PC gameport support... no
checking for docbook2html... not_found
checking whether to build docbook documentation... no
checking for wx-config... not_found
checking for wxWidgets configuration script... not_found
checking for wxWidgets library version...
checking for default gui on this platform... x11
checking whether user wants XPM support... yes
checking X11/xpm.h usability... no
checking X11/xpm.h presence... no
checking for X11/xpm.h... no
checking for display libraries...  X11
Package gtk+-2.0 was not found in the pkg-config search path.
Perhaps you should add the directory containing `gtk+-2.0.pc'
to the PKG_CONFIG_PATH environment variable
No package 'gtk+-2.0' found
ERROR: pkg-config was not found, or unable to access the gtk+-2.0 package.
Install pkg-config and the gtk+ development package,
or disable the gui debugger, or the wxWidgets display library (whichever is being used).
Ich hoffe ihr könnt mir helfen :cry: :? :-(
58
Softwareentwicklung / Booten mit Grub
« am: 21. May 2012, 16:31 »
Hallo Community,
ich habe schon alles mögliche versucht und gesucht, aber ich bekomme es einfach nicht hin mit Grub meinen Kernel zu starten. Eine Bootfähige CD mit Grub drauf bekomme ich hin und mein Kernel ist auch drauf, aber Grub bootet einfach nicht davon. Ich mache die Cd wie es hier beschrieben wird: http://www.lowlevel.eu/wiki/Grand_Unified_Bootloader#CD-Image_herstellen
Ich arbeite auf Ubuntu. Ich wollte auch schon eine Eltorito CD erstellen, aber die Datei stage2_eltorito ist auf meinem Dateisystem nicht vorhanden. Ich hoffe ihr könnt mir helfen.

Noch eine Frage:
Laut dem Wiki muss die Startaddresse 1MB sein. Aber ist es normal, dass beim compilierten Kernel dann angezeigt wird, dass er 1MB gross sei, obwohl er viel kleiner ist?
59
Hallo,
wie richtet man Eclipse für die OS-Entwicklung am besten ein? Also, dass der Bootsektor ganz am Anfang steht und, dass der Multibootheader in den ersten 8kb zu finden ist? Wäre sehr froh über eine Antwort, vielleicht sogar einem Tutorial.
60
Lowlevel-Coding / Long Mode, gdt und paging
« am: 11. February 2012, 22:58 »
Hallo,
ich boote meinen Kernel mit Grub und schalte dann in den Long Mode um. Da man Paging vor dem Umschalten aktivieren muss, muss ich Paging nach dem Umschalten nochmal initialisieren?
Wo finde ich die Struktur der gdt im Long Mode?
Ist sie genau gleich wie im Protected Mode?

Danke
Seiten: 1 2 [3] 4

Einloggen