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

Seiten: [1] 2
1
Softwareentwicklung / Re: Problem mit Assembler SDK
« am: 20. February 2013, 23:47 »
Erstens: dein Code ist DOS Code und nicht Windows. Das sind DOS Interrupts die du da nutzt. Es läuft aber auch unter Windows ;)
Zweitens: Masm kann DOS und Windows Programme bauen, wird aber meistens im masm32 package für Windows Programme benutzt (da passende WinAPI includes und libs dabei sind)
Drittens: DOS interrupts wollen strings mit "$" terminiert.

Die Fehlermeldung besagt wohl das der Linker keinen Einsprungpunkt finden kann, versuch mal "Anfang:" in "_start:" umzubenennen

EDIT: wenn ich mir den Fehler so nochmal durchlese müsste auch "_Anfang:" gehen ;)
2
OS-Design / Re: QEMU + Tastaturtreiber
« am: 20. November 2012, 14:48 »
Mal ganz von dem Interruptproblem abgesehen, ist 0xFA kein Scancode sondern ein ACK vom Keyboard auf einen vorangegangenen Befehl.
Die sollten immer nach den Befehlen aus dem Buffer genommen werden.
3
Lowlevel-Coding / Re: Multitasking Versuch: CS ungültig
« am: 19. May 2010, 21:00 »
Der Stack ist noch in Ordnung..
hier hängts sich auf: (kprintf-code)
movzx eax, byte ptr ds:[eax]wobei an ds:[eax] der richtige String steht (auch null-terminiert!)

Dazu hab ich gefunden das es einen GP fault gibt wenn:
Zitat
GP:   If a memory operand effective address is outside the CS, DS, ES, FS, or GS segment limit. If the DS, ES, FS, or GS register contains a null segment selector.
siehe http://siyobik.info/index.php?module=x86&id=209, btw das ist eine nette Referenz ;)

ALLERDINGS:
Die Segment-limits passen alle:
Zitat
<bochs:55> info gdt
Global Descriptor Table (base=0x00125020, limit=47):
GDT[0x00]=??? descriptor hi=0x00000000, lo=0x00000000
GDT[0x01]=Code segment, base=0x00000000, limit=0xffffffff, Execute/Read, Accessed, 32-bit
GDT[0x02]=Data segment, base=0x00000000, limit=0xffffffff, Read/Write, Accessed
GDT[0x03]=Code segment, base=0x00000000, limit=0xffffffff, Execute/Read, Accessed, 32-bit
GDT[0x04]=Data segment, base=0x00000000, limit=0xffffffff, Read/Write, Accessed
GDT[0x05]=32-Bit TSS (Busy) at 0x00103040, length 0x00080

Und es ist auch in keinem Segment register der nulldeskriptor referenziert:
Zitat
<bochs:57> sreg
es:0x0010, dh=0x00cf9300, dl=0x0000ffff, valid=1
   Data segment, base=0x00000000, limit=0xffffffff, Read/Write, Accessed
cs:0x0008, dh=0x00cf9b00, dl=0x0000ffff, valid=1
   Code segment, base=0x00000000, limit=0xffffffff, Execute/Read, Accessed, 32-bit
ss:0x0010, dh=0x00cf9300, dl=0x0000ffff, valid=7
   Data segment, base=0x00000000, limit=0xffffffff, Read/Write, Accessed
ds:0x0010, dh=0x00cf9300, dl=0x0000ffff, valid=7
   Data segment, base=0x00000000, limit=0xffffffff, Read/Write, Accessed
fs:0x0010, dh=0x00cf9300, dl=0x0000ffff, valid=1
   Data segment, base=0x00000000, limit=0xffffffff, Read/Write, Accessed
gs:0x0010, dh=0x00cf9300, dl=0x0000ffff, valid=1
   Data segment, base=0x00000000, limit=0xffffffff, Read/Write, Accessed
ldtr:0x0000, dh=0x00008200, dl=0x0000ffff, valid=1
tr:0x0028, dh=0x0000eb10, dl=0x30400080, valid=1
gdtr:base=0x00125020, limit=0x2f
idtr:base=0x00125080, limit=0x7ff
any ideas?  :?

