Zitat
error: action=reportIch habe Report verwendet, ergibt mehrere 10000 Seiten Report.
info: action=report
debug: action=ignore
steht da bei mir.
Ja. ignore ist eben weniger Ausgabe als report.

09. November 2026, 18:29
Gespeichert error: action=reportIch habe Report verwendet, ergibt mehrere 10000 Seiten Report.
info: action=report
debug: action=ignore
steht da bei mir.
Ja. ignore ist eben weniger Ausgabe als report.

Gespeichert 
0018FFC4h
0018FFC0h
0018FFB8h
0018FFB8h
0018FFB8h
0018FFB8h
0018FFB8h
0018FFB8h
0018FFB8h
0018FFC4h
0018FFC8h
0018FFC4h
0018FFC4h
0018FFC8h
0018FFC4h
0018FFC0h
0018FFB8h
0018FFB8h
0018FFC0h
0018FFB8h
0018FFB8h
0018FFB8h
0018FFB8h
0018FFC4h
0018FFC8h
0018FFB8h
0018FFC4h
0018FFC8h
0018FFC4h
0018FFC0h
0018FFB8h
0018FFC4h
0018FFC0h
0018FFB8h
0018FFB8h
0018FFB8h
0018FFB8h
0018FFB8h
0018FFB8h
0018FFB8h
0018FFC4h
0018FFC8h
0018FFC4h
0018FFC4h
0018FFC8h
0018FFC4h
0018FFC0h
0018FFB8h
0018FFB8h
0018FFB8h
0018FFB8h
0018FFB8h
0018FFB8h
0018FFB8h
0018FFC4h
0018FFC8h
0018FFB8h
0018FFC4h
0018FFC8h
0018FFC4h
0018FFC0h
0018FFB8h
0018FFC4h
0018FFC0h
0018FFB8h
0018FFB8h
0018FFB8h
0018FFB8h
0018FFC4h
0018FFB8h
0018FFB8h
0018FFC4h
0018FFC8h
0018FFC4h
0018FFC0h
0018FFC8h
0018FFC4h
0018FFC0h
0018FFB8h
0018FFB8h
0018FFB8h
0018FFB8h
0018FFB8h
0018FFB8h
0018FFB8h
0018FFC4h
0018FFC8h
0018FFB8h
Für mich kein Muster erkennbar. void gdt_install()
{
/* Setup the GDT pointer and limit */
gdt_register.limit = (sizeof(struct gdt_entry) * NUMBER_GDT_GATES)-1;
gdt_register.base = (ULONG) &gdt;
/* GDT GATES - desriptors with pointers to the linear memory address */
gdt_set_gate(0, 0, 0, 0, 0); // NULL descriptor
gdt_set_gate(1, 0, 0xFFFFFFFF, 0x9A, 0xCF); // CODE, privilege level 0 for kernel code
gdt_set_gate(2, 0, 0xFFFFFFFF, 0x92, 0xCF); // DATA, privilege level 0 for kernel code
//Kernel Mode:
gdt_set_gate(3, 0, 0xFFFFFFFF, 0x9A, 0xCF); // CODE, privilege level 0 for kernel code
gdt_set_gate(4, 0, 0xFFFFFFFF, 0x92, 0xCF); // DATA, privilege level 0 for kernel code
//User Mode:
//gdt_set_gate(3, 0, 0xFFFFFFFF, 0xFA, 0xCF); // CODE, privilege level 3 for user code
//gdt_set_gate(4, 0, 0xFFFFFFFF, 0xF2, 0xCF); // DATA, privilege level 3 for user code
write_tss (5, 0x10, 0x0); //num, ss0, esp0
gdt_flush((ULONG)&gdt_register); // inclusive gdt_load() in assembler code
tss_flush(); //privilege level 3 for user mode 0x2B // in flush.asm
//privilege level 0 for kernel mode 0x28
}Gate 3 und 4 werden z.Z. noch im kernel mode (privilege 0) betrieben, sollen später aber auf 3 umgesetzt werden. TSS habe ich in flush.asm auch auf Privileg 0 gesetzt?! Mit 3 geht es aber auch nicht. Für mich kein Muster erkennbar.Sollte man auch nicht.
Ich poste mal den gesamten Sourcecode:Hm, da ist ja eine Menge Zeug drin. Das müsste man ausgemistet werden. Ich steig da auf jeden Fall nicht durch. Ich würde vorschlagen nicht alles aus den Tutorials/anderen Systemen in einziges Programm zu stecken.
http://www.henkessoft.de/OS_Dev/Downloads/36m.zip
Vielleicht kann mir mal jemand genau erklären, wie man mit dem Bochs Debugger heraus bekommt, wo und warum diese Ereignisse ablaufen?
Ich komme da mit der Schritt-Technik einfach nicht an die wirklich interessanten Stellen, z.B. im asm-Stub und im task_switch. Wie macht ihr das genau? Setzt man da irgendwelche Haltepunkte im Code selbst oder läuft das über Adressen? Wenn ja woher bekommt man diese?
Gespeichert -Map kernel.map ... globale Symbole. ... irq0 zum Beispiel 0x0000816a ... bochs im Debugger bist, ... breakpoint mittels "lb 0x816a" setzen. Mit c kommst du dahin, und kannst dann mit s durchsteppen.Super! Danke für den Tipp mit -Map. Musste ich bisher noch nicht so intensiv machen.
Hm, da ist ja eine Menge Zeug drin.Fast nichts. Das soll ein OS werden.

