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

Seiten: 1 ... 8 9 [10]
181
Lowlevel-Coding / Diskettencontroller
« am: 24. June 2004, 10:14 »
Hiho,

ReadSector nutzt dma. Man kann das zwar ausstellen, aber dann geht es bei mir auch nicht. Btw, du musst vorher auch noch andere Commands an den Controller senden. Hier ist ein alter Code für meinen Floppy Treiber, der ist aber glaub ich nen bissle buggy :)

extern void FloppyInterrupt();


int iFloppyReady;
int iFloppy;


void FloppyHandler()
{
    iFloppyReady=1;
}


/* fd_sendbyte() routine from intel manual */
void fd_sendbyte(int byte)
{
    volatile int msr;
    int tmo;

    for (tmo=0; tmo<100; tmo++)
    {
        msr = InByte(0x3F4);
        if( (msr & 0xc0)==0x80 )
        {
            OutByte(0x3F5,byte);
            return;
        }

        InByte(0x80);   /* delay */
    }
}

/* fd_getbyte() routine from intel manual */
int fd_getbyte()
{
    volatile int msr;
    int tmo;

    for (tmo=0; tmo<100; tmo++)
    {
        msr = InByte(0x3F4);
        if ((msr & 0xd0) == 0xd0)
        {
            return InByte(0x3F5);
        }
        InByte(0x80);   /* delay */
    }

    return -1;   /* read timeout */
}


void SetFloppy(int iDriveNum)
{
    iFloppy=iDriveNum;
}

   
void WaitFloppy(int iSense)
{
    if(iSense)
    {
        while(!iFloppyReady);
        iFloppyReady=0;
    }    

    // Read command results
    while(InByte(0x3F4) & 16) fd_getbyte();
   
    if(iSense)
    {
        fd_sendbyte(8);
        fd_getbyte();
        fd_getbyte();
    }
}


void FloppyMotorOn()
{
    int i;
    OutByte(0x3F2,0x1C | iFloppy);
    for(i=0;i<100000;i++);
}


void FloppyMotorOff()
{
    int i;
    OutByte(0x3F2,0x0C | iFloppy);
    for(i=0;i<100000;i++);
}


int FloppySeek(int iTrack)
{
    int i;
   
    FloppyMotorOn();
   
    fd_sendbyte(0x0F);
    fd_sendbyte(0);
    fd_sendbyte(iTrack);
    for(i=0;i<1000000;i++);
    WaitFloppy(1);
   
    FloppyMotorOff();
   
    return 1;
}

   
int ReadFloppy(int iSector,void *pvBuffer)
{
    int head,track,sector;

    // Compute chs address
    sector=(iSector%18)+1;
    track=(iSector/18)/2;
    head=(iSector/18)%2;
   
    // Enable dma channel
    asm("cli");
    OutByte(12,0x46);
    OutByte(11,0x46);
    OutByte(4,(DWORD)pvBuffer & 0xFF); //OFFSET LSB
    OutByte(4,((DWORD)pvBuffer >> 8) & 0xFF); //OFFSET MSB
    OutByte(0x81,(DWORD)pvBuffer >> 16); //PAGE
    OutByte(5,511 & 0xFF); //SIZE-1 LSB
    OutByte(5,511 >> 8); //SIZE-1 MSB
    OutByte(10,2);
     asm("sti");    

    FloppySeek(track);
   
    FloppyMotorOn();

    // Send read command
    fd_sendbyte(0x66);
    fd_sendbyte(head << 2);
    fd_sendbyte(track);
    fd_sendbyte(head);
    fd_sendbyte(sector);
    fd_sendbyte(2);        // bytes per sector
    fd_sendbyte(18);    // Sectors per track
    fd_sendbyte(0x1B);
    fd_sendbyte(0xFF);

    WaitFloppy(0);

    int i;
    for(i=0;i<10000;i++);
    FloppyMotorOff();
   
    return 1;
}

   
void InitFloppy()
{
    int i;
   
    SetFloppy(0);

    iFloppyReady=0;
    SetInterrupt(6,FloppyInterrupt);

    // Reset controller
    OutByte(0x3F2,0);
   
    // Set datarate
    OutByte(0x3F7,0);
   
    // Enable controller
    OutByte(0x3F2,0x0C | iFloppy);
    for(i=0;i<1000000;i++);
    WaitFloppy(1);
   
    // Specifiy
    fd_sendbyte(3);
    fd_sendbyte(0xDF);
    fd_sendbyte(2);

    // Seek
    FloppySeek(1);
   
    // Recalibrate
    FloppyMotorOn();
    fd_sendbyte(7);
    fd_sendbyte(0);
    iFloppyReady=1;
    WaitFloppy(1);
    FloppyMotorOff();
}