EDIT: die tasks sind in der kernel binary, werden bloss als user-code ausgeführt...

EDIT1: oh moment die Zusatzregister inkl DS sind kernel mode ....
EDIT1: jetz gehts natürlich, allerdings nur bis der erste task abgebrochen wird -.-
4
Lowlevel-Coding / Re: Multitasking Versuch: CS ungültig
« am: 18. May 2010, 10:50 »
Lol... wenn man mehr Einträge in die GDT schreibt sollet man auch nicht mehr struct gdt_entry[3] schreiben....

Naja.. jetzt wird in den task gesprungen, allerdings scheint kprintf() im user mode nicht zu funktionieren -.-
Rattert ewig über den string als würde es kein '\0' finden und dann haut Bochs ab mit nem ungültigem Speicherzugriff ewig über dem Bildschirmspeicher.
Kann das daran liegen das ne Kernel-funktion im Usermode aufgerufen wird?
Müsste dann wohl erst syscalls implementieren bevor multitasking läuft o.O
5
Lowlevel-Coding / Re: Multitasking Versuch: CS ungültig
« am: 18. May 2010, 01:00 »
Oha ich bin immer direkt ind en Speicher dahin gesprungen und bin nicht draus schlau geworden =D

Tatsächlich.. der Eintrag fürs User-Code-Segment ist irgendwie verhaut o.O
Na denn mal demnächst den GDT Code auch mal re-coden...
Danke =)
6
Lowlevel-Coding / Re: Multitasking Versuch: CS ungültig
« am: 18. May 2010, 00:44 »
So.
Es geht genau einmal in den Interrupthandler, scheduler läuft durch alles wunderbar bis zum iret. Da sieht die Situation dann so aus:
Zitat
| STACK 0x01004fec [0x001024ed]    //EIP
 | STACK 0x01004ff0 [0x0000001b]    //CS (=user-code mit pl3)
 | STACK 0x01004ff4 [0x00000200]    //EFLAGS
 | STACK 0x01004ff8 [0x01004000]    //esp
 | STACK 0x01004ffc [0x00000023]    //ss (=user-data mit pl3)
Auch alles in Ordnung, trotzdem gibts einen Protection Fault wenn das iret dann ausgeführt wird.. evt liegts doch an der GDT o.O
7
Lowlevel-Coding / Re: Multitasking Versuch: CS ungültig
« am: 17. May 2010, 03:02 »
SS ist 0x10. und CS ist zu dem Zeitpunkt 0x08
Zitat
00189211808e[CPU0 ] check_cs(0x001b): not a valid code segment !
00189590351i[CPU0 ] WARNING: HLT instruction with IF=0!
00422880000p[XGUI ] >>PANIC<< POWER button turned off.
00422880000i[CPU0 ] CPU is in protected mode (halted)
00422880000i[CPU0 ] CS.d_b = 32 bit
00422880000i[CPU0 ] SS.d_b = 32 bit
00422880000i[CPU0 ] EFER   = 0x00000000
00422880000i[CPU0 ] | RAX=000000000000000d  RBX=0000000000000000
00422880000i[CPU0 ] | RCX=0000000000000550  RDX=00000000000003d5
00422880000i[CPU0 ] | RSP=0000000001004f60  RBP=0000000001004f9c
00422880000i[CPU0 ] | RSI=0000000000000000  RDI=0000000000000000
00422880000i[CPU0 ] |  R8=0000000000000000   R9=0000000000000000
00422880000i[CPU0 ] | R10=0000000000000000  R11=0000000000000000
00422880000i[CPU0 ] | R12=0000000000000000  R13=0000000000000000
00422880000i[CPU0 ] | R14=0000000000000000  R15=0000000000000000
00422880000i[CPU0 ] | IOPL=0 id vip vif ac vm rf nt of df if tf sf ZF af PF cf
00422880000i[CPU0 ] | SEG selector     base    limit G D
00422880000i[CPU0 ] | SEG sltr(index|ti|rpl)     base    limit G D
00422880000i[CPU0 ] |  CS:0008( 0001| 0|  0) 00000000 000fffff 1 1
00422880000i[CPU0 ] |  DS:0010( 0002| 0|  0) 00000000 000fffff 1 1
00422880000i[CPU0 ] |  SS:0010( 0002| 0|  0) 00000000 000fffff 1 1
00422880000i[CPU0 ] |  ES:0010( 0002| 0|  0) 00000000 000fffff 1 1
00422880000i[CPU0 ] |  FS:0010( 0002| 0|  0) 00000000 000fffff 1 1
00422880000i[CPU0 ] |  GS:0010( 0002| 0|  0) 00000000 000fffff 1 1
00422880000i[CPU0 ] |  MSR_FS_BASE:0000000000000000
00422880000i[CPU0 ] |  MSR_GS_BASE:0000000000000000
00422880000i[CPU0 ] | RIP=0000000000101fce (0000000000101fce)
00422880000i[CPU0 ] | CR0=0x60000011 CR1=0x0 CR2=0x0000000000000000
00422880000i[CPU0 ] | CR3=0x00000000 CR4=0x00000000
00422880000i[CPU0 ] >> ret  : C3

