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

Seiten: [1] 2
1
Lowlevel-Coding / Re: Verwirrt durch Interrupts
« am: 17. July 2007, 08:56 »
@noooooos:
Also die Hardware interrupts habe ich DEmaskiert, so wie du es mir in einem anderen Post gesagt hast (zu Testzwecken).
Hiermit remappe ich die PICs:
PIC1 equ 0x20
PIC2 equ 0xA0
PIC1_DATA equ PIC1 + 1
PIC2_DATA equ PIC2 + 1

ICW1 equ 0x11
ICW4 equ 0x01


remap_pics: ; eax = offset1 ebx = offset2
push eax

in eax, PIC1_DATA
mov [a1], al

in eax, PIC2_DATA
mov [a2], al

mov eax, ICW1
out PIC1, eax
out PIC1, eax

pop eax
out PIC1_DATA, eax
mov eax, ebx
out PIC2_DATA, eax

mov al, 4
out PIC1_DATA, al
mov al, 2
out PIC2_DATA, al

mov eax, ICW4
out PIC1_DATA, eax
out PIC2_DATA, eax

mov eax, [a1]
out PIC1_DATA, eax
mov eax, [a2]
out PIC2_DATA, eax
ret


a1 db 0
a2 db 0

Und mir
mov eax, 0x20
mov ebx, 0x28
call remap_pics
rufe ich die Funktion auf.

Aber egal wie ich es mache, es funktioniert nicht. Kein int funktioniert und qemu friert einfach ein. Ich kann es nicht mal mehr beenden.
2
Lowlevel-Coding / Re: Verwirrt durch Interrupts
« am: 16. July 2007, 12:32 »
Hi, ich bins nochmal...nach einige Zeit hat mich das OS development wieder gepackt, aber ich haenge immernoch an dieser scheiss IDT. Ich glaube aber, dass ich jetzt weiss, wo der Fehler ist, undzar:
Folgendermassen sieht meine IDT aus, ich habe zu Testzwecken alle Eintraege ausgfuellt:
idt_start:
%rep 256
dw 0x02ec
dw 0x08  ; <---hier
dw 0x8E00
dw 0x10
%endrep
idt_end:

idt_pointer:
dw idt_end - idt_start - 1
dd idt_start
lidt [idt_pointer]

Die Addresse meiner universal isr ist bei 0x1002ec, die hab ich manuell eingetragen.
An der markierten Stelle soll der "code selector" stehen, hab ich gelesen.
So sieht meine GDT aus:
GDTR:

GDTsize DW GDT_END-GDT-1

GDTbase DD GDT



GDT:

NULL_SEL        EQU $-GDT     ; null descriptor is required (64bit per entry)

      DD 0x0

      DD 0x0

CODESEL     EQU $-GDT       ; 4GB Flat Code at 0x0 with max 0xFFFFF limit

      DW     0xFFFF           ; Limit(2):0xFFFF

      DW     0x0              ; Base(3)

      DB     0x0              ; Base(2)

      DB     0x9A             ; Type: present,ring0,code,exec/read/accessed (10011000)

      DB     0xCF             ; Limit(1):0xF | Flags:4Kb inc,32bit (11001111)

      DB     0x0              ; Base(1)

DATASEL     EQU $-GDT       ; 4GB Flat Data at 0x0 with max 0xFFFFF limit

      DW     0xFFFF           ; Limit(2):0xFFFF

      DW     0x0              ; Base(3)

      DB     0x0              ; Base(2)

      DB     0x92             ; Type: present,ring0,data/stack,read/write (10010010)

      DB     0xCF             ; Limit(1):0xF | Flags:4Kb inc,32bit (11001111)

      DB     0x0              ; Base(1)

GDT_END:
Was soll jetzt der code selector sein?
CODESEL?
Den habe ich naemlich eingetragen, ist in dem Falle 8, weil zwar dwords dazwischen sind, aber es geht immer noch nicht.
Ich kann keine interrupts aufrufen. Hoffentlich ist nicht alles so schwierig wie die IDT :/
3
Lowlevel-Coding / Re: Verwirrt durch Interrupts
« am: 02. June 2007, 17:38 »
Dann werd ich erstmal 32+16 interrupts machen....hoffentlich gehts dann :/
Edit: Also manuelles Aufrufen per int funktioniert auch nicht :/
Seltsam :/
Edit: Ich fuerchte, der Eintrag ist falsch. ich habe den Einfach aus einem Tutorial kopiert und die Adresse angepasst, aber das scheint ja falsch zu sein.