MfG GhostCoder
182
Das Wiki / Chat???
« am: 22. June 2004, 20:14 »
Was mir grad einfällt:
am besten würde sich der link ja direkt auf der Lowlevel Hauptseite machen :)
Neben dem Forum
183
Das Wiki / Chat???
« am: 22. June 2004, 20:12 »
@NOOB:
Dann mach doch mal auf men server nen chan #lowlevel oder sowas auf, und mach nen thread, damit jeder die daten sehen kann, dann können wir ja gucken wer so alles kommt. ich denk sowieso, das sich sowas nach einer zeit einpendelt.

MfG GhostCoder
184
Hiho,

kein Problem, kann ich machen. Paging is in echt mälich garnicht so schwer wie viele sagen...
Wohin soll ich das dann posten?

MfG GhostCoder
185
Das Wiki / Chat???
« am: 22. June 2004, 16:02 »
Hiho,

also ich find die Idee mit dem Chat auch ziemlich gut, ist schon was besonders nen deutsches OsDev Forum zufinden, aber nen Chat (am besten irc, stimmt schon) wäre das beste.
Wer hätte den Interesse an sowas? Weil nen Chan auf irgendeinem Server einzurichten sollte ja wohl kein Problem darstellen, und es kostet ja auch niemanden was. Nur es bringt mir nichts, nen Chan aufzumachen, und dann kommt keiner rein, da ich auch net sooo oft online sein kann.

MfG GhostCoder
186
Jo, dass würd mich auch mal interessieren...
btw, wann kommen eigentlich die "fortgeschrittenen" Themen wie Paging und Multitasking? Wenn ihr wollt, kann ich euch über solche Themen was schreiben. Ich weiß ja net, wie das ist wer alles Artikel schreiben darf ;).
Mein Code für o.g. Bereiche sind eigenlich recht gut, hoffe ich :) daher...

MfG GhostCoder
187
Lowlevel-Coding / Systemcalls
« am: 21. June 2004, 17:48 »
Hiho,

ich würde mal gern wissen in welcher Weise ihr Systemcalls benutzt?
Also, wie z.B. Linux einfach über int 0x80 mit subcodes, oder anders?

Ich frage, weil ich grad meinen Kernel neucode für folgendes System:
Es gibt nur 4 "richtige" (also auf dem x86 über int's) Systemcalls, die da wären:

int Open(int iPid,int iBufferSize,void **ppvBuffer);
int SendMessage(int iProcess,int iMessage);
int GetMessage(struct MSG *psMsg,int iWait);
int Close(int iProcess);

Mit Open wird eine Verbindung zwischen 2 Prozessen aufgebaut, d.h. Speicher für einen Puffer geholt und in den virtuellen Addressraum der beiden Prozesse gemappt, damit während des Schickens kein langwieriges mappen mehr stattfinden muss. In den Buffer können dann halb beide Prozesse schreiben und per Send/Get Message Nachrrichten schicken und empfangen. Mit Close wird dann der Puffer freigegeben.

Der Vorteil hier ist, dass z.B. ein "Window Server" im Netz läuft und die Clienten darauf zugreifen. Auch bleibt der Kernel dadurch extrem klein, weil alle Treiber eigene Prozesse sind. Aber auch z.B. das vfs kann ein eigener Prozess sein. Dadurch kann jeder Teil des Betriebssystems ohne Probleme im Betrieb neugestartet werden usw. Auch kann es "theoretisch" über timeouts unmöglich sein, den pc abzuschießen.

Was sagt ihr dazu?

MfG GhostCoder
Seiten: 1 ... 8 9 [10]

Einloggen