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

Seiten: 1 2 3 [4] 5 6 ... 8
61
Naja, irgendwie habe ich es nicht geschafft in qemu mit Symbolen zu loggen. Abgesehen davon habe ich mir zuerst mein /tmp gefüllt und mein System gecrasht, bevor ich die glorreiche Idee hatte ein loop device zu mounten xD
62
Wenn qemu mit der Meldung "qemu: fatal: Trying to execute code outside RAM or ROM" abstürzt gibt es keine Möglichkeit mehr mit gdb ein backtrace zu bekommen. Um dennoch ein backtrace zu bekommen, habe ich folgendes bash-script geschrieben:#!/bin/bash

gdb="gdb bin/kernel.bin --eval-command=\"set pagination off\" --eval-command=\"set confirm off\" --eval-command=\"target remote localhost:1234\""


echo "" > debug_backtrace_list


echo "# list functions..."
list="$(eval gdb bin/kernel.bin --batch --eval-command=\"set pagination off\" --eval-command=\"info functions\")"


echo "# generate break commands..."
while read line
do
line2=$(echo "$line" | grep -oP '((?<= )|(?<= \*))\w+(?=\()')
if [ "$line2" != "" ]
then
echo -ne "break $line2\ncommands\nbt\ncontinue\nend\n" >> debug_backtrace_list
fi
done <<< "$list"


echo "# run gdb..."
eval "$gdb --command=debug_backtrace_list --eval-command=\"continue\" $@" | tee -a debug_output


echo '# done'

qemu wird im Vorfeld gestartet mit
qemu-system-i386 -kernel bin/kernel.bin -s -S
Damit wird bei jedem Aufruf einer Funktion ein backtrace erstellt. Eventuell macht es noch Sinn, bestimmte Funktionsnamen auszulassen, wie bspw. putc.
63
 $ sudo apt-get update
$ sudo apt-get install qemu-kvm
64
Lowlevel-Coding / Re: qemu ACPI
« am: 02. June 2012, 22:19 »
?? Seltsam, jetzt findet es 0xfd910.
65
Lowlevel-Coding / qemu ACPI
« am: 02. June 2012, 22:09 »
Ich kann den RSDP weder im EBDA noch im BIOS area finden. Ich habe auch schon die ganzen ersten 16MB nach "RSD PTR " gescannt - kein Ergebnis. Ich starte mit qemu -kernel. Wer weiss bescheid?
66
Lowlevel-Coding / Re: Sprung in den RealMode
« am: 02. June 2012, 21:50 »
Und wieder mal hab ich die Doku, die ich selbst verlinkt habe, nicht richtig gelesen
Das beunruhigt dich? Ich kann einen Abschnitt 20x lesen und immer noch nicht verstanden haben.
67
Softwareentwicklung / Re: GNU ld workarounds
« am: 28. May 2012, 23:27 »
OK, version 2.22 behebt die Probleme.
68
Softwareentwicklung / GNU ld workarounds
« am: 28. May 2012, 22:54 »
Wer mit GNU ld linkt (und das ist wahrscheinlich bei der Arbeit mit bspw. Linux), trifft möglicherweise auf einen der beiden Bugs, welche mir seit gestern auf den Geist gehen:

1. ld sagt "undefined reference to X", beim Verlinken eines stub sagt es "multiple definition of X".
Workaround: Die Referenz war eigentlich vorhanden, deshalb auch die mehrfache Definition, einfach die object files mit der vermeintlich undefinierten Referenz aus dem Linkvorgang nehmen.

2. ld sagt bei Erzeugung eines binary output files:
"ld: reopening o: No such file or directory

ld: final link failed: No such file or directory
"
oder "ld: final link failed: File truncated".
Workaround: ld scheint ein Limit für die Gesamtgröße der Inputfiles zu haben. Entweder die größten object files rausnemen oder ein anderes Format erzeugen.

Mein binutils hat die Version 2.20.1-system.20100303