Edit: Kann man nicht einfach die BIOS IDT inklusive ISRs irgendwo herbekommen und dann nur auf den PMode zuschneiden?
4
Lowlevel-Coding / Re: Verwirrt durch Interrupts
« am: 02. June 2007, 16:02 »
Aachso....hm...na ok...dann versuch ich das mal. Danke.

Also ich hab das jetzt so gemacht:
idt_start:
dw 0x0000
dw 0x10
dw 0x8E00
dw 0x00
idt_end:

idt_pointer:
dw idt_end - idt_start - 1
dd idt_start


set_idt:
mov eax, exception
mov [idt_start], ax
shr eax, 16
mov [idt_start+6], ax

lidt [idt_pointer]
sti
ret

Und so funktioniert es nicht. Und das liegt am sti. Da verreckt er immer. Wenn ich das sti auskommentiere, gehts, aber das ist ja nicht der Sinn. Denn ich brauche ja interrupts. Die PICs sind auch alle gesetzt. Oder brauche ich noch mehr ISRs?

Edit: Und die Adresse wird auch korrekt kopiert.
Edit: Anscheinend wird die Adresse doch nicht richtig eingetragen. Aber selbst, WENN ich sie manuell richtig eintrage, geht es nicht.
5
Lowlevel-Coding / Re: Verwirrt durch Interrupts
« am: 02. June 2007, 14:21 »
Also die PICs hab ich nun remapped, die ISRs krieg ich auch noch selber hin, aber mit der IDT tu ich mich sehr schwer.
Folgendes habe ich mal geschrieben:
idt_start:
dw exception & 0x00ffff
dw 0x10
dw 0x8E00
dw exception >> 16
idt_end:
nasm:
idt.s:7: error: `&' operator may only be applied to scalar values
idt.s:10: error: shift operator may only be applied to scalar values

Ok, gegooglet:
You're trying to load a 16-bits field (a part of the IDT descriptor) with a reference to a 32-bit label that is subject to relocation. Try to replace

isr_label:
   iret
bad_stuff dw isr_label & 0xFFFF
          dw 0xdead
          dw 0xbeef
          dw isr_label >> 16

by something that extracts a 'pure value' from the address (e.g. the difference of two addresses are a pure value and $$ means to NASM the start of the section)

%define BASE_OF_SECTION SOME_CONSTANT_YOU_SHOULD_KNOW
isr_label:
   iret
good_stuff dw (BASE_OF_SECTION isr_label - $$) & 0xFFFF
           dw 0xcafe
           dw 0xbabe
           dw (BASE_OF_SECTION isr_label - $$) >> 16

The role of BASE_OF_SECTION is to adjust the pure offset to the real situation (usually as defined in your linker script), e.g. if your kernel get loaded at 1MB, you'll set it to 0x100000 to keep the CPU happy.

Aber das versteh ich nicht. Leider konnte ich mit den posts auch nicht so viel anfangen...
6
Lowlevel-Coding / Re: Verwirrt durch Interrupts
« am: 02. June 2007, 12:40 »
Ok...mal sehen, ob ich das schaffe....
Aber wie mach ich das denn jetzt genau mit den IRQs, das hab ich noch nicht 100% verstanden...
Also ich sage dem ersten PIC, dass die IRQs 0-7 z.B. ISR32-39 sind und dem zweiten, dass IRQs 8-15 ISR40-47 sind?
7
Lowlevel-Coding / Re: Verwirrt durch Interrupts
« am: 31. May 2007, 19:22 »
Nur das Problem ist ja, dass in der IDT die Adresse in 2 words oder so eingeteilt ist. 
8
Lowlevel-Coding / Re: Verwirrt durch Interrupts
« am: 31. May 2007, 18:52 »
Hm....da ob ich das jetzt alles verstehe.... :/
Woher kenn ich denn die Adresse der ISR? Denn die brauch ich ja fuer die IDT.
9
Lowlevel-Coding / Re: Verwirrt durch Interrupts
« am: 31. May 2007, 18:29 »
Aber man braucht doch einige ISRs, um ueberhaupt irgendwas machen zu koennen. Zumindest fuer die IRQs sollte man doch welche schreiben und evtl. fuer die Exceptions, oder nicht?
10
Lowlevel-Coding / Re: Verwirrt durch Interrupts
« am: 31. May 2007, 18:10 »
Achso....Aber eine Exception ist doch auch ein interrupt, oder nicht?
Dann muesste ich also erstmal alle ISRs schreiben und dann die IRQs zuweisen...hm ...da ob ich das verstehe.
11
Lowlevel-Coding / Re: Verwirrt durch Interrupts
« am: 31. May 2007, 17:55 »
Achso....
Also IRQs kommen nur von der Hardware?
Und die Sachen, die ich mit int aufrufe sind die ISRs?
Und ich kann jetzt einem IRQ sozusagen ein int zuweisen?
12
Lowlevel-Coding / Verwirrt durch Interrupts
« am: 31. May 2007, 15:39 »
Hallo,
ich versuche gerade mal die ganzen Interrupts zu programmieren, aber ich schaffs einfach nicht, habe sehr viele Fragen, aber die kommen spaeter, erstmal nur eine:
Undzwar: welches sind im Pmode die Hardware Interrupts, welches Exceptions, welches Software Interrupts und welches eigene Interrupts (sind Software und die eigenen die gleichen?) ?

So eine Liste waer mal ganz schoen.

Wenn ich das weiss, dann frag ich weiter :)

Edit: Und vielleicht nochmal die gleiche Liste fuer den Rmode, damit ich sehen kann, wo die Unterschiede sind.
13
Lowlevel-Coding / Re: Probleme mit Variablen
« am: 20. May 2007, 12:57 »
Achso....ja...stimmt das ergbit Sinn....dann muss ich mal sehen, wohin der code geladen wird.

Edit: gut...es geht, danke
14
Lowlevel-Coding / Re: Probleme mit Variablen
« am: 20. May 2007, 10:08 »
Also das zum Schluss habe ich nur, dass ich keine ungeraden Dateigroessen spaeter habe. Weil qemu will immer nur ganze Sektoren laden. Und so muss ich eben die Datei nicht immer manuell mit nullen auffuellen.

Ja...also assemblen tu ich den zu 'ner bin. Eine bin hat doch garnicht solche text segmente und so, oder? Jedenfalls ging das im real mode immer perfekt. Aber der protected mode ist ja auch anders.

Koenntest du vielleicht den code mal an der entsprechenden Stelle so abaendern, dass es funktionert/funktionieren muesste ?
Ich kann dir gerne den ganzen source und die binaerdatei geben, wenn du das brauchst.
15
Lowlevel-Coding / Probleme mit Variablen
« am: 19. May 2007, 17:58 »
Hallo,
ich hab zwar schon einem anderen Thread geschrieben, aber ich denk, ich mach lieber einen neuen auf. Ist ja ein anderes Problem.
Also...ich schaffe es neuerdings nicht mehr, einige Variablen zu laden. Beispiel:
asdf dd 0
csr_x dd 0
csr_y dd 0
diese Variablen habe ich deklariert. Wenn ich jetzt csr_x bzw. y nach eax verschiebe, steht darin der Wert 0, so wies sein soll. Wenn ich aber nun asdf nach eax verschiebe, steht was ganz anderes drin....sollte ja eigentlich alles 0 sein, aber da stehen dann irgendwelche zufallszahlen drin. \

mov dword eax, [asdf]
schreibt unsinn nach eax

mov dword eax, [csr_x]
schreibt den Wer von csr_x nach eax

Wie kann denn sowas moeglich sein?

Edit: Wie so oft, kommt mir immer dann die Loesung, nachdem ich was gepostet habe. Undzwar funktoniert es, wenn ich erst einen Wert in die Variable reinschreibe. Aber das solls ja auch nicht sein. Ich will ja nicht erst etwas in die Variablen schreiben muessen, um sie spaeter korrekt lesen zu koennen. Also geloest hab ich mein Problem noch nicht.

Edit2: Hier mal der Code des Kernels...der wird vielleicht helfen:
http://rafb.net/p/qWR6xO64.html
16
Lowlevel-Coding / Re: PMode geht nicht
« am: 19. May 2007, 13:51 »
Ja...vermutlich geht die ueberpruefung nur nicht....naja....ich hab jetzt mein naechsted Problem:
undzwar will ich strings ausgeben. Das wuerde ich so machen: string deklarieren, zeichen fuer zeichen ausgeben. Aber das geht nicht.
mov al, [hello]
muesste eigentlich das erste Zeichen aus dem string speichern, oder?
Macht es aber nicht. Nichts wird augegeben.
hello db "hello, world\n", 0
damit deklariere ich den string. Aber wieso wird er nicht ausgegben?
Wenn ich ein Zeichen "einfach so" nach al schreibe und die Funktion aufrufe, wird es perfekt ausgegeben. Aber wieso nicht eins aus einem String?
17
Lowlevel-Coding / Re: PMode geht nicht
« am: 19. May 2007, 08:02 »
Aha...na ich hab noch ein paar andere bootloader....mal sehen, wie die das geloest haben. Danke....

Edit: Hab einfach mal das call halt rausgenommenl...jetzt gehts zwar, aber ob der a20 an is? Ich bin mir nicht sicher. Ich glaube, der ist an, aber code zur ueberfruefung stimmt nicht ganz.
18
Lowlevel-Coding / Re: PMode geht nicht
« am: 18. May 2007, 23:13 »
Argh....sobald ich den Bootloader aufm echten Computer ausfuehre, schreibt er in die obere linke ecke ein rotes A. Wenn ich mal sich den quellcode anguckt, findet man das an der Stelle, wo a20 enabled werden soll. Ist das wirklich dieses A? Und warum gunktionierts unter qemu problemlos?
19
Lowlevel-Coding / Re: PMode geht nicht
« am: 18. May 2007, 15:39 »
Also ich stimme da bitmaster irgendwie zu, aber es ist ja auch erstmal egal.
Ich hab jetzt einen bootloader gefunden (und auch groesstenteils verstanden, ich muss mir trotzdem nochmal einen selbst bauen), aber der funktioniert noch nicht ganz. [bits 16]
[org 0x7C00]

jmp boot
;-------------Data
;-------------GDT Table
GDTR:
GDTsize DW GDT_END-GDT-1
GDTbase DD 0x500

GDT:
NULL_SEL         EQU $-GDT  ; null descriptor is required (64bit per entry)
      DD 0x0
      DD 0x0
CODESEL          EQU $-GDT  ; 4GB Flat Code at 0x0 with max 0xFFFFF limit
      DW     0xFFFF           ; Limit(2):0xFFFF
      DW     0x0              ; Base(3)
      DB     0x0              ; Base(2)
      DB     0x9A             ; Type: present,ring0,code,exec/read/accessed (10011000)
      DB     0xCF             ; Limit(1):0xF | Flags:4Kb inc,32bit (11001111)
      DB     0x0              ; Base(1)
DATASEL          EQU $-GDT  ; 4GB Flat Data at 0x0 with max 0xFFFFF limit
      DW     0xFFFF           ; Limit(2):0xFFFF
      DW     0x0              ; Base(3)
      DB     0x0              ; Base(2)
      DB     0x92             ; Type: present,ring0,data/stack,read/write (10010010)
      DB     0xCF             ; Limit(1):0xF | Flags:4Kb inc,32bit (11001111)
      DB     0x0              ; Base(1)
GDT_END:
;-------------GDT Table End
;-------------Variables
start_s DB 0                  ; starting sector    [0x1-0x12]
total   DB 0                  ; number of sector   [max 2880]
track   DB 0                  ; track number       [max 160]
head    DB 0                  ; head number        [max 2]
drive   DB 0                  ; boot drive number  [usually 0]
bseg    DB 0                  ; memory address segment
boff    DW 0                  ; and offset to load into
loadmsg db "bootsector loaded",13,10,0
;-------------Variables End
;-------------Functions
print: ; print string
lodsb ; load character
or al, al ; check if 0
jz short print_e
mov ah, 0x0e ; print
mov bx, 0x0007
int 0x10
jmp print ; next char
print_e:
ret

wkc:
xor al, al ; set al to 0
in al, 0x64 ; get kbd status through input port 0x64
test al, 2 ; check if second bit is clear
jnz  wkc
ret

wkf:
xor cx, cx
in al, 0x64 ; get kbd status
test al, 1 ; check if first bit is clear
jz wkf
ret

halt: ; halt on error
mov byte [gs:0], al
mov byte [gs:1], 0x04
cli
hlt
;-------------Funtions End
;-------------Data End

boot:
mov [drive], dl
cli                  ; no interrupts
mov ax, cs      
mov ds, ax   
mov es, ax
mov fs, ax
mov ax, 0x1d0 ; stack address
mov ss, ax        ; align stack   
mov sp, 0x200        ; 512 byte stack

mov ax,0xb800           ; setup video segment
mov gs,ax
sti                  ; enable interrupts

jmp init

init:
; enable a20
cli

call wkc ; wait for kbd buffer to clear
mov al, 0xd1 ; write 0xd1
out 0x64, al ; to status
call wkc
mov al, 0xdf ; set settings in kdb (to enable a20)
out 0x60, al ; send the value
call wkc

mov cx, 0x10
kbdwait:
xor ax, ax ; do something
out 0xe0, ax ; more useless stuff
loop kbdwait

; is a20 enabled?
mov al, 0xd0
out 0x64, al
call wkf
in al, 0x60
test al, 2
jnz a20on
mov al, 'A'
call halt
a20on:
sti

; load kernel.bin from floppy at to 0x100000
read:
xor ax, ax ; Floppt reset BIOS function
mov dl, [drive] ; select floppy that was booted from
int 0x13
jc read

mov ax, 0xffff
mov es, ax ; data buffer for file
mov bx, 0x10 ; start of segment
mov ah, 2 ; BIOS function
mov al, 17 ; number of sector to read
mov ch, 1 ; track
mov cl, 1 ; sector
mov dh, 1 ; head
int 0x13 ; call BIOS read dist function

mov dx, 0x3f2 ; stop the motor
mov al, 0x0c ; from spinning
out dx, al

; move GDT to 0x500
xor ax, ax
mov ds, ax
mov es, ax
mov si, GDT ; Move from [ds:si]
mov di, [GDTbase] ; Move to [es:di]
mov cx, [GDTsize] ; size of GDT
cld ; clear the direction flag
rep movsb ; move it

; enter pmode
cli
mov eax, cr0
or al, 1
mov cr0, eax

; load gdt
lgdt[GDTR]

; clear cs/ip/eip
jmp CODESEL:FLUSH

[BITS 32]
FLUSH:
; refresh all segment registers
mov eax, DATASEL
mov ds, eax
mov es, eax
mov fs, eax
mov gs, eax
mov ss, eax
mov esp, 0xffff

mov eax, 0xb8000
mov byte [eax], 'b'
inc eax
mov byte [eax], 7

;jmp $
jmp CODESEL:0x100000

; stop here
;hlt


times 512-($-$$)-2 db 0
dw 0x0AA55

So sieht er aus.
Fast am Ende gebe ich 'b' aus. Aber wie springe ich jetzt in den Kernel? Der ist also genau nach dem bootsector.
Wenn mir das jetzt noch jemand sagt, hab ich endlich wieder ein Erfolgserlebnis und ich kann weitermachen.

Edit: Also ich hab irgendwie noch ein bisschen rumgespielt...es geht jetzt...Jetzt faengt die Arbeit an.
20
Lowlevel-Coding / Re: PMode geht nicht
« am: 18. May 2007, 15:13 »
Ich will den aber verstehen. Ich will doch wissen, wie der Bootloader funktioniert. Leider bin ich wieder einer der einzigen die so denken.
Seiten: [1] 2

Einloggen