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

Seiten: 1 2 [3] 4 5 6
41
Also ich denke, es ist beides in etwa gleich schwer. Entscheidend ist dabei aber auch das persönliche Interesse bzw. die Begabung für das eine oder andere. Momentan scheint man mit OS-Dev jedoch besser bedient was Quellen anbelangt (lowlevel, osdev.org, osdever.net usw.), als ich mich mal etwas nach dem Thema Compiler umgesehen habe, konnte ich nicht allzu viel finden.
Ich finde auch, dass man bei einem OS schneller einen Einblick bekommt, wenn man den Source eines "großen" OS durchsieht. Mich etwas im Linux-Kernel umzusehen fiel mir deutlich leichter als den Code des FreeBASIC-Compilers zu kapieren.
Letztendlich sehe ich aber keine wirkliche Relevanz hinter der Frage. Entscheidend, ob man sich mit dem einen oder anderen beschäftigt, sollte vor allem das persönliche Interesse sein. Wobei ich allerdings davon abrate, sich mit beidem zur gleichen Zeit zu beschäftigen ;)
42
OS-Design / Ebenen der Speicherverwaltung
« am: 14. July 2011, 01:58 »
So, ich arbeite ja mometan wieder an meinem Microkernel, der ja diesmal etwas mehr können soll als nur einen test-task auszuführen ;)
Momentan hängt es noch ein wenig bei der Speicherverwaltung. So wie ich das sehe kann man die ja eigentlich in drei Ebenen unterteilen:
1. PMM: Er kümmert sich einfach nur um das zuteilen und freigeben von 4KB-Blöcken. Das setze ich momentan mit einer Bitmap um.
2. Paging: Kümmert sich im Prinzip nur um das Mapping. Bei mir bekommen sämtliche paging-Funktionen die Adresse des page-directories übergeben. Falls da irgendwo Platz gebraucht wird, wird mit Hilfe des PMM Speicher geholt. Außerdem besitzt mein Code eine Funktion um virtuelle in physikalische Adressen umzurechnen und mappt den Kernel in jeden Adressraum.
3. VMM: Ja, gute Frage. Keine Ahnung. Rein theoretisch könnte man ja einfach auf PMM und paging zurückgreifen: Man holt per PMM einen 4KB-Block, mappt ihn an eine freie Stelle in den Adressraum und gibt dann die Stelle im Adressraum zurück. Wäre vermutlich am einfachsten umzusetzen, aber ehrlich gesagt halte ich es für schlecht, wenn ich für jede Task-Struktur einfach mal 4KB verschwende.

Wie siehts also aus? Sollte ich mir einen vernünftigen VMM basteln? Welche Methode würdet ihr da empfehlen bzw. verwendet ihr?
43
Ah, natürlich - man konnte ja angeben, dass nur Ring-0-Code darauf zugreifen darf, und bei Interrupts wechselt er ja in Ring 0, was einen Kontextwechsel überflüssig macht. Das hatte ich gerade völlig vergessen, ich werde wohl den üblichen Weg gehen, also den Kernel überall als system-only mappen.
Damit wäre meine letzte Frage wohl geklärt ;)
44
Ok, irgendwie wollte das einfach nicht klappen, und ich hab (ähnlich wie in der Tutorial-Reihe) jetzt einfach mal nur eine ELF-Datei geparst, die halt direkt in den Speicher kommt. So kann das natürlich nicht bleiben, aber ich habe mich diesmal dafür entschieden, zu versuchen, in den Kontext des zu startenden Programmes zu wechseln.
Was müsste ich denn alles beachten, wenn ich das so mache? Ich muss vermutlich erstmal den Kernel mappen, sonst wird das ganze in einem Desaster enden. Müssen seine Pages da beschreibbar sein? Und wenn ich dann auch das multiboot-modul mappe, wie kann ich sicher sein, dass es da nicht sich selbst in die Quere kommt, wenn es irgendwo da liegt, wo ein Teil von ihm hinkopiert werden soll?

Wie lösen das eigentlich andere OS, z.B. tyndur? Irgendwie müssen die ja auch ihren init-Prozess starten.

/edit: Ich hatte gerade eine Idee, wie ich das kopieren in einen anderen Kontext besser und schneller machen könnte:
sub copy_to_context (page_directory as uinteger ptr, p_start as uinteger, v_dest as uinteger, size as uinteger)
    dim bytes_left as uinteger = size
dim size_for_this_page as uinteger
dim p_addr as uinteger = p_start
dim p_v_addr as uinteger
dim v_addr as uinteger = v_dest
    