Und in den Interrupthandler gehts auf jeden Fall noch rein, bis nach den Scheduler, ich vermute also das tritt erst kurz vor dem iret auf (ja genau das in der irq stub).
Und mit debugging unter Bochs kenn ich mich noch nicht so gut aus, das einzge was ich n paarmal gemacht hab war mehr debugging ausgaben rauszulassen ...

EDIT: es geht einmal in den Handler rein, beim iret crashts dann und baut nen GP-fault mit Fehlercode 0x18 was ein Zugriff auf das user-code segment mir pl0 wäre

EDIT2: Wenn ich die 2 tasks die ich zum Testen verwende weglasse und nur mti init_multitasking() einen Kernel-task erstell läuft alles wunderbar
8
Lowlevel-Coding / Multitasking Versuch: CS ungültig
« am: 17. May 2010, 01:08 »
Huhu,

Bin dabei Multitasking einzubauen, teilweise nach dem Tutorial aus dem Wiki.
Jetzt bekomm ich dauernd ne General protection Fault und Bochs sagt
Zitat
00189211808e[CPU0 ] check_cs(0x001b): not a valid code segment !

Der GDT Code hatte davor ohne Probleme funktioniert, ich denk den kann man als fehlqerquelle ausschliessen...

GDT-Setup:
void gdt_install() {
   
    gp.limit = (sizeof(struct gdt_entry) * 6) - 1;
    gp.base = (uint32_t) &gdt;

   
    gdt_set_gate(0, 0, 0, 0, 0);

    // kernel code segment
    gdt_set_gate(1, 0, 0xFFFFFFFF, GDT_FLAG_SEGMENT | GDT_FLAG_CODESEG | GDT_FLAG_PRESENT, GDT_FLAG_32_BIT | GDT_FLAG_4K_GRAN);

    // kernel data segment
    gdt_set_gate(2, 0, 0xFFFFFFFF, GDT_FLAG_SEGMENT | GDT_FLAG_DATASEG | GDT_FLAG_PRESENT, GDT_FLAG_32_BIT | GDT_FLAG_4K_GRAN);

//user segments
gdt_set_gate(3, 0, 0xFFFFFFFF, GDT_FLAG_SEGMENT | GDT_FLAG_CODESEG | GDT_FLAG_PRESENT | GDT_FLAG_RING3, GDT_FLAG_32_BIT | GDT_FLAG_4K_GRAN);
gdt_set_gate(4, 0, 0xFFFFFFFF, GDT_FLAG_SEGMENT | GDT_FLAG_DATASEG | GDT_FLAG_PRESENT | GDT_FLAG_RING3, GDT_FLAG_32_BIT | GDT_FLAG_4K_GRAN);

//TSS
gdt_set_gate(5, (uint32_t) tss, sizeof(tss), GDT_FLAG_TSS | GDT_FLAG_PRESENT | GDT_FLAG_RING3, 0);

   
    gdt_flush();
    __asm__ __volatile__("ltr %%ax" : : "a" (5 << 3));
}

