Lowlevel
Lowlevel => Lowlevel-Coding => Thema gestartet von: JustJim am 28. November 2013, 15:07
-
hey hey!
Ich hab da n großes Problem. Naja wahrscheinlich eher ein kleines.
Am besten schreibe ich direkt den Code und was dabei rauskommt
_isr0: //Divide by Zero
cli
push byte 0
push byte 0
jmp isr_common_stub
_isr1: //Debug
cli
push byte 0
push byte 1
jmp isr_common_stub
Das erzeugt bei mir den Fehler:
$ make
gcc -m32 -c -o start.o start.S
start.S: Assembler messages:
start.S:67: Error: junk `0' after expression
start.S:68: Error: junk `0' after expression
start.S:72: Error: junk `0' after expression
start.S:73: Error: junk `1' after expression
Es ist gut möglich, dass es mit Nasm gehen würde, aber dann müsste ich den ganzen Code ändern.
Wie mache ich es in der Notation?
-
Der GNU-Assembler benutzt standardmäßig AT&T-Syntax. Wie die funktioniert, ist im Wiki hier (http://www.lowlevel.eu/wiki/Inline-Assembler_mit_GCC#AT.26T-Syntax) beschrieben. Das läuft also für diesen Code im Wesentlichen auf "pushb $0" statt "push byte 0" hinaus, aber du wirst sicher auch noch irgendwann andere Instruktionen benutzen.
Das cli am Anfang ist unnötig, wenn du in der IDT Interrupt Gates (also nicht Trap Gates) benutzt. Das ist die bessere Alternative.
-
okay gut. jetzt habe ich aber noch mehr Probleme bekommen :/
Der Teilcode in isrs.c
#include "system.h"
extern void isr0();
extern void isr1();
extern void isr2();
extern void isr3();
extern void isr4();
void isrs_install()
{
set_idt_entry(0, (unsigned)isr0, 0x08, 0x8E);
set_idt_entry(1, (unsigned)isr1, 0x08, 0x8E);
set_idt_entry(2, (unsigned)isr2, 0x08, 0x8E);
set_idt_entry(3, (unsigned)isr3, 0x08, 0x8E);
set_idt_entry(4, (unsigned)isr4, 0x08, 0x8E);
}
Der Teilcode in start.S
.global _start
_start:
// Stack initialisieren
mov $kernel_stack, %esp
// C-Code aufrufen
call main
endlessjmp:
jmp endlessjmp
//ISRs
.global _isr0
.global _isr1
.global _isr2
.global _isr3
.global _isr4
_isr0: //Divide by Zero
cli
push $0x0000
push $0x0000
jmp isr_common_stub
_isr1: //Debug
cli
push $0x0000
push $0x0001
jmp isr_common_stub
.extern _fault_handler
isr_common_stub:
pusha
push %ds
push %es
push %fs
push %gs
mov $0x10, %ax
mov %ax, %ds
mov %ax, %es
mov %ax, %fs
mov %ax, %gs
mov %esp, %eax
push %eax
mov _fault_handler, %eax
call %eax
pop %eax
pop %gs
pop %fs
pop %es
pop %ds
popa
add $8, %esp
iret
Was mir die Konsole ausspuckt:
start.o: In function `isr_common_stub':
(.text+0x11e): undefined reference to `_fault_handler'
isrs.o: In function `isrs_install':
/home/dennis/Desktop/Tutorial/src/isrs.c:37: undefined reference to `isr0'
/home/dennis/Desktop/Tutorial/src/isrs.c:38: undefined reference to `isr1'
/home/dennis/Desktop/Tutorial/src/isrs.c:39: undefined reference to `isr2'
/home/dennis/Desktop/Tutorial/src/isrs.c:40: undefined reference to `isr3'
/home/dennis/Desktop/Tutorial/src/isrs.c:41: undefined reference to `isr4'
make: *** [kernel] Error 1
Langsam verzweifele ich.
-
Wieso definierst du _isr0 und benutzt es aber als isr0? Benutzt du wirklich einen Compiler, der Unterstriche anhängt? Meines Wissens machen das nur manche Windows-Compiler per Default.
-
oh damn. man man! Oh man. Es kam mir zwar seltsam vor, hab mir aber bei nichts gedacht, dass bei bei dem Tut die Vars unterschiedlich dargestellt worden sind. Dummes Windows haha.
Danke. Jetzt Kompiliert er ^^
-
soooo. gefixt, kompiliert und in main initialisiert. dannach als test a=a/0; gemacht.
image geupdated und bochs ausgeführt. Er startet immer wieder neu ??.
Ich dachte ich mach das, damit das nicht passiert :S.
Das ist der Code den ich vin Bochs kriege:
00053351628e[CPU0 ] read_RMW_virtual_dword_32(): segment limit violation
und das für ziemlich viele Adressen. Läuft diese Violations also in ner Endlosschleife ab
edit:
hab ein klein wenig geändert.
Jetz bekomm ich von Bochs folgendes:
00124087052e[DEV ] read from port 0x0083 with len 4 returns 0xffffffff
00124087058e[DEV ] read from port 0x0083 with len 4 returns 0xffffffff
00124087148e[DEV ] read from port 0x0083 with len 4 returns 0xffffffff
00124087154e[DEV ] read from port 0x0083 with len 4 returns 0xffffffff
00124087244e[DEV ] read from port 0x0083 with len 4 returns 0xffffffff
00124087250e[DEV ] read from port 0x0083 with len 4 returns 0xffffffff
00124087318e[CPU0 ] fetch_raw_descriptor: GDT: index (736f) e6d > limit (27)
00124087352e[CPU0 ] load_seg_reg(ES, 0x636f): RPL & CPL must be <= DPL
00124087386e[CPU0 ] fetch_raw_descriptor: GDT: index (3f) 7 > limit (27)
00124087420e[CPU0 ] load_seg_reg(ES, 0x000a): RPL & CPL must be <= DPL
00124087476e[DEV ] read from port 0x0083 with len 4 returns 0xffffffff
00124087482e[DEV ] read from port 0x0083 with len 4 returns 0xffffffff
00124087550e[CPU0 ] load_seg_reg(ES, 0x535f): invalid segment
00124087584e[CPU0 ] load_seg_reg(ES, 0x4d5f): invalid segment
00124087640e[DEV ] read from port 0x0083 with len 4 returns 0xffffffff
00124087646e[DEV ] read from port 0x0083 with len 4 returns 0xffffffff
00124087714e[CPU0 ] fetch_raw_descriptor: GDT: index (c07) 180 > limit (27)
00124087748e[CPU0 ] fetch_raw_descriptor: GDT: index (a07) 140 > limit (27)
00124087782e[CPU0 ] fetch_raw_descriptor: GDT: index (807) 100 > limit (27)
00124087816e[CPU0 ] fetch_raw_descriptor: GDT: index (607) c0 > limit (27)
00124087850e[CPU0 ] fetch_raw_descriptor: GDT: index (407) 80 > limit (27)
00124087884e[CPU0 ] fetch_raw_descriptor: GDT: index (207) 40 > limit (27)
00124087940e[DEV ] read from port 0x0083 with len 4 returns 0xffffffff
00124087946e[DEV ] read from port 0x0083 with len 4 returns 0xffffffff
00124088014e[CPU0 ] fetch_raw_descriptor: GDT: index (107) 20 > limit (27)
00124088070e[DEV ] read from port 0x0083 with len 4 returns 0xffffffff
00124088076e[DEV ] read from port 0x0083 with len 4 returns 0xffffffff
00124088222p[IOAP ] >>PANIC<< I/O apic write with len=1 (should be 4)
Bochs startet also ca. 4 mal, dann bleibts hängen und fragt ob ich "die" möchte
-
Okay xD auch wenn ich jetzt oft hintereinander gepostet und Beiträge editiert habe...
Ich wollte nur bescheid sagen: Problem gelöst
Der Fehler lag hier:
mov fault_handler, %eax
Es muss heissen:
mov $fault_handler, %eax