while (bytes_left > 0)
   p_v_addr = get_p_addr(page_directory, v_addr, 1)
     size_for_this_page = ((v_addr+4096) and &hFFF) - v_addr
     memcpy(p_v_addr, p_addr, size_for_this_page)
     bytes_left -= size_for_this_page
     p_addr += size_for_this_page
     v_addr += size_for_this_page
wend
end sub

Anstatt jetzt immer zu prüfen, ob ich eine Page-Grenze überschreite, rechne ich jetzt aus, wieviele Bytes es bis zur Page-Grenze sind und lasse meine memcpy-funktion die alle in einem Rutsch kopieren, dann gehts mit der nächsten Page weiter usw.

/edit2:
Noch eine kleine Frage zum Paging: Ich muss ja in jedem Kontext den Kernel (int-handler usw.) gemappt haben. logischerweise schreibgeschützt, damit mir kein Task da reinpfuscht. Wenn jetzt ein Interrupt aufgerufen wird, sollte ich dann gleich in den Kontext des kernels wechseln, damit ich dann auch auf Kernel-spezifische Dinge schreibend zugreifen kann?
45
jep, das ist mir klar. Der Kernel kriegt sowieso alles 1:1 gemappt ;)
Irgendwo kracht es aber noch, wobei ich jetzt nicht weiß, ob das beim ELF-Parsen passiert oder irgendwo beim Paging, das muss ich mir noch genauer ansehen. Aber das mach ich vermutlich wenn es wieder hell ist, wenn ich müde bin produziere ich mehr Bugs als ich behebe ;)
46
Ok, ich hab mich jetzt erstmal für die 1. Möglichkeit entschieden. Dazu hab ich jetzt erstmal eine Funktion geschrieben, die mir eine virtuelle in eine physische Adresse umrechnet (damit ich dann die Adresse hab wo die Daten letztendlich hin müssen) und bei Bedarf auch gleich die entsprechende Page reserviert, wenn sie noch nicht vorhanden war.
Die eigentliche Kopierfunktion durchläuft dann den zu kopierenden Speicherbereich und kopiert einzelne Bytes, wobei überprüft wird, ob die Adresse eine Page-Grenze überschreitet. Wenn dem so ist, wird die physische Adresse der neuen Page herausgesucht (und diese evtl. reserviert) und der Spaß geht weiter.
Ich hab das ganze jetzt nur mal testweise kompiliert um zu sehen, ob noch ein paar grobe Fehler drin sind, aber noch nicht getestet.
Momentan sieht es so aus:
   function get_p_addr (page_directory as uinteger ptr, v_addr as uinteger, reserve_if_na as ubyte) as uinteger
        dim pd_index as uinteger = (v_addr shr 22)
        dim pt_index as uinteger = (v_addr shr 12) and &h3FF
        dim page_table as uinteger ptr
        
        if (page_directory[pd_index] = 0) then
            if (reserve_if_na = 1) then
                page_directory[pd_index] = cuint(pmm.alloc())
                pmm.clean(cast(any ptr, page_directory[pd_index]))
                page_directory[pd_index] or= (FLAG_PRESENT or FLAG_WRITE or FLAG_USERSPACE)
            else
                return 0
            end if
        end if
        
        page_table = cast(uinteger ptr, (page_directory[pd_index] and &hFFFFF000))
        
        if (page_table[pt_index] = 0) then
            if (reserve_if_na = 1) then
                page_table[pt_index] = cuint(pmm.alloc())
                pmm.clean(cast(any ptr, page_table[pt_index]))
                page_table[pt_index] or= (FLAG_PRESENT or FLAG_WRITE or FLAG_USERSPACE)
            else
                return 0
            end if
        end if
        
        return ((page_table[pt_index] and &hFFFFF000) or (v_addr and &hFFF))
    end function
    
    sub copy_into_context (page_directory as uinteger ptr, p_start as uinteger, p_end as uinteger, virtual as uinteger)
        dim p_addr as uinteger = p_start
        dim p_v_addr as uinteger = get_p_addr(page_directory, virtual, 1)
        dim p_page_start as uinteger = (p_v_addr and &hFFFFF000)
        dim virtual_temp as uinteger = virtual
        
        while (p_addr<=p_end)
            *(cast(byte ptr, p_v_addr)) = *(cast(byte ptr, p_addr))
            p_addr += 1
            p_v_addr += 1
            if (not(p_v_addr < p_page_start+4096)) then
                virtual_temp += 4096
                p_v_addr = get_p_addr(page_directory, virtual_temp, 1)
                p_page_start = (p_v_addr and &hFFFFF000)
            end if
        wend
    end sub