IRQ-handling:
irq0:
    cli
    push byte 0
    push byte 32
    jmp irq_common_stub


irq_common_stub:
    pusha
    push ds
    push es
    push fs
    push gs

;load kernel segments
    mov ax, 0x10
    mov ds, ax
    mov es, ax
    mov fs, ax
    mov gs, ax
    mov eax, esp

    push eax
    mov eax, irq_handler
    call eax
    mov esp, eax

;mov ax, 0x23
;mov ds, ax
;mov es, ax
;mov gs, ax
;mov fs, ax
    pop gs
    pop fs
    pop es
    pop ds
    popa
    add esp, 8
    sti
    iret

irq_handler:
regs *irq_handler(regs *r) {
    void (*handler)(regs *r);
    regs *new_regs = r;
   
    handler = irq_routines[r->int_no - 32];
    if (handler)
        handler(r);
       
    if (r->int_no == 0x20) {  // INT 0x20, IRQ0, timer interrupt
    new_regs = schedule(r);
    tss[1] = (uint32_t) (new_regs + 1);
}

// EOI to slave controller
    if (r->int_no >= 40)
        outb(0xA0, 0x20);

    // EOI to master
    outb(0x20, 0x20);
   
    return new_regs;
}

uund die tasks mit scheduler
regs *schedule(regs *r) {
current_task->cpu_state = r;

if (current_task->time_left > 0) {
current_task->time_left -= TASK_TIMESLICE;
} else {
current_task->time_left = TASK_TIMESLICE * current_task->priority;
current_task->state = READY;

do {
current_task = current_task->next?current_task->next:first_task;
} while (current_task->state == BLOCKED);
current_task->state = RUNNING;
}

return current_task->cpu_state;
}

task *init_task(void *entrypoint, char *name, uint8_t priority) {
uint8_t *user_stack = (uint8_t *) pmm_alloc();
uint8_t *stack = (uint8_t *) pmm_alloc();

regs new_state = {
.eax = 0, .ebx = 0, .ecx = 0, .edx = 0, .esi = 0, .edi = 0,
.ebp = 0, .esp = (uint32_t) user_stack + 4096,
.eip = (uint32_t) entrypoint,
.cs = (0x03<<3) | 0x03, //ring 3 segments
.ss = (0x04<<3) | 0x03,
.es = (0x04<<3) | 0x03,
.fs = (0x04<<3) | 0x03,
.gs = (0x04<<3) | 0x03,
.ds = (0x04<<3) | 0x03,
.eflags = 0x200 //interrupts on
};

regs *state = (void *) (stack + 4096 - sizeof(new_state));
*state = new_state;

task* new_task = pmm_alloc();
new_task->cpu_state = state;
new_task->name = name;
new_task->priority = priority;
new_task->time_left = TASK_TIMESLICE + priority;
new_task->pid = next_pid++;
new_task->state = CREATED;
new_task->next = first_task;
first_task = new_task;

return new_task;
}

kann mir wer weiterhelfen? =)

Greetz, livinskull
9
Lowlevel-Coding / Re: Escape-Scancode an falscher Stelle
« am: 13. November 2008, 10:10 »
Big und Little Endian irgendwie verdreht?
Liest du byte-oder wordweise ein?

Und sonst wuerd ich sagen da is evt irgendwo ein Byte verloren gegangen....
So, viel mehr als im IRC konnt ich jetz auch nich sagen :P
Aber ich komm grad nich ins IRC, is hier blockiert; d.h. ich muss mich anderweitig beschaeftigen...
10
Offtopic / Re: FA Betriebssystementwicklung
« am: 29. July 2008, 17:32 »
Lol :P

Freut mich das ich andere Leute so motivieren kann :D

So, ich denke ich melde mich mal hier wieder zurück, nachdem das Abitur sowie ein längerer Krankenhausaufenthalt nach einem (Sport-) Unfall überstanden sind ...
Naja, gibt nix mehr zu sagen *g*
Greetz livinskull
11
Offtopic / Re: FA Betriebssystementwicklung
« am: 11. April 2008, 22:08 »
@livinskull: versteh ich das richtig, dass du die Arbeit für das Fach Physik geschrieben hast?

