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

Seiten: 1 [2] 3 4 ... 28
21
Lowlevel-Coding / Re: Bandlaufwerk (Floppy-Streamer)
« am: 15. January 2014, 16:28 »
Ahh, dann ist Floppy-Streamer doch keine allgemeine Bezeichnung für ein Bandlaufwerk, hatte dich irgendwie so verstanden.

In Unserem Wiki findest du unter FDC bei den Weblinks einen Datenblatt zu einem FD-Controller. Das könnte dir dann eventuell weiter helfen.
22
Lowlevel-Coding / Re: Bandlaufwerk (Floppy-Streamer)
« am: 15. January 2014, 00:24 »
Habe mich mit Bandlaufwerken noch nicht beschäftigt.
Linux hat aber einen "SCSI Tape Driver". https://www.kernel.org/doc/Documentation/scsi/st.txt

Vielleicht hilft es dir also wenn du in richtig SCSI suchst.
23
Lowlevel-Coding / Re: Floppy Kabel für 5'25 Zoll gesucht
« am: 15. January 2014, 00:08 »
Es ist 36polig. und hängt nicht an dem IDE Steckplätze für Festplatten oder CD-Laufwerke!
IDE ist es nicht, sieht aber ähnlich aus. Es ist etwas schmäler, wenn ich mich richtig erinnere.
24
Lowlevel-Coding / Re: Rückkehr aus Task mit IRET geht nicht
« am: 13. January 2014, 23:38 »
Ist es denn Tatsächlich das IRET an 0x8259?

Wie sieht den das ende deiner "prints" aus. Nutzt tu tatsächlich "ret 4" (eher Unüblich), oder machst du dir in deinem Task den ganzen Stack kaputt weil du
die Parameter nicht mehr runter holst? Die meisten folgen hier der C-Calling-Convention wonach der Caller den Stack aufräumt, das machst du aber offensichtlich nicht.

Der Fehler-Code bei einem #GP ist die Segmentselektor, die den Fehler verursacht hat. Ist das tatsächlich 0 oder ist die Angabe eventuell Fehlerhaft? (Wenn du einen Call ins Datensegment machst, sollte der data-segmentselektor angegeben werden)
25
Lowlevel-Coding / Re: Rückkehr aus Task mit IRET geht nicht
« am: 10. January 2014, 00:17 »
Auf eine IDT habe ich der Einfachheit halber verzichtet
Der Einfachheit halber hättest du das besser nicht getan. Ein einfacher Handler der dir die für die ersten 32 Interrupts seine Nummer, die Rücksprung Adresse(also etwa da wo der Fehler aufgetreten ist) und den alten Stackpointer ausgibt machen dir das Leben sehr viel leichter. Vor allem wenn dir dein Emulator das nicht liefert.

Und ein vollständiger Registerdump macht das Suchen nach dem Fehler dann evtl. noch ein ganzes Stück einfacher.

Bastel dir also einen Screen of Death, entnimm die Daten den logs von Virtual PC (falls der so etwas loggt) oder nutze qemu -d int -hda disk.img
(könnte sein das unter Windows die Parameter für Qemu nicht ganz reichen.)

Und lass uns wissen was du so für Werte hast wenn dein Kernel den Geist auf gibt. Sich so ganz ohne, durch Assemblercode durch zu denken, macht nicht sonderlich viel Spaß.
26
Lowlevel-Coding / Re: Rückkehr aus Task mit IRET geht nicht
« am: 09. January 2014, 12:08 »
Hallo supernicky
Willkommenen im Forum.

Interessant wäre natürlich welche Exception ausgelöst wird.
Und dann ist das passende Gegenstück zu einem CALL ein RET (und kein InterruptRETurn).

27
Offtopic / Re: Warning: empty character constant ?
« am: 13. December 2013, 14:19 »
Die Bezeichnung Stringliteral ist hier einwenig irreführend. Mein g++ spricht von string constant. Das Problem ist das ein "String wie dieser" konstant ist, und der korrekte Type const char* ist.