Ist meine Umsetzung soweit einigermaßen richtig?
47
Hi,
ich habe da ein kleines Problem.
Bei meinem Kernel funktionieren bereits Multitasking und alles was "davor" kommt, und gestern hab ich auch endlich den Bug beheben können, der das Paging vermurkst hat. Ich habe also momentan Paging mit einem page-directory für den Kernel und bin gerade dabei den einzelnen Prozessen auch ein page-directory zu verpassen und gleich auch ELF-Dateien zu verwenden.
Mein Problem ist jetzt folgendes:
Ich kann bereits dynamisch Speicher mappen usw., aber wenn ich ELF-Dateien parse muss ich ja die einzelnen Speicherbereiche, die im Programm-Header angeben sind, in den Adressraum des Prozesses kopieren (einfach nur mappen ist ja im Grunde nicht richtig, da auch die Bereiche auch im Speicher evtl. größer sein müssen usw.). Ein einfaches memcpy ist hier ja ungeeignet, da die Daten ja nicht nur an eine andere Adresse, sondern in einen ganz anderen Kontext müssen.

Meine Frage daher: Wie kann ich das einigermaßen gut lösen? Für jedes zu kopierende Byte die Adresse umzurechnen ist ja von der Performance her schon mal ganz schlecht.

Vielleicht stehe ich auch einfach nur auf dem Schlauch ;)
48
Offtopic / Re:Hosen runter! Zeigt eure OS ;)
« am: 09. May 2011, 22:26 »
So, ich grabe mal den Thread wieder aus ;)

Der Grund dafür ist, dass ich gerade fertig geworden bin mit dem physical-memory-manager meines neuen Kernels, der, einfallsreich wie ich bin, FROST V2 heißt.
FROST V2 ist ein kompletter rewrite meines Kernels, der, wie sein Vorgänger, in FreeBASIC geschrieben ist, jedoch etwas mehr Assembler nutzt (ich benutze nasm dafür).
Paging und Multitasking sind noch nicht drin, aber das kommt auch noch demnächst, momentan bin ich dabei alles möglichst sauber, bugfrei und stabil aufzubauen.
Als Bootloader nutze ich GRUB 2. Momentan ist mein OS nicht sonderlich spektakulär, aber das, was es bisher kann, kann es wenigstens einigermaßen richtig ;)

Jetzt kommt aber mal der Screenshot, als Beweis, dass mein fabrizierter Humbug wenigstens läuft:

Entschuldigt den Bild-Murks außen herum, ich bin mit der Screenshot-Funktion von KDE 4 noch nicht sonderlich vertraut.

Als nächstes werd ich den physical-memory-manager noch etwas verbessern, ihn dann etwas ausführlicher testen und mich anschließend dem Multitasking (diesmal mit usermode) zuwenden.
49
Offtopic / Re:VT-X, VirtualBox und MAC OS
« am: 04. May 2011, 17:20 »
Ok, aber selbst wenn der Paragraph nicht passt, verbietet es immernoch die Lizenz von OS X. Denn um es lauffähig zu bekommen, musst du es modifizieren, und das ist nach Abschnitt 2c der Lizenz eindeutig verboten, da kann auch ein Prof nichts dran ändern.

Selbstverständlich bin auch ich daran interessiert dir zu helfen, die Frage ist nur, ob dein Vorhaben auch legal ist, denn sonst darf man dir gar nicht helfen.
50
Offtopic / Re:Makefile-Problem
« am: 04. May 2011, 16:38 »
Ich hab mal 2. ausprobiert und es hat geklappt ;) Danke
51
Offtopic / Re:VT-X, VirtualBox und MAC OS
« am: 04. May 2011, 16:19 »
Zitat
Wenn du "definitiv" sagst, hast du dazu Quellen? (Also nach deutschem Recht)

Hier: http://dejure.org/gesetze/UrhG/95a.html

Hallo,
hab ja die Software legal erworben. Also warum sollte ich dann mit einer Nicht-MAC-Installation dagegen verstoßen ?

Weil Apple dir das nicht erlaubt:
Zitat
A. This License allows you to install and use one copy of the Apple Software on a single Apple-labeled computer at a time.
http://store.apple.com/Catalog/US/Images/MacOSX.htm
52
Offtopic / Re:VT-X, VirtualBox und MAC OS
« am: 04. May 2011, 09:59 »
Ich hatte mich mal vor einiger Zeit damit beschäftigt.
Die x86 Variante von MacOS X stellt bestimmte Anforderungen: Laut einiger Leute ist in der Hardware des Macs ein Key drin, den der Installer anfordert und ohne den das Setup nicht funktioniert. Man braucht also einen manipulierten Installer.
Dann ist da noch die Voraussetzung dass man von EFI aus bootet, da gibt es dann auch manipulierte Setup-DVDs für und spezielle Bootloader, die es auch von einem normalen BIOS aus ermöglichen, OS X zu booten.

