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

Seiten: [1]
1
Lowlevel-Coding / Re: Port-Befehle unter C/C++
« am: 02. September 2009, 19:07 »
Unter Windows ist der direkte Zugriff auf Ports, ab Xp nicht mehr gestattet. Wenn du dennoch Zugriff brauchst, musst du eine Dll nehmen, da der Zugriff nicht mehr direkt erfolgt (ueber in/out), sondern ueber irgendwelche Windowsgeschichten. Kannst hier einige gute Infos kriegen oder hier.

Ich tippe mal, das ist es was du suchst^^.
2
Lowlevel-Coding / Re: Bochs und der Debugger
« am: 21. August 2009, 20:10 »
Zudem kannst du in der neusten Version den lustigen Gui-Debugger verwenden der dir alles zeigt, das Ding ist echt zu empfehlen^^.

Ansonsten kannst du wie SHyx0rmZ schon angedeutet hat, jederzeit den Ablauf unterbrechen und schauen was los ist. Dazu kannst du auch Breakpoints setzen, die den Programmablauf abbrechen, wenn das Programm an den Breakpoint angekommen ist. Dazu kannst du mit "s" noch Bochs beauftragen nur einen Schritt zu machen.
3
Offtopic / Re: Binäruhr
« am: 13. August 2009, 18:49 »
Hi,
Bin dabei eine zu bauen, arbeite aber noch an paar Zusatzfunktionen (Zeit einstellen und vieleicht sogar einen Wecker einbauen).

Am besten funktioniert dies mit einem fertigem Mikrocontroller, der schon alles mitbringt (Speicher, Interrupts etc.). Hier musst du bloss einen nehmen, der einen ARM-Core besitzt. Mit einem solchen lässt sich das Ansteuern der LED's sehr leicht gestallten und man kann damit auch ohne größere Probleme mit Zeit rumspielen.

Daher solltest du zuerst dich ein wenig mit Mikrocontrollern auseinandersetzen. Dafür ist dieses Tuturial gut geeignet: http://www.mikrocontroller.net/articles/AVR-Tutorial. Ist zwar über AVR's ist aber fast identisch (nur andere Befehle und vieleicht andere Pinbelegungen).

Nur von einem ARM-Core auszugehen, währe für eine Binäruhr totaller overkill.

MfG Tarrox
4
Lowlevel-Coding / Re: Shutdown PC
« am: 08. August 2009, 12:53 »
Man muss ja nicht den ganzen ACPI dekodieren. Es reicht sich die nötigen Informationen rauszusuchen. Im englischsprachigem Forum gibt es dazu einen guten Eintrag http://forum.osdev.org/viewtopic.php?t=16990, den man selbst in seinem Hobby-Betriebssystem umsetzen kann. Ansonsten gibt es noch Open-source Projekte, die zur Aufgabe haben, den ACPI zu dekodieren. Man könnte versuchen eins davon zu rüberzuporten.
5
Lowlevel-Coding / Re: Paging
« am: 07. March 2009, 23:06 »
Am einfachsten ist es den 1023 Direktory Eintrag, selbst auf die Directory zu zeigen. Dadurch ist jeder ist jede Tabelle automatisch gemappt, wenn du sie in den Direktory reinschreibst.
//Alle Page-Tabels sind nun ab der Position 0xFFC00000 zu finden, und muss nicht extra gemappt werden.
kernel_dir[1023]=(kernel_dir|0x3);
addresse = 0xFFC00000+(i*0x1000);//gib die Addresse des i-ten Tabelle aus, um sie zu bearbeiten.
6
Lowlevel-Coding / Re: Paging
« am: 06. March 2009, 18:48 »
Stürzt es in der Funktion ab ader dannach?
Wenn es in der Funktion abstürzt, musst du suchen wo es Abstürzt, also die genaue Zeile. Ansonaten muss man woanders schaun, je nachdem wo es abstürtzt^^.
7
Lowlevel-Coding / Re: Paging
« am: 06. March 2009, 14:48 »
Wenn du weißt wo der Fehler auftrit, würde ich versuchen ihn zu finden. Daher ich würde schaun wann der erste Eintrag in der ersten Tabelle gesetzt wird. Dies musst du kannst du machen indem du nach jedem Schritt in dem der Speicher geändert wird schaust, ob sich der Wert geändert hat. Anstrangend aber meist nicht anders machbar.

PS: Ist Paging schon aktiviert oder machst du das erst jetzt.
8
Lowlevel-Coding / Re: Struktur auf beliebigen Speicher anwenden
« am: 03. February 2009, 16:57 »
Du musst auf die Addresse von kernel_end zugreifen und nicht auf das worauf es zeigt.
u32int* pointer = (u32int*)kernel_end; //Du greifst auf den inhalt an der Addresse von Kernelende zu, das willst du ja nicht
u32int* pointer = &kernel_end; //der Pointer zeigt auf das Ende des Kernels
9
Lowlevel-Coding / Re: Struktur auf beliebigen Speicher anwenden
« am: 19. January 2009, 00:46 »
Du erzeugst einen Pointer und gibst diesen dann die Addresse. Jetzt kannst du mit -> auf die Member zugreifen.