Folgender code segfaultet z.B. weil "abc" in einer read-only section liegt. (g++ meckert, gcc nicht)
int main() {
  char* a = "abc"
  a[0] = 'b';
  return 0;
}
28
Lowlevel-Coding / Re: grub2 memorymap trouble
« am: 02. December 2013, 20:51 »
Tut nicht auch einfach folgendes was du willst.
ulong entryAddr = cast(ulong)(&memMap.entries);
Das ist weniger fehleranfällig oder meinst du nicht?
29
Lowlevel-Coding / Re: Befehl zum Graphikspeicherrefreshen
« am: 27. October 2013, 15:18 »
Warum markierst du die Funktionen in Console.bas als extern "C"? Werden die von C oder ASM code aus aufgerufen?
Steht das extern "C" auch in Console.bi? Sonst denkt dein Compiler vermutlich er müsste clsc() in der init() mit der FreeBasic-Calling-Convention aufrufen, dabei hast du sie ja als extern "C" compiliert.
30
Lowlevel-Coding / Re: Startgerät beim CDI-Treiber?
« am: 23. October 2013, 22:40 »
Zitat
Ja. Siehe Wiki:Multiboot
Und was soll ich damit dann? Das ist doch genau die Signatur, die das BIOS zurückgibt.
Ich dachte danach hättest du gefragt. Mehr kann Grub vermutlich nicht. Zumindest wird für linux das root-laufwerk immer explizit in der Konfiguration (menu.lst/grub.cfg) angegeben. Entweder per kernel spezifischer laufwerks bezeichnung (/dev/sda bzw. /dev/hda) oder auch per UUID. In letztem Fall müssen dann alle Laufwerke abgesucht werden bis eines mit der passen ID gefunden wurde.

Edit:
Aber Multiboot scheint dir ja nicht nur die BIOS-Nummer des Bootlaufwerkes zu geben sondern zusätzlich auch noch die dazugehörigen IO-Ports. (mbs_drives_addr) Es hat zwar nicht jedes ATA-Laufwerk seine eigenen Ports aber mit der BIOS-Nummer zusammen lässt sich damit vermutlich das Laufwerk ziemlich genau bestimmen.
31
Lowlevel-Coding / Re: Startgerät beim CDI-Treiber?
« am: 23. October 2013, 18:45 »
Ja. Siehe Wiki:Multiboot
32
Lowlevel-Coding / Re: AHCI - HBA, mögliche Registerwerte
« am: 23. October 2013, 18:42 »
Wenn du nicht mit Segmentierung und/oder Paging die virtuelle Adresse irgendwo anders hinmappst, müsste dein Code so passen. (Caching abzuschalten ist evtl. auch eine gute Idee)

Und wenn es Port Multiplier gibt sehen die Werte doch gar nicht mehr sooo falsch aus. Das Kapitel über Port Multiplier habe ich mir jetzt allerdings nicht durchgelesen.

Was das ISS angeht, ist das natürlich auch von der passenden spec abhängig, welche werte gültig sind (wobei sich da nicht viel getan hat; 0x3 ist seit rev0.95 dazugekommen). Falls der Wert trotzdem noch nicht passt kann es natürlich auch am assembler liegen; Assembler ist ja nicht gerade dafür bekannt das es besonders übersichtlich ist:
ISS := (HBA.CAP >> 20) & 0xf
mov esi, dword[ HBA_BAR5 ]      ; in der Variablen HBA_BAR5 steht die physische Addresse des HBA, das heißt in esi steht nun 0xFBB00000
mov eax, dword[ esi ]           ; Lade das CAP register nach eax
mov edx, eax   
and eax, 0x1F                   ; EAX := NP
shr edx, 0x14
and edx, 0xf                    ; EDX := ISS
33
Lowlevel-Coding / Re: AHCI - HBA, mögliche Registerwerte
« am: 22. October 2013, 08:39 »
Habe eigentlich keine Ahnung von AHCI, aber hab mir gerade mal die Spec angeschaut.

Erst mal: Welche Adresse hast du denn für die HBA-Register (BAR5)

Dann: wie liehst du HBA.CAP aus und wie extrahierst du daraus NP. ( NP := HBA.CAP & 0x1f )

Von welchem HBA-Register redest du im letzten Satz? Was ist der Wert für HBA.PI?

Und was für eine AHCI Version bekommst du aus der HBA.VS
34
Lowlevel-Coding / Re: FASM-Portierung
« am: 29. August 2013, 12:23 »
Vermutlich meint er die entry-Direktive.
35
Lowlevel-Coding / Re: Seltsamer Pagefault
« am: 21. August 2013, 22:42 »
Code: (freebasic) [Auswählen]
asm
mov eax, dword ptr [v_addr]
invlpg [eax]
end asm
Damit funktioniert es jetzt, ich hoffe dass es jetzt nicht auf irgendeine andere Weise falsch ist.
Es sieht Korrekt aus. Der Compiler scheint ja alle im ASM block verwendeten Register automagisch zu sichern.
Zitat
Schon mal vielen Dank für die Hilfe, aber darf ich dich noch fragen, wie du so etwas debuggst? Du hast ja vermutlich QEMU + GDB benutzt, aber benutzt du da eine GUI für GDB?