OS X auf einem Mac virtualisiert laufen zu lassen ist erlaubt, allerdings muss da die VM das "durchreichen" des Hardware-Keys unterstützen (VirtualBox kann das seit einiger Zeit).

OS X auf einem normalen Rechner geht zwar, aber du verletzt damit Mehrfach die Bedingungen von Apple, denn du lässt es dann auf nicht-Apple-Hardware laufen und du musst das OS mehrfach manipulieren.

Ich würde dir also davon abraten, denn es ist definitiv illegal.
Außerdem ist es extrem wählerisch was die Hardware angeht, so funktionieren mit dem derzeit genknackten OS X nur Intel Core 2 Prozessoren.

Btw: VT-X bezeichnet nicht eine Erweiterung der Virtualisierungstechnologie, es ist die Virtualisierungstechnologie von Intel.
53
Offtopic / Makefile-Problem
« am: 03. May 2011, 22:35 »
Hi,
nach (sehr) langer Zeit habe ich mich mal wieder meinem Kernel gewidmet (Source angesehen, Würgereiz unterdrückt und neu angefangen). Dabei möchte ich jetzt auch ein Linkerscript und ein Makefile einsetzen.
Das mit dem Linkerscript klappt, aber das Makefile macht mir noch Problem.
Ich erkläre vielleicht zuerst einmal, wie ich das überhaupt haben will:
Im Ordner meines Kernels liegen zuerst einmal das Linkerscript (kernel.ld) und das Makefile. Dann gibt es da noch einen Unterordner (src) in dem der ganze Code liegt.
Wenn ich nun make starte, soll er alle *.bas-Files aus dem src-Ordner kompilieren und das Obj-File im Hauptordner ablegen (evtl. später auch in einem Unterordner obj oder so) und dann alle Obj-Files mit dem Linkerscript linken.
Auf Basis von Teil 4 der Tutorial-Reihe und jeder Menge googlen hab ich mir jetzt ein Makefile zusammengebastelt, dass mich aber mit einem Fehler abspeist:
Zitat
make: *** Keine Regel vorhanden, um das Target »video.o«,
  benötigt von »frost.krn«, zu erstellen.  Schluss.

video.o wäre das Obj-File von video.bas, welches sich um die Ausgabe auf dem Bildschirm kümmert.
Jetzt folgt mein Makefile:
SRCS = $(shell find src -name *.bas)
OBJS = $(addsuffix .o,$(basename $(notdir $(SRCS))))

CC = fbc
LD = ld

CFLAGS = -c
LDFLAGS = -melf_i386 -Tkernel.ld

frost.krn: $(OBJS)
$(LD) $(LDFLAGS) -o $@ $^

%.o: %.bas
$(CC) $(CFLAGS) -o $@ $^

clean:
rm $(OBJS)
rm frost.krn

.PHONY: clean

Wie ihr vermutlich schon erraten habt, habe ich keine Ahnung, wo mein Fehler liegt ;)
Ich hoffe mal, dass ihr mir erklären könnnt, was ich falsch gemacht habe.
54
Offtopic / Win32 Build von qemu 0.14.0
« am: 14. March 2011, 20:36 »
Hi,
ich hab mir mal die Mühe gemacht und die aktuelle qemu-Version kompiliert. SDL ist mit drin.
Momentan liegen zwei Versionen auf meinem Server. Die Version mit "stdio_redirect" hat die SDL-Option drinnen, die alle Konsolenausgaben in eine "stdout.txt" umleitet.
Momentan ist nur die x86_64 Version auf meinem Server, das "Komplettpaket" kommt noch sobald ich in der Schule Gelegenheit habe es hochzuladen, hier ist leider mein Internet zu langsam.
Hier der Link: http://darkinsanity.netii.net/qemu/
Bei Bedarf darf auch gerne im QEMU-Artikel im Wiki unter "Aktueller Windows-Build" auf diese Version verlinkt werden.

so long, TheThing
55
Offtopic / Re:GRUB 2 iso
« am: 06. October 2010, 23:20 »
Naja, ich bin halt an GRUB gewöhnt, und mit GRUB 2 kann ich dann später auch den Kernel im ELF64-Format laden. Außerdem gefällt mir GRUB 2 irgendwie, auch wegen der Möglichkeiten gleich einen Grafikmodus zu setzen usw.
Später möchte ich dann auch HD-Images erstellen, die dann auch GRUB 2 nutzen sollen.