Ich steig da auf jeden Fall nicht durch.Schade.
Bisher hast Du mir auf jeden Fall gut weiter geholfen.
Gespeichert EIP=9a07 ...
Ich weiß nicht, wohin du deinen Kernel legst (du benutzt ja kein GRUB), aber normal würde ich das als einen kaputten Wert ansehen.
Bei mir ist irq0 zum Beispiel 0x0000816a.

Ne, das ist dein OS. Nach dem Austausch deiner als Makefile getarnten Batch-Datei, war das doch recht einfach zum Laufen zu bringenZitatEIP=9a07 ...
Ich weiß nicht, wohin du deinen Kernel legst (du benutzt ja kein GRUB), aber normal würde ich das als einen kaputten Wert ansehen.
PorkChicken:ZitatBei mir ist irq0 zum Beispiel 0x0000816a.
![]()
![]()
Es scheint noch mehr Leute zu geben, die ihren Kernel ziemlich direkt hinter dem bootloader anbringen.

Gespeichert war das doch recht einfach zum Laufen zu bringenNa super.
leider nur die Version mit task A -> task A in task_switch1
Gespeichert Ich verwende einen Cross Compiler für ELF unter Windows (gcc 4.3.1), den ich selbst gebaut habe. Ich habe bei mir deswegen auch bei den Assembler-Aufruf aout durch elf ersetzt.Hast Du das irgendwo beschrieben, wie man das macht? Denn das wäre wirklich interessant.
Gespeichert #include "os.h"
#include "kheap.h"
#include "task.h"
extern page_directory_t* current_directory;
extern task_t* current_task;
extern tss_entry_t tss_entry;
extern ULONG read_eip();
void moo()
{
while(1) printformat("MOO %d", getpid()); // <-- kuh
}
void baa()
{
while(1) printformat("BAA %d", getpid()); // <- schaf
}
int main()
{
printformat("Welcome to PrettyOS 0.07\n");
// GDT, IDT, ISRS, IRQ, timer, keyboard, paging, enable interrupts, RAM disk, multitasking
gdt_install();
idt_install();
isrs_install();
irq_install();
initODA();
timer_install();
keyboard_install();
sti();
paging_install();
tasking_install();
create_task(moo);
create_task(baa);
pODA->ts_flag = 1;
while(1) printformat("%d", getpid());
return 0;
}extern void irq_tail();
void create_task(void *entry)
{
task_t* parent_task = (task_t*)current_task;
page_directory_t* directory = clone_directory(current_directory);
task_t* new_task = (task_t*)k_malloc(sizeof(task_t),0,0);
new_task->id = next_pid++;
new_task->page_directory = directory;
new_task->kernel_stack = k_malloc(KERNEL_STACK_SIZE,1,0)+KERNEL_STACK_SIZE;
new_task->next = 0;
task_t* tmp_task = (task_t*)ready_queue;
while (tmp_task->next)
tmp_task = tmp_task->next;
tmp_task->next = new_task; // ... and extend it
unsigned int *kernel_stack = (unsigned int*)new_task->kernel_stack;
//*(--kernel_stack) = 0x23; // ss
//*(--kernel_stack) = USER_STACK_VIRT + USER_STACK_SIZE - 0x4;
*(--kernel_stack) = 0x0202; // eflags = interrupts aktiviert und iopl = 0
*(--kernel_stack) = 0x08; // cs
*(--kernel_stack) = (unsigned int)entry; // eip
*(--kernel_stack) = 0; // interrupt nummer
*(--kernel_stack) = 0; // error code
// general purpose registers
//*(--kernel_stack) = 0; // eins von denen ist esp
*(--kernel_stack) = 0;
*(--kernel_stack) = 0;
*(--kernel_stack) = 0;
*(--kernel_stack) = 0;
*(--kernel_stack) = 0;
*(--kernel_stack) = 0;
*(--kernel_stack) = 0;
// segment registers
*(--kernel_stack) = 0x10;
*(--kernel_stack) = 0x10;
*(--kernel_stack) = 0x10;
*(--kernel_stack) = 0x10;
new_task->ebp = 0xd00fc0de;
new_task->esp = (unsigned int)kernel_stack;
new_task->eip = irq_tail;
}*hust* Stackaufbau aus tyndur ^^global irq_tail
irq_tail:
Gespeichert 
ts:
id: 1 ebp: 00000000h esp: 001FFE9Ch eip: 00000000h PD: 00000000h k_stack: 40101800h next: 40101814h
ts:
id: 2 ebp: D00FC0DEh esp: 401056E4h eip: 00008495h PD: 40102000h k_stack: 40105800h next: 40101844h
ts:
id: 3 ebp: D00FC0DEh esp: 401096BCh eip: 00008495h PD: 40106000h k_stack: 40109800h next: 00000000h
3BAA 3BAA 3BAA 3BAA 3BAA 3BAA 3BAA 3BAA 3BAA 3BAA 3BAA 3BAA 3BAA 3BAA 3BAA 3BAA 3BAA 3BAA 3BAA 3BAA 3BAA 3BAA 3BAA 3BAA 3BAA 3BAA 3BAA