Falls jemand anderes vor den selben Problemen steht, sollte er diesen Thread mit der Suchfunktion finden können.
69
Lowlevel-Coding / Re: qemu -kernel
« am: 27. May 2012, 14:45 »
hab mir eine version 1.0.93 gebaut (qemu-1.1.0-rc3). damit gehts thx
70
Lowlevel-Coding / Re: qemu -kernel
« am: 27. May 2012, 10:46 »
D.h. es liegt möglicherweise an der qemu-version? Habs aus dem ubuntu repository (glaub 10.4).
71
Lowlevel-Coding / Re: qemu -kernel
« am: 26. May 2012, 23:20 »
Vielen Dank für den Tipp mit den Labels. Da ich ld verwende, brauche ich kein ORG. Die Labels habe ich mit extern importiert. Leider selbes Ergebnis wie vorher.

ldconfig:
OUTPUT_FORMAT(binary)

SECTIONS
{
. = 0x00100000;

.text :
{
_text = .;
*(.text)
}

.rodata :
{
*(.rodata)
}

.data :
{
*(.data)
_edata = .;
}

.bss :
{
_sbss = .;
*(COMMON)
*(.bss)
_ebss = .;
}
}

init.asm [diff]:
5,8c5,8
< MBHDR equ 0x00100000
< START equ 0x00100000
< END_1 equ 0
< END_2 equ 0
---
> MBHDR equ _text
> START equ _text
> END_1 equ _edata
> END_2 equ _ebss
10a11,13
> extern _text
> extern _edata
> extern _ebss

Wie ist das, ich hatte den Thread versehentlich im falschen Board gepostet - kann er verschoben werden?
Hier ist doch okay, oder nicht? Wo willste ihn denn hin haben?
Nun, in der Beschreibung zum Board "Softwareentwicklung" steht: "Hier sind Fragen und Diskussionen zu Programmiersprachen, Compilern, Emulatoren, Versionskontrollsystemen und sonstigem Handwerkszeug im Bezug auf Lowlevel-Entwicklung richtig aufgehoben.". Nachdem ich das gelesen hatte, dachte ich, dass der Thread dort vielleicht besser aufgehoben wäre und habe zuerst auf "Moderator informieren" geklickt.
72
Lowlevel-Coding / Re: qemu -kernel
« am: 26. May 2012, 21:47 »
init.asm
MAGIC equ 0x1BADB002
FLAGS equ (1 << 0) | (1 << 16)
CHECK equ -(MAGIC + FLAGS)

MBHDR equ 0x00100000
START equ 0x00100000
END_1 equ 0
END_2 equ 0
ENTRY equ init

extern driver_demo

section .text
dd MAGIC
dd FLAGS
dd CHECK

dd MBHDR
dd START
dd END_1
dd END_2
dd ENTRY

init:
;sti
;int 8

cli
mov esp,stack

mov dword[0xB8000+(2*80+2)*2],'WpOp'
mov dword[0xB8000+(2*80+4)*2],'RpKp'
mov dword[0xB8000+(2*80+6)*2],'Sp!p'
;call driver_demo

cli
hlt

section .data
end_stack:
times 4096 db 0
stack:
hexdump:
00000000  02 b0 ad 1b 01 00 01 00  fd 4f 51 e4 00 00 10 00  |.........OQ.....|
00000010  00 00 10 00 00 00 00 00  00 00 00 00 20 00 10 00  |............ ...|
00000020  fa bc 48 10 10 00 c7 05  44 81 0b 00 57 70 4f 70  |..H.....D...WpOp|
00000030  c7 05 48 81 0b 00 52 70  4b 70 c7 05 4c 81 0b 00  |..H...RpKp..L...|
00000040  53 70 21 70 fa f4 00 00  00 00 00 00 00 00 00 00  |Sp!p............|
00000050  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
*
00001040

mbchk:
bin/kernel.bin: The Multiboot header is found at the offset 0.
bin/kernel.bin: Page alignment is turned on.
bin/kernel.bin: Memory information is turned off.
bin/kernel.bin: Address fields is turned on.
bin/kernel.bin: All checks passed.

mit qemu -cdrom geht alles wunderbar (ich nehme kein -fda wg. imagegröße und kein -hda da partitionieren par bashscript ein graus ist.):
cp bin/kernel.bin cdrom_files
mkisofs -R -b boot/grub/stage2_eltorito -no-emul-boot -boot-load-size 4 -boot-info-table -o cdrom.iso cdrom_files
qemu -no-kvm -cdrom cdrom.iso

