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

Seiten: 1 2 [3] 4 5
41
Entschuldigung, ich sehe gerade, der Editor hat da etwas "vergessen".  :-(

Ich werde meine Frage heute Abend nochmal erklären, trotzdem Danke!
42
Hallo,

Ich habe in den letzten Tagen die Wikieinträge im os-dev.org-Wiki zum Long Mode recht ausführlich studiert ("unsere" Seite dazu ist ja noch recht spärlich) und werde irgendwie nicht schlau, wie ich am besten Kernel und Bootstrap linke.
In diesem Eintrag werden dazu drei Methoden beschrieben:
Loading...
    5.1 With your own boot loader             Fällt schonmal weg, lieber Multiboot
    5.2 With a separate loader                             
    5.3 With a 32-bit bootstrap in your kernel
43
Danke, jetzt macht das ganze irgendwie mehr Sinn.   :-)
44
Hallo,

beim Auslesen des Multiboot-MMap ist mir aufgefallen, dass die beschriebenen Addressen nicht zusammenhängen. (d.h. Limit (Base + Length) von Eintrag n ist nicht Base von Eintrag n+1)
Ich gehe deshalb  davon aus, dass der gesamte Addressraum zwischen 0 und dem Ende des höheren Speichers (multiboot_lower_mem * 1024 + multiboot_upper_mem * 1024, oder?) frei ist, solange kein Blocked-Eintrag dazu im MMap vorhanden ist. Ist das so richtig?
45
Softwareentwicklung / Re: Compilerfehler bei C-Bitfeldern
« am: 24. September 2012, 22:51 »
Die einzige Erklärung, die ich hätte, ist, dass du irgendwo #define PML4_PRESENT 1 usw. stehen hast. Es ist nämlich ungewöhnlich, dass Felder komplett in Großbuchstaben stehen.

Danke, du hast mich auf die Lösung gebracht - ich sollte nicht immer mitten in der Nacht Code schreiben und dann den armen Compiler beschuldigen... :-)
46
Softwareentwicklung / Compilerfehler bei C-Bitfeldern
« am: 24. September 2012, 21:53 »
Hallo,

beim Programmieren (ähm, vielmehr übertragen) der x64-Paging-Strukturen in meine Bitfelder bekomme ich leider ständig einen mir nicht ersichtlichen Fehler. (Wahrscheinlich total trivial und dumm, aber wie auch immer. Vier Augen sehen mehr als zwei!  :-D )

Code (gekürzt, das ganze gibts natürlich für jede Struktur, und Entschuldigung für die grauenhafte Formatierung, irgendwie funktionieren Tabs im Editor nicht):

typedef struct tag_pml4
{
uint64_t PML4_PRESENT : 1; // Zeile 60
uint64_t PML4_WRITE : 1;
uint64_t PML4_USER : 1;
uint64_t PML4_WRITETHRU : 1;
uint64_t PML4_NOCACHE : 1;
uint64_t PML4_DIRTY : 1; // Zeile 65
uint64_t : 3;
uint64_t PML4_3FREE : 3;
uint64_t PML4_PHYSADDR :40;
uint64_t PML4_11FREE :11; // Zeile 69
uint64_t PML4_NXE : 1; // 0 = EXE/ALLOWED 1 = EXE/FORBIDDEN
} pml4;

Output:

In file included from vmm.c:2:0:
paging.h:61:11: Fehler: expected identifier or »(« before numeric constant
paging.h:62:11: Fehler: expected identifier or »(« before numeric constant
paging.h:63:11: Fehler: expected identifier or »(« before numeric constant
paging.h:64:11: Fehler: expected identifier or »(« before numeric constant
paging.h:65:11: Fehler: expected identifier or »(« before numeric constant
paging.h:70:11: Fehler: expected identifier or »(« before numeric constant
paging.h:71:1: Warnung: kein Semikolon am Ende von »struct« oder »union« [standardmäßig aktiviert]

Kompiliert auf Ubuntu 12.04 LTS, gcc-Version 4.6.3 (Ubuntu/Linaro 4.6.3-1ubuntu5) mit folgenden Flags:

-Wall -Wextra -Wshadow -Wconversion -Wunreachable-code -Werror-implicit-function-declaration -Wuninitialized -nostdlib -nostartfiles -nodefaultlibs -ffreestanding -fno-builtin -m32 -g3 -O0 -c


Besonders die Warnung am Ende ist komisch - da ist doch ein Semikolon?!

Vielen Dank für eure Hilfe und sorry für meine Dummheit...
47
   push ebp
   push edi
   push esi
   push edx
   push ecx
   push edx


   push esp

   call handler_%1

   add esp, 0x4

   pop eax
   pop ebx
   pop ecx
   pop edx

   pop esi
   pop edi
   pop ebp

OMG. Peinlich, peinlich...
48
Hmm, Code entsprechend geändert. Triple fault leider immer noch da.  :-(

QEMU-Logfile:
Triple fault
CPU Reset (CPU 0)
EAX=ffffffff EBX=0000000d ECX=0000000d EDX=ffffff2d
ESI=0000000d EDI=0000000d EBP=00101218 ESP=00101000
EIP=001066a0 EFL=00000086 [--S--P-] CPL=0 II=0 A20=1 SMM=0 HLT=0
ES =0010 00000000 ffffffff 00cf9300 DPL=0 DS   [-WA]
CS =0008 00000000 ffffffff 00cf9a00 DPL=0 CS32 [-R-]
SS =0010 00000000 ffffffff 00cf9300 DPL=0 DS   [-WA]
DS =0010 00000000 ffffffff 00cf9300 DPL=0 DS   [-WA]
FS =0010 00000000 ffffffff 00cf9300 DPL=0 DS   [-WA]
GS =0010 00000000 ffffffff 00cf9300 DPL=0 DS   [-WA]
LDT=0000 00000000 00000000 00008200 DPL=0 LDT
TR =0008 00000580 00000067 00008900 DPL=0 TSS32-avl
GDT=     0010100d 00000017
IDT=     001066c4 00000187
CR0=00000011 CR2=00000000 CR3=00000000 CR4=00000000
DR0=00000000 DR1=00000000 DR2=00000000 DR3=00000000
DR6=ffff0ff0 DR7=00000400
CCS=ffffffff CCD=ffffffff CCO=ADDB   
EFER=0000000000000000
FCW=037f FSW=0000 [ST=0] FTW=00 MXCSR=00001f80
FPR0=0000000000000000 0000 FPR1=0000000000000000 0000
FPR2=0000000000000000 0000 FPR3=0000000000000000 0000
FPR4=0000000000000000 0000 FPR5=0000000000000000 0000
FPR6=0000000000000000 0000 FPR7=0000000000000000 0000
XMM00=00000000000000000000000000000000 XMM01=00000000000000000000000000000000
XMM02=00000000000000000000000000000000 XMM03=00000000000000000000000000000000
XMM04=00000000000000000000000000000000 XMM05=00000000000000000000000000000000
XMM06=00000000000000000000000000000000 XMM07=00000000000000000000000000000000

Mein Code:
lea ax, [%1]
and ax, 0xFFFF
mov word [edi], ax
mov word [edi+2], 0x08
mov byte [edi+4], 0x0
mov byte [edi+5], 0b10001110
lea eax, [%1]
shr eax, 0x10
and eax, 0xFFFF
mov word [edi+6], ax
add edi, 0x08

Memory-Dump. Einträge sind eigentlich gut zu sehen...
(qemu) xp /20xh 0x01066c4
00000000001066c4: 0x0a06 0x0008 0x8e00 0x0010 0x0a24 0x0008 0x8e00 0x0010
00000000001066d4: 0x0a42 0x0008 0x8e00 0x0010 0x0a60 0x0008 0x8e00 0x0010
00000000001066e4: 0x0a7e 0x0008 0x8e00 0x0010

Wahrscheinlich irgendein dummer Fehler, weil ich den Code so schnell zusammengeschrieben habe...
49
Den Reset gibt es nur bei eingeschalteten Interrupts. Ohne wird void main ordnungsgemäß aus geführt.
Heißt das, dass int 0x30 funktioniert und im richtigen Interrupthandler landet?
Nein.
Interruptflag nicht gesetzt -> void main wird ausgeführt (Text wird angezeigt)
Interruptflag gesetzt -> Triple Fault (egal ob mit oder ohne int 0x30)
Zitat
Als Codebasis habe ich eine Kombination von Lowlevel-Wiki-Tutorials, OS-Dev.org-Wiki-Tutorials und was man noch alles so im Netz findet.

%macro idtentry 1

dw ((%1 - $$) + SECTIONBASE) & 0xFFFF
dw 0x08
db 0x0
db 0b10001110
dw (((%1 - $$) + SECTIONBASE) >> 16) & 0xFFFF

%endmacro

Wo hast du das Makro her?
Eigenkreation. :-D Wegen dem SECTIONBASE, siehe auch z.B. hier
Zitat
Ich bezweifle nämlich, dass das funktioniert. Der Wert von SECTIONBASE müsste der Wert sein, an dem die .text-Sektion von loader.elf landet. Das ist nicht 0x100000, sondern sehr wahrscheinlich ein etwas höherer Wert, weil der ELF-Header noch davor kommt.

Ich würde dir dazu raten die IDT zur Laufzeit zu befüllen. (Oder zu überprüfen, ob diese vor dem Aktivieren der Interrupts tatsächlich korrekt befüllt ist.)
Hmm. Schade, wollte eigentlich gerne den IDT schon vorher "fest" haben, aber na ja. Ich höre auf den Rat des Meisters. :-D
50
Lowlevel-Coding / CPU-Reset (Triple Fault) bei Interrupts
« am: 10. June 2012, 17:44 »
Hallo liebe Lowlevel-Community!

Bereits vor etwa einem Jahr habe ich mich mit ein bisschen mit OS-Dev beschäftigt und hier auch schon eine Frage gestellt. Ein wenig später hab ich allerdings meine Ubuntu-Installation geschrottet. Neulich habe ich mir dann wieder Ubuntu eingerichtet und wieder begonnen.  :-D

Wie auch immer, ich stehe gerade vor einem (wahrscheinlich meiner unendlichen Dummheit zuzuschreibendem) Problem:
Nach Aktivierung der Interrupts mittels "sti" gibts einen Triple Fault -> CPU Reset. Leider lässt sich der Fehler schwer finden, denn gdb braucht offensichtlich Interrupts für Breakpoints.

Als Codebasis habe ich eine Kombination von Lowlevel-Wiki-Tutorials, OS-Dev.org-Wiki-Tutorials und was man noch alles so im Netz findet.

%macro idtentry 1

dw ((%1 - $$) + SECTIONBASE) & 0xFFFF
dw 0x08
db 0x0
db 0b10001110
dw (((%1 - $$) + SECTIONBASE) >> 16) & 0xFFFF

%endmacro

%macro handler 1
extern handler_%1
int_stub_%1:
push dword 0x0
push dword %1

push ebp
push edi
push esi
push edx
push ecx
push edx

push esp

call handler_%1

add esp, 0x4

pop eax
pop ebx
pop ecx
pop edx
pop esi
pop edi
pop ebp

add esp, 0x8

iret
%endmacro

%macro handler_errorcode 1
extern handler_%1
int_stub_%1:
push dword %1

push ebp
push edi
push esi
push edx
push ecx
push edx

push esp

call handler_%1

add esp, 0x4

pop eax
pop ebx
pop ecx
pop edx
pop esi
pop edi
pop ebp

add esp, 0x8

iret
%endmacro

%macro handler_irq_low 1
extern handler_%1
int_stub_%1:
push dword 0x0
push dword %1

push ebp
push edi
push esi
push edx
push ecx
push edx

push esp

call handler_%1

add esp, 0x4

pop eax
pop ebx
pop ecx
pop edx
pop esi
pop edi
pop ebp

add esp, 0x8

mov al, 0x20
out 0x20, al

iret
%endmacro

%macro handler_irq_high 1
extern handler_%1
int_stub_%1:
push dword 0x0
push dword %1

push ebp
push edi
push esi
push edx
push ecx
push edx

push esp

call handler_%1

add esp, 0x4

pop eax
pop ebx
pop ecx
pop edx
pop esi
pop edi
pop ebp

add esp, 0x8

mov al, 0x20
out 0xA0, al
out 0x20, al

iret
%endmacro

global loader
 
extern main

MODULEALIGN equ  1<<0                   ; align loaded modules on page boundaries
MEMINFO     equ  1<<1                   ; provide memory map
FLAGS       equ  MODULEALIGN | MEMINFO  ; this is the Multiboot 'flag' field
MAGIC       equ    0x1BADB002           ; magic number
CHECKSUM    equ -(MAGIC + FLAGS)        ; checksum

SECTIONBASE equ 0x0100000

section .text
align 4
    dd MAGIC
    dd FLAGS
    dd CHECKSUM
 
STACKSIZE equ 0x4000                    ; 16k
 
loader:
cli

mov esp, stack + STACKSIZE

lgdt [cs:GDTR]

jmp 0x08:shortjmp
shortjmp:

mov ax, 0x10
mov ds, ax
mov es, ax
mov fs, ax
mov gs, ax
mov ss, ax

lidt [cs:IDTR]

mov al, 0x11
out 0x20, al
call io_wait
mov al, 0x20
out 0x21, al
call io_wait
mov al, 0x04
out 0x21, al
call io_wait
mov al, 0x01
out 0x21, al
call io_wait

mov al, 0x11
out 0xa0, al
call io_wait
mov al, 0x28
out 0xa1, al
call io_wait
mov al, 0x02
out 0xa1, al
call io_wait
mov al, 0x01
out 0xa1, al
call io_wait

xor al, al
out 0x20, al
call io_wait
out 0xa0, al
call io_wait

sti

int 0x30 ; als Testinterrupt mit Textausgabe. Triple Fault gibts aber auch so (PIT)

    ;push eax                            ; Multiboot magic number
;push ebx                            ; Multiboot info structure

call main

hang:
hlt
jmp hang

io_wait:
jmp dly
dly: ret

handler 0
;...
handler 48

GDTR:
dw GDT_END-GDT-1
dd GDT
GDT:
dd 0x0, 0x0
db 0xFF, 0xFF, 0x0, 0x0, 0x0, 0b10011010, 0b11001111, 0x0
db 0xFF, 0xFF, 0x0, 0x0, 0x0, 0b10010010, 0b11001111, 0x0
;db 0xFF, 0xFF, 0x0, 0x0, 0x0, 0b11111010, 0b11001111, 0x0 ; zu Fehlersuchzwecken auskommentiert
;db 0xFF, 0xFF, 0x0, 0x0, 0x0, 0b11110010, 0b11001111, 0x0
GDT_END:

IDTR:
dw 49 * 8 - 1
dd IDT
IDT:
idtentry int_stub_0
;...
idtentry int_stub_48

section .bss
align 4
stack:
    resb STACKSIZE


Außerdem noch: kernel.c (mit void main, nichts besonderes) und handler.c (mit Handlern, derzeit ohne wirklichen Inhalt)
Wichtig! Verwendet wird SYSLINUX, nicht GRUB!  :wink:
Kompiliert mit
CC =gcc
CFLAGS =-Wall -Werror -Wextra -Wshadow -Wconversion -Wunreachable-code -Werror-implicit-function-declaration -Wuninitialized -nostdlib -nostartfiles -nodefaultlibs -ffreestanding -fno-builtin -m32 -g3
LDFLAGS =-m elf_i386
AS =nasm
LD =ld
 
all:kernel.bin
 
kernel.bin:
$(AS) -f elf -o loader.elf loader.S
$(CC) $(CFLAGS) -o kernel.elf -c kernel.c
$(CC) $(CFLAGS) -o handler.elf -c handler.c
$(LD) $(LDFLAGS) -T linker.ld -o kernel.bin loader.elf kernel.elf handler.elf
objcopy --only-keep-debug kernel.elf kernel.sym
objcopy --strip-debug kernel.elf
[...]

Der Linkerscript ist "Standard".

Zum Ausführen nehme ich eine Variante des folgenden Scriptes: wiki.osdev.org/Bare_Bones

Den Reset gibt es nur bei eingeschalteten Interrupts. Ohne wird void main ordnungsgemäß aus geführt.

Hoffe, ich habe mein Problem verständlich erklärt und keine Information vergessen.  :roll:
51
Offtopic / Re:C++ Linkerproblem
« am: 24. June 2011, 12:31 »
Hallo Hartmut,

anscheinend war einfach mein Visual Studio verka**t. Hab mir jetzt VC++ 2010 gesogen, vorerst keine Fehler beim Erstellen.
52
Offtopic / C++ Linkerproblem
« am: 23. June 2011, 19:32 »
Hi,

ich habe ein Problemchen mit dem C++-Linker. (MS VC++ 2008)
Hierzu muss ich sagen, dass ich noch nie in irgeneiner Form C++ programmiert habe, also Entschuldigung für diese Noob-Frage.

Folgendes Problem: Mein Linker erkennt die Ausgabedatei des Compilers nicht. (.obj)
Da bei der Fehlermeldung ein Pfad ohne Laufwerksbuchstaben steht, vermute ich deshalb, dass Windoof da irgendwie an einer Variable rumgepfuscht hat.

Wie kann man die Eingabedatei des Linkers ändern? Ich google schon 1 Stunde danach, und es gibt Antworten, wie man den Ausgabepfad etc ändern kann, aber nicht, wie man den Eingabepfad ändern kann, also ist die Lösung wahrscheinlich trivial. (Ist trivial das richtige Wort?)

Noch ein Paar Infos:
-Es ist ein PlugIn für ein MFC-Programm
-Einige Projektpfade enthalten Leerzeichen, aber wurde schon alles mit "" gelöst.

Danke schonmal im Voraus,
tiger717
53
Offtopic / Re:HTTP - Standard
« am: 18. June 2011, 12:03 »
Danke! Da hätte ich auch selber draufkommen können.
54
Offtopic / HTTP - Standard
« am: 18. June 2011, 11:07 »
Hallo,

ich habe mich in letzter Zeit mal etwas mit Netzwerk und Servern etc beschäftigt, und bin nun mal auf die Idee gekommen, einen kleinen Proxy selber zu programmieren (natürlich nicht in Asm  :-D )

Aber leider ist mir die Kommunikation doch etwas fraglich erschienen:
Zitat
HTTP/1.1 200 OK
Server: Apache/1.3.29 (Unix) PHP/4.3.4
Content-Length: (Größe von infotext.html in Byte)
Content-Language: de (nach RFC 3282 sowie RFC 1766)
Connection: close
Content-Type: text/html
(Beispiel von der HTTP-Seite auf Wikipedia)

a) Wird das alles wirklich so übertragen? Wenn ja, wo sind dann die eigentlichen Daten?
b) Welche (Text-)Kodierung wird hier benutzt? UNIX- oder Windows-Zeilenumbrüche?
55
Lowlevel-Coding / Re:C-Kernel ohne Multiboot
« am: 05. June 2011, 13:48 »
Ich behelfe mich zurzeit mit ld's Flags (--architecture=i386:i386 --entry=_start --output=elf32-i386 (Ich finde leider kein Kommando, um die Multiboot-Sektion in .text einzubinden, hab deshalb das ganze mal ohne eigene Sektion implentiert)

Mein alter Skript:
/*  Bei _start soll die Ausfuehrung losgehen */
ENTRY(_start)
OUTPUT_FORMAT(elf32-i386)
OUTPUT_ARCH(i386:i386)

/*
 * Hier wird festgelegt, in welcher Reihenfolge welche Sektionen in die Binary
 * geschrieben werden sollen
 */
SECTIONS
{
  /*
   * . ist die aktuelle Position in der Datei. Wir wollen den Kernel wie gehabt
   * an 1 MB laden, also muessen wir dort die erste Sektion hinlegen
   */
  . = 0x100000;

  /*
   * Der Multiboot-Header muss zuerst kommen (in den ersten 8 kB).
   * Die Standardsektionen einfach hintereinander weg einbinden.
   */
  .text : {
    *(multiboot)
    *(.text)
  }
  .data ALIGN(4096) : {
    *(.data)
  }
  .rodata ALIGN(4096) : {
    *(.rodata)
  }
  .bss ALIGN(4096) : {
    *(.bss)
  }
}

GRUB gibt Error 28 (Item can't fit into memory). Komisch, eigentlich ist die Datei sogar noch kleiner als zuvor...

EDIT: Ich Depp! Hab glatt -Ttext vergessen ... gleich mal korrigieren.
EDIT2: Ok, vergesst das mit Error 28. Funzt jetzt.
56
Lowlevel-Coding / Re:C-Kernel ohne Multiboot
« am: 05. June 2011, 12:17 »
Aha:

http://old.nabble.com/-Bug-ld-12613--New%3A-Undetected-buffer-overflow-occurs-in-ld-when-supplied-with-malformed-file-as-a-linker-script-td31262074.html
http://sourceware.org/bugzilla/show_bug.cgi?id=12613

Zitat
when *what in hex is greater than 0x7F, the corresponding unsigned integer
value is very large, and hence the octal representation does not fit within 3
bytes of buf, causing the overflow of buf.

E.g. when *what = 0x80; the corresponding unsigned int value is 4294967168,
with corresponding octal value being 37777777600.

Ich nutze des öfteren "unsigned char"-Umwandlungen, vielleicht muss ich den Code noch mal überarbeiten.
57
Lowlevel-Coding / Re:C-Kernel ohne Multiboot
« am: 05. June 2011, 08:51 »
Ich habe jetzt mal meinen Linkerscript voll auskommentiert, aber trotzdem macht ld wieder Zicken, d.h. der Fehler muss mit der Flag (-T kernel.ld) zusammenhängen. Aber kann das wirklich sein? Gibt es vielleicht noch eine zweite kernel.ld, die ich nicht kenne? :-D
58
Lowlevel-Coding / Re:C-Kernel ohne Multiboot
« am: 31. May 2011, 19:57 »
Nein, Riesen-Schildkröten in der OS-Dev Branche wird es nie geben!
59
Lowlevel-Coding / Re:C-Kernel ohne Multiboot
« am: 31. May 2011, 19:32 »
Hrmpf. Wenn mir binutils und gcc bis dahin nicht den letzten Nerf rauben und ich endlich diese Wrap-around-Funktion zum Laufen kriege. Aber naja, wahrscheinlich heul ich dann schon in einem neuen Thread das Forum mit meinen Problemen voll. Die Welt ist zu kompliziert, aber 13jährige haben bekanntlich auch ein anderes Bild von der Welt...
60
Lowlevel-Coding / Re:C-Kernel ohne Multiboot
« am: 31. May 2011, 13:17 »
hab openSUSE 11.4, aber gcc und binutils selber kompilieren? Das überlass ich lieber Richard Stallmann ^^
Seiten: 1 2 [3] 4 5

Einloggen