ts:Ich wundere mich gerade, dass das MOO nicht auftaucht.
id: 3 ebp: D00FC0DEh esp: 401096E0h eip: 00008495h PD: 40106000h k_stack: 40109800h next: 00000000h
ts:
id: 1 ebp: 00000000h esp: 001FFEC0h eip: 00000000h PD: 00000000h k_stack: 40101800h next: 40101814h
ts:
id: 2 ebp: D00FC0DEh esp: 401056DCh eip: 00008495h PD: 40102000h k_stack: 40105800h next: 40101844h
ts:
id: 3 ebp: D00FC0DEh esp: 401096E0h eip: 00008495h PD: 40106000h k_stack: 40109800h next: 0000FC0DEh
ts:
id: 1 ebp: 00000000h esp: 001FFEC0h eip: 00000000h PD: 00000000h k_stack: 40101800h next: 40101814h
1111111111111111111111111111111111111111111111111111111111111111111111111111111111111111
new_task->ebp = 0xd00fc0de;


Gespeichert 11111111111111111111111111111111111111111111111111111111111111111111111111111111No Problem. Doch kein DOOFCODE.
1111111111111111111111111111111111111111111111
2MOO 2MOO 2MOO 2MOO 2MOO 2MOO 2MO
O 2MOO 2MOO 2MOO 2MOO 2MOO 2MOO 2MOO 2MOO 2MOO 2MOO 2MOO 2MOO 2MOO 2MOO 2MOO 2MO
BAA 3BAA 3BAA 3BAA 3BAA 3BAA 3BAA 3BAA 3BAA 3BAA 3BAA 3BAA 3BAA 3BAA 3BAA 3BAA
3BAA 3BAA 3BAA 3BAA 3BAA 3BAA 3BAA 3BAA 3B11111111111111111111111111111111111111
11111111111111111111111111111111111111111111111111111111111111111111111111111111
11111111111111111111111111111111111111111111111111111111111111111111111111111111
O 2MOO 2MOO 2MOO 2MOO 2MOO 2MOO 2MOO 2MOO 2MOO 2MOO 2MOO 2MOO 2M1111111111111111
O 2MOO 2MOO 2MOO 2MOO 2MOO 2MOO 2MOO 2MOO 2MOO 2MOO 2MOO 2MOO 2MOO 2MOO 2MOO 2MO
O 2MOO 2MOO 2MOO 2MOO 2MOO 2MOO 2MOO 2MOO 2MOO 2MOO 2MOO 2MOO 2MOO 2MOO 2MOO 2MO
O 2MOO 2MOO 2MOO 2MOO 2MOO 2MOO 2MOO 2MOO 2MOO 2MOO 2MOO 2MOO 2MOO 2MOO 2MOO 2MO
A 3BAA 3BAA 3BAA 3BAA 3BAA 3BAA 3BAA 3BAA 3BAA 3BAA 3BAA 3BAA 3BAA 3BAA 3BAA 3B
AA 3BAA 3BAA 3BAA 3BAA 3BAA 3BAA 3BAA 3BAA 3BAA 3BAA 3BAA 3BAA 3BAA 3BAA 3BAA 3B
AA 3BAA 3BAA 3BAA 3BAA 3BAA 3BAA 3BAA 3BAA
11111111111111111111111111111111111111
11111111111111111111111111111111111111111111111111111111111111111111111111111111
111111111111111111111111111111111111111111111
O 2MOO 2MOO 2MOO 2MOO 2MOO 2MOO 2MO
O 2MOO 2MOO 2MOO 2MOO 2MOO 2MOO 2MOO 2MOO 2MOO 2MOO 2MOO 2MOO 2MOO 2MOO 2MOO 2MO
O 2MOO 2MOO 2MOO 2MOO 2MOO 2MOO 2MOO 2MOO 2MOO 2MOO 2MOO 2MOO 2MOO 2MOO 2MOO 2MO
3BAA 3BAA 3BAA 3BAA 3BAA 3BAA 3BAA 3BAA 3BAA 3BAA 3BAA 3BAA 3BAA 3BAA 3BAA 3BAA
3BAA 3BAA 3BAA 3BAA 3BAA 3BAA 3BAA 3BAA 3BAA 3BAA 3BAA 3BAA 3BAA 3BAA 3BAA 3BAA
3BAA 3BAA 3BAA 3BAA 3BAA 3BAA 3BAA 3BAA 311111111111111111111111111111111111111
111111111111111111111111111111

Gespeichert *(--kernel_stack) = 0x0202; // eflags = interrupts aktiviert und iopl = 0
0x0202 = 1000000010
Gespeichert Wo kommt eigentlich diese Adresse her?Ich fordere Lizenzzahlungen, das ist meine!Code: [Auswählen]new_task->ebp = 0xd00fc0de;

Gespeichert Baust du das mit dem Multitasking auch ein?Dieses Thema ist absolut faszinierend, also gehört es ins PrettyOS Tutorial. Ich möchte es aber erst verarbeiten, wenn ich die Zusammenhänge komplett verstanden habe. Der Code von James Molloy ist für eigene Versuche nicht verwertbar. Daher wurde er hier zu Recht weitgehend auf den Müll geworfen.