WertePaar *NAME; //erzeuge Pointer
NAME = 0xBADC00FE; //Gib dem Pointer die gewollte Adresse
NAME->Wert1 = 10; //Wert1 wird geändert
NAME->Wert2 = (u32)NAME->Wert1; //Wert2 wird geändert
10
OS-Design / Re: kmalloc und malloc
« am: 15. January 2009, 22:55 »
Statt Block für Block zu bearbeiten, würde ich die ganzen Blöcke zusammenfassen und als einen Großen Block sehen (ist ja kein Problem dank Paging). So könntest du auch einen Header an den Anfang setzen, der den Größten Block beschreibt. Es ist halt besser einen Heap zu haben als 100 kleine.
11
Lowlevel-Coding / Re: Paging
« am: 08. January 2009, 12:32 »
Du solltest am besten für jeden Prozess einen Heap erstellen, der die dynamische Speicherverwaltung übernimmt. Der kümmert sich darum aus den für sie vorgegebenen Pages, Speicher an den Prozess zu geben, wenn er angefordert wird (und auch wieder freizugeben).
12
Lowlevel-Coding / Re: Paging
« am: 29. December 2008, 10:38 »
Hab mal durgeschaut und ein paar Fehler gefunden.

#include <kernel32.h>
 #include <memory/mmu.h>
 #include <memory/pmmu.h>

//internal methods
void map_pages(physaddr_t , virtaddr_t , cond_flags , size_t);
void directory_init();
void printReserved(int , int);

//methods from the asm-file
extern void _write_cr3(dword);
extern void _write_cr0(dword);
extern dword _read_cr0();
extern dword _read_cr3();

page_table_t directory;
extern dword bitmap_length;
extern dword *bitmap_virt;

void paging_init(){
    size_t param;
    //initialize the directory
    directory_init();

    //map the kernel
    param = ((dword)kernel_end - (dword)kernel_start) / BLOCK_SIZE;
    map_pages(kernel_start , kernel_mem_start , PAGE_READWRITE | PAGE_PRESENT , param);

    //map the video
    param = 80 * 25 * 2 / BLOCK_SIZE + 1;
    map_pages((physaddr_t)0xB8000 , (virtaddr_t)0xB8000 , PAGE_READWRITE | PAGE_PRESENT , param);

    //map the directory
    map_pages(directory , directory , PAGE_READWRITE | PAGE_PRESENT , 1);

    //map the bitmap
    param = bitmap_length / BLOCK_SIZE;
    map_pages(bitmap_virt , bitmap_virt , PAGE_READWRITE | PAGE_PRESENT , param);

    _write_cr3((dword)directory);
    _write_cr0((_read_cr0() | 0x80000000));
}

void directory_init(){
    size_t i;
    directory = phys_alloc(TABLE_SIZE * sizeof(page_table_t) / BLOCK_SIZE);

    memset(directory , 0 , TABLE_SIZE);
}

void map_pages(physaddr_t paddr , virtaddr_t vaddr , cond_flags flags , size_t size){
    size_t i , offset = ((dword)vaddr >> SHIFT_PAGE) % TABLE_SIZE;
    page_table_t table;
    dword phys_addr;
Ich frag mich was du hier machst? Dir ist schon klar, dass du mindestens 3073 Pages anfragen musst, damit diese Bedingung erfüllt ist. Ich denke nicht, dass du das gemeint hast.
    if(size >= TABLE_SIZE - offset){
        //TODO: change parameters
    }

    if(directory[(dword)vaddr >> SHIFT_DIRECTORY] == NULL){
        puts("Generating new table\n");
        //prepare the table
        table = phys_alloc(TABLE_SIZE * sizeof(page_table_t) / BLOCK_SIZE);
Sollte jetzt noch nicht stören, wird es aber wenn das Paging aktiviert ist, den dann greifst du auf ungemappten Speicher zu sehr sehr böse. Daher erst zuweisen dann Nullen.
        memset(table , 0 , TABLE_SIZE);

        //register in the directory
        directory[(dword)vaddr >> SHIFT_DIRECTORY] = (dword)table | PAGE_PRESENT | PAGE_READWRITE;
    }

Hier hast du wohl vergessen, das im directory Eintrag noch die Flags sind, die musst du rausnehmen bevor du die Richtige Table Adresse erhältst.
    table = (page_table_t)directory[(dword)vaddr >> SHIFT_DIRECTORY];
    for(i = 0; i <= size; i++){
        phys_addr = (dword)paddr + i * BLOCK_SIZE;

        table[offset + i] = phys_addr | flags;
    }
}

Zitat
Stimmt meine Theorie überhaupt, dass ich einfach nur die Offset-Adresse berechne und Dann in meinem Array einfach solange hoch zählen muss, bis alles gemappt ist, was im physischen Speicher liegt?
Stimmt soweit nur solltest du mitbedenken, das das Maximum für das offset 1023 ist und du dannach denn nächsten directory Eintrag nehmen solltest.

Ansonsten würde mich interessieren wie page_table_t aussieht. Und ob du auch wirklich Adressen vom Physischem Memory Manager kreigst die Page Alligned sind. Ansonsten musst du alle Werte dir ausgeben lassen und schaun ob nicht einer falsch ist.
Seiten: [1]

Einloggen