Jup, stimmt
12
Offtopic / Re: FA Betriebssystementwicklung
« am: 11. April 2008, 19:02 »
O_O
hab ich was anderes geschrieben??
Das wusste ich eigentlich auch xD
Aber egal :D
13
Offtopic / Re: FA Betriebssystementwicklung
« am: 11. April 2008, 16:25 »
Sooo, 15 Punkte auf die Facharbeit :D
(von 15, für die dies net wissen xD)
14
Offtopic / Re: FA Betriebssystementwicklung
« am: 10. April 2008, 17:30 »
Lol, shit ich erzähl hier mist xD
Hab se noch gar net zurückbekommen... solltse aber morgen haben^^

Und wegs dem Wiki.. wieso eigentlich nicht ;)
Das einzige Problem zur Zeit ist dass in 2 Wochen Abitur ist und ich deswegen nicht gerade viel Zeit hab ;)
Aber mal schauen, wenn ich die Zeit find mach ichs, und sonst halt nach dem Abi...
15
Offtopic / FA Betriebssystementwicklung
« am: 10. April 2008, 15:12 »
Hallöle,

wenn es jemanden interessiert, meine Facharbeit über Betriebssystementwicklung ist auf Happy-Securityzum Download verfügbar ;)

Ist zwar eher einfach gehalten, aber trotzdem schon so komplex das der Lehrer es nicht alleine korrigieren konnte und ich die FA deswegen als Letzter zurückbekommen hab xD

Greetz livinskull
16
OS-Design / floppy bzw dateisystemtreiber
« am: 10. January 2008, 20:35 »
Tach,

ich hab jetz nen funktionierenden Floppy-Treiber, das Dateisystem (FAT12) fehlt allerdings noch........
Jetz meine Frage: Ist es sinnvoll die komplette Diskette in den RAM zu laden?
Oder soll überhaupt eine komplette FAT geladen werden?


Ich hätte mir jetz gedacht die 2. FAT und das Rootdirectory einzulesen, aber selbst das braucht noch ziemlich lang. (und den 1. sektor natürlich, wegs den parametern)

Wie habt ihr das umgesetzt?

mfg, livinskull
17
Lowlevel-Coding / Re: A20/Multitasking
« am: 09. January 2008, 23:36 »
wenn das A20 Gate aktiviert ist......
Das mit dem Aktivieren vom A20-Gate ist nämlich so ne Sache....
Jeder PC möchte das gerne anders aktiviert haben  :evil:

Naja, für den Realmode kannst es wohl nicht verwenden wie, bluecode und osbios schon sagten, und wenn du in den Protected Mode willst solltest du auch den Rat von den Grub-Anhängern hier berücksichtigen, es sei denn du bist so vernarrt wie ich und willst unbedingt auch den Bootloader selber schreiben.......

livinskull
18
Offtopic / Re: Lowlevel suchplugin
« am: 07. January 2008, 00:15 »
o.O
wusste gar nicht das sowas automatisch generiert wird  :roll:
naja was solls
19
Offtopic / Lowlevel suchplugin
« am: 06. January 2008, 22:11 »
Moin,

Hab mal aus Langeweile ein Lowlevel-wiki Suchplugin für Firefox erstellt.
Vielleicht findets ja jemand nützlich ;)

http://livinskull.kilu.de/files/ff-lowlevel-wiki.rar

Einfach ins Verzeichnis "C:\Programme\Mozilla Firefox\searchplugin" (Windows) bzw "/usr/X11R6/lib/firefox/searchplugins" (linux) entpacken

mfg livinskull
20
Lowlevel-Coding / Re: Problem mit Keyboard-Treiber
« am: 19. December 2007, 16:16 »
OK, klappt jetzt
Verwende jetzt nen Ringbuffer und statt dem zeugs mit den pointern (
buff-tmp <groesse) einfach ne variable die mitzählt.
PUffer wird jetz auch gleich ordentlich initialisiert, aber ich glaub da war was mit den pointern kaputt

thx for help

livinskull
Seiten: [1] 2

Einloggen