mit qemu -no-kvm -kernel bin/kernel.bin kommt allerdings nur:
Starting SeaBIOS (version 0.5.1-20100120_010601-rothera) ich verwende qemu version 0.12.3 .

Wie ist das, ich hatte den Thread versehentlich im falschen Board gepostet - kann er verschoben werden?
73
Lowlevel-Coding / qemu -kernel
« am: 25. May 2012, 01:41 »
Laut Qemu-Doku kann man mit -kernel multiboot images laden. Meine kernel.bin ist eine flat binary mit address fields und wird als GRUB image mit -fda geladen, mit -kernel nicht. /boot/memtest86+.bin hat laut mbchk keinen multiboot header, wird aber trotzdem gestartet. Wer weiss bescheid?
74
Lowlevel-Coding / Re: APIC FIFO size
« am: 30. April 2012, 11:29 »
Es sollte immer nur eine ISR exklusiv und in der Reihenfolge des Auftretens ausgeführt werden. Im Endeffekt wird es darauf hinauslaufen, dass ich keine Software-Interrupts, sondern ausschließlich IPIs verwende.

Im Wiki ist APIC/SMP noch etwas oberflächlich behandelt. Evtl. kann man einen Verweis auf das Tutorial aus meinem ersten Posting einfügen. Es beschreibt leider nur theoretisch und hat keine Code-Beispiele, hat einer guten (kompakten) SMP bootstrap code, evtl. aus einem der Kernel-Projekte im Wiki? Ich frage mich bspw., ob man Code aus GRUB verwenden kann, da jeder AP im RM startet.
75
Offtopic / Re: GPL Copyleft
« am: 30. April 2012, 09:45 »
Ich glaube ich werde den Kernel mit der Schnittstelle auf der einen Seite und den Proxy unter GPL auf der anderen Seite jeweils separat anbieten. So kann man genau diesen Proxy nutzen oder jeden beliebigen anderen.

Ich hatte auch versucht mir etwas einfallen zu lassen, um die Schnittstelle so weit zu reduzieren, dass "Funktionsaufrufe und gemeinsame Nutzung komplexer Datenstrukturen" vermieden wird, was sich bei Hardware-Treibern jedoch quasi unmöglich gestaltet. Mein zweiter Versuch war etwas über Dienstprogramme pro Treiber zu konstruieren, welche während des Bootvorgangs im Proxy registriert werden und ihrerseits wiederum unter der GPL stehen. Dieses könnte bspw. ein Dienst sein, der Audiodaten entgegennimmt und and die Soundkarte weiterreicht. Ist mir aber bereits zu schwergewichtig und ändert nichts am Datenpfad.
76
Offtopic / GPL Copyleft
« am: 29. April 2012, 16:08 »
Ich würde gerne für alle Peripherie ( (S)ATA, Netzwerk, 3d-beschleuniger) und Bussysteme (PCI, USB, diverse *HCI) die treiber aus dem Linux-Projekt nehmen (/drivers). Um meinen kernel nicht sofort unter GPL zu stellen, möchte ich eine art treiber-proxy dazwischen legen und nur die original linux treiber veröffentlichen, ist das OK ?

Der Proxy steht dabei selbst unter der GPL und wird ordnungsgemäß veröffentlicht. Der kernel kommuniziert über ein Interface mit dem Proxy, so, als ob es ein Dienstprogramm wäre. Für die Architektur fallen mir 3 Wege ein: A: der Proxy importiert den unmodifizierten sourcecode und transformiert ihn, B: der Proxy kompiliert die treiber mit GCC und transformiert den Objektcode, C: der Proxy reproduziert die Linux-Kernel-Umgebung und verlinkt dagegen.

Da auch unter Windows GPL-Programme laufen, der NT-Kernel jedoch nicht unter der GPL veröffentlicht wurde, vermute ich damit keine Probleme. Gibt es hier Lizenz-Spezialisten, bzw. was haltet ihr allgemein von der Idee?
77
Lowlevel-Coding / Re: APIC FIFO size
« am: 28. April 2012, 16:33 »
Softwareinterrupts, die in einer Queue landen bzw. irgendwas mit APIC zu tun haben? Das ist mir neu. Was passiert da?