Ja. Mit Qemu und GDB, aber ohne GUI.
qemu-system-x86_64 -cdrom frost.iso -s -S # startet QEMU mit GDB-SERVER und wartetsrc/kernel$ gdb --tui frost.krn
target remote localhost:1234    (mit Qemu verbinden)
break ELF::LOAD_IMAGE
c
Und dann kannst du mit s / n durch den code steppen, mit print VAR variablen ausgeben lassen, und parallel in QEMU die register ausgeben.
(Du must fast alle Labels in deinem Kernel GROß-Schreiben)

Um meinen Verdacht zu überprüfen habe ich deinen kernel mit "objdum -d" disassembliert und einen breakpoint mit 'break *0x0123' an der Adresse der invpg-Instruktion gesetzt und mir in Qemu die Register angeguckt.

Alles andere kannst du dir sicher mit Google und dem Wiki (QEMU GDB) selbst aneignen.
36
Lowlevel-Coding / Re: Seltsamer Pagefault
« am: 21. August 2013, 14:27 »
Bin gerade dabei mir das mal Genauer anzugucken. Was ich kurioses gefunden habe ist, dass dein memcpy die erste PAGE nicht beschreibt.

Also vor dem 'rep movsb' befehl stimmt alles, der sollte nach 0x7000 schreiben, aber danach ist 0x7000 laut QEMU weder Dirty/ noch Accesed, 0x8000 dafür aber schon.
0x7000 wird einfach übersprungen.

BTW: in der pmm::alloc könnte eventuell auch ein if bitmap(counter) == 0 zu besserer Performance beitragen. Ist mir so beim singlesteppen aufgefallen.

EDIT: Also meine Vermutung ist das etwas mit dem INVALPG beim mappen schief geht, und an ein veraltetes mapping geschrieben wird. (Fals QEMU mit info tlb, nicht den TLB sondern das normale Mapping ausgibt wie es in der Beschreibung steht).
Das kann ich leider nur sehr schwer überprüfen weil die Sourcen im Repository(1c6bf59d20…) scheinbar nicht 100%ig mit dem ISO zusammen passen. GDB spring bei mir zumindest in der VMM.pas wirr in irgenwelchen Zeilen herum in denen kein code steht.

EDIT2:
Ich glaube ich habe das problem gefunden.

du rufst
asm invlpg [v_addr]auf. Damit Invalidierst du die Speicherseite die die Variable V_ADDR enthält, nicht die Adresse die in V_ADDR drin steht. (Also das tut zumindest die Binärversion im ISO)
37
Lowlevel-Coding / Re: Problem mit Paging
« am: 14. August 2013, 18:29 »
Kann man das Optimierlevel eigentlich für einzelne Funktionen ändern? (#pragma oder so)
Scheint so: http://stackoverflow.com/questions/2219829/how-to-prevent-gcc-optimizing-some-statements-in-c#answer-2220565
38
Lowlevel-Coding / Re: Problem mit Paging
« am: 12. August 2013, 16:15 »
Die Funktion setPML4Entry() funktioniert richtig.
Dann würde ein zugriff auf die besagte Adresse keinen #PF auslösen, (zumindest nicht wenn man nach dem Aufruf ohne weiteres auf die neu gemappte adresse zugreifen können sollte).

Ich nehme an du hast am ende der Funktion einen wenig inline-asm ohne volatile, der wegoptimiert wird. Aber das ist jetzt geraten.
39
Lowlevel-Coding / Re: Problem mit Paging
« am: 12. August 2013, 09:50 »
Auf welche nicht vorhandene Adresse will er den Zugreifen? (steht bei der exception in cr2 )
Mir sieht der Code Korrekt aus, wenn VMM_PML4_ADDRESS = 0xFFFFFFFFFFFFF000; gewollt ist. (Die AssemblerZeile enspricht PML4->PML4e[PML4i]; mit rax = PML4i)
Das wird auch die Adresse sein die nicht gemapt ist, oder?

Dein Fehler wird wohl beim mapping liegen.
Also in der 'setPML4Entry' wenn ich dessen Funktion richtig deute.

sind VMM_POINTER_TO_PML4 und VMM_PML4_ADDRESS das gleiche?
40
Lowlevel-Coding / Re: kbc hilfe
« am: 11. August 2013, 15:44 »
streetrunner hat dir schon geschrieben wie es geht.

Abgesehen von der Möglichkeit Daten über die Register zu übergeben, hast du auf einem x86 aber auch keine "No-Write-Down"-Police. Es hindert dich also auch niemand daran, vom Kernel aus direkt in den Userspace zu schreiben, wenn du das willst.
Seiten: 1 [2] 3 4 ... 28

Einloggen