Wenn ich das Problem mit dem Menü gelöst kriege würde ich eigentlich gerne bei GRUB 2 bleiben.
Ich hab auch mal das grub-mkrescue-Skript überflogen, konnte aber auf Anhieb nichts erkennen, warum es mit grub-mkrescue funktioniert, aber nicht wenn ich es "manuell" mache.

/edit:
Ich hab etwas im GRUB-Manual gefunden: http://www.gnu.org/software/grub/manual/grub.html#Making-a-GRUB-bootable-CD_002dROM

Ich hab jetzt (wie im Manual) die eltorito.img nach boot/grub/ kopiert und die ISO mit "mkisofs -R -b boot/grub/eltorito.img -no-emul-boot -boot-load-size 4 -boot-info-table -o grub2.iso root" erstellt. Jetzt funktioniert alles wunderbar ^^
56
Offtopic / GRUB 2 iso
« am: 06. October 2010, 18:30 »
Ich versuche gerade, GRUB 2 auf eine iso zu bekommen. Das ganze gestaltet sich schwieriger als ich gedacht hätte ;)

Zuerst habe ich es folgendermaßen gemacht:
Zuerst eine GRUB-ISO erstellt: grub-mkrescue --output=GRUB2.iso /boot/grubDann hab ich die ISO mit meinem USB-Stick zum Windows-Rechner getragen und per UltraISO die grub.cfg und meinen Kernel draufkopiert.

Der Nachteil daran ist:
1. Ich habe keine Ahnung, wie ich später den Kernel und die grub.cfg per Shellscript draufkriegen soll
2. Auf der ISO liegen 185 Dateien im Hauptverzeichnis

Mein zweiter Ansatz war folgender:
grub-mkimage -p /boot -o core.img biosdisk iso9660 multiboot sh
cat /usr/lib/grub/i386-pc/cdboot.img core.img > eltorito.img
Dann hab ich mir ein Verzeichnis namens "root" gemacht und dort die eltorito.img reingelegt. Dann noch einen Unterordner "boot", und dort den Kernel + grub.cfg rein. Dann hab ich mir die iso erstellt: mkisofs -b eltorito.img -no-emul-boot -boot-info-table -o grub2.iso rootObwohl die grub.cfg und der Kernel auch wirklich auf der iso drauf sind, funktioniert das Menü nicht, wenn ich die iso mit qemu teste. Unter VirtualBox sehe ich sogar gar keine Ausgabe. In qemu kann ich dann aber den Kernel testen, wenn ich "multiboot /BOOT/FROST.KRN" gefolgt von "boot" eingebe.
Zuerst einmal wundert es mich, dass alle Datei- und Ordnernamen auf einmal groß geschrieben sind, und ich frage mich, warum das Menü nicht funktioniert.
Der Vorteil dieser Methode wäre, ich könnte das ganz einfach in ein Shellscript packen, wenn es denn mal geht ;)

So, ich hoffe dann mal, dass ihr mir helfen könnt, und danke schon einmal für alle Antworten :)
57
Offtopic / Re: DVD booten mit CD-LW ?
« am: 17. June 2010, 12:29 »
Die Server-Edition von Ubuntu dürfte dafür geeignet sein. Darauf läuft mein SSH/TS3/GTA-SA Server bei mir. Hab halt kein DHCP dabei, darüber kann ich nix sagen.
Läuft sogar recht gut (ist irgendein 1 Ghz AMD Dingens mit 256MB RAM).

/edit: Vielleicht hilft dir ja das: http://www.ubuntugeek.com/how-to-install-and-configure-dhcp-server-in-ubuntu-server.html
58
Offtopic / Re: Hosen runter! Zeigt eure OS ;)
« am: 30. May 2010, 16:51 »
Sieht ganz nett aus. Aber das ist momentan alles im Kernel, oder?
59
Offtopic / Re: Intel Manuals
« am: 19. November 2009, 12:19 »
Also,
ich hab mal per Mail bei Intel nachgefragt und die haben mir versichert das die Manual-CD kostenlos ist.
Hab mir auch gleich mal eine bestellt :)
60
OS-Design / Re: Interprozesskommunikation (mit CDI) aufbauen
« am: 29. October 2009, 08:16 »
Und entschuldige Bitte noch mal das ich Deinen Thread entfremdet hab.
Ist schon in Ordnung, es gehört ja zum gleichen Thema, und es gibt ein paar nützliche Infos her :)
Seiten: 1 2 [3] 4 5 6

Einloggen