Nun, irgendwo müssen die Interrupts wohl in einer Art Queue gehalten worden sein, so dass diese nach dem STI jeweils den Aufruf ihrer ISR bewirken. In wie weit dies mit Bochs zusammenhängt und ob es mit IRQs/IPIs entsprechend funktioniert, muss ich noch prüfen. Ist vielleicht noch hilfreich zu erwähnen, dass ich bisher noch mit dem alten PIC arbeite.

Edit: seltsam, ich hätte schwören können, nach CLI keine Interrupts mehr empfangen zu haben. Ändert jedoch nichts an der eigentlichen Problemstellung. Zumindest was IRQs und IPIs betrifft.

Zum genaueren Verständnis: Die Queue wird atomisch vom Hauptteil der ISR, welche für alle ISR gleich  ist in die Queue geschrieben und im Scheduler beim Taskwechsel (bzw. bei mir im Hypervisor vor jedem Code-Block) atomisch gelesen und abgearbeitet. Mit diesem Prinzip würde ich dann ggf. eine zentrale Methodik zur Synchronisation relaisieren.

Wäre natürlich denkbar, dass sich die Queue-Register bzw. ihre Speicherlayouts je nach CPU-Modell unterscheiden. Falls irgendjemand, der den Thread liest genaue Zahlen hat, bitte hier posten!!!
78
Lowlevel-Coding / Re: APIC FIFO size
« am: 28. April 2012, 02:16 »
Ich möchte IPC und Synchronisation über IPIs realisieren, indem alle Interrupts in Queues geschrieben werden. Softwareseitig denke ich an 64k slots in einem Ringspeicher. Wäre natürlich nett zu wissen, wie groß der APIC Queue genau ist, um im Zweifelsfall das Protokoll auf wiederholtes Senden der Requests auszulegen.

In "Intel(R) 64 and IA-32 Architectures Software Developer's Manual, Volume 3A" (ftp://download.intel.com/design/processor/manuals/253668.pdf),
steht auf Seite 503:
Zitat
3. If the local APIC determines that it is the designated destination for the interrupt
but the interrupt request is not one of the interrupts given in step 2, the local
APIC looks for an open slot in one of its two pending interrupt queues contained
in the IRR and ISR registers (see Figure 10-20). If a slot is available (see Section
10.8.4, “Interrupt Acceptance for Fixed Interrupts”), places the interrupt in the
slot. If a slot is not available, it rejects the interrupt request and sends it back to
the sender with a retry message.

und auf Seite 506:
Zitat
If more than one interrupt is generated with the same vector number, the local APIC
can set the bit for the vector both in the IRR and the ISR. This means that for the
Pentium 4 and Intel Xeon processors, the IRR and ISR can queue two interrupts for
each interrupt vector: one in the IRR and one in the ISR. Any additional interrupts
issued for the same interrupt vector are collapsed into the single bit in the IRR.
For the P6 family and Pentium processors, the IRR and ISR registers can queue no
more than two interrupts per priority level, and will reject other interrupts that are
received within the same priority level.

Was ganz danach aussieht, als ob die Länge der Queue 2 wäre.

naja, Bochs liefert mir für
cli
mov ecx,0xFFFF
loop1:
int INTERRUPTNUMMER
loop loop1
sti
64k interrupt-nachrichten und eine Queue overflow warnung xD
79
Lowlevel-Coding / APIC FIFO size
« am: 27. April 2012, 13:20 »
Weiss jemand das Limit der Warteschlange für Interrupts im Local APIC? Also wenn
  • IF gelöscht wird (mit CLI bzw. in einer Interrupt-Gate-ISR),
  • daraufhin IRQs oder IPIs auftreten, bevor
  • IF wieder gesetzt wird (mit! STI bzw. beim Verlassen der ISR), so dass
  • die aufgetretenen Interrupts der Reihe nach abgearbeitet werden?
Die Spezifikationen von Intel geben leider keine Auskunft darüber.

Btw: Weiss jemand ein gutes Tutorial für SMP/APIC bootstrapping? Ich habe dieses hier gefunden: http://www.cheesecake.org/sac/smp.html
80
OS-Design / Re: Monotholitisher Kernel oder Microkernel
« am: 28. March 2012, 18:22 »
Microkernel!
Seiten: 1 2 3 [4] 5 6 ... 8

Einloggen