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.


Themen - Cheebi

Seiten: [1] 2
1
Lowlevel-Coding / C-Kernel-Tutorial
« am: 03. October 2008, 17:45 »
Hi Leute,

hab lang nix von mir hören lassen, hab aber mit Studium und Klausuren wenig Zeit... dennoch will ich noch schnell was los werden:
Hab letztes Jahr inner Schule n kleines Referat über Betriebssystemprogrammierung gehalten und für Interessierte ein Einsteiger-Tutorial geschrieben, das hilft, in den Protected Mode zu schalten und in C geschriebenen Code auszuführen. Dabei erhebt es nicht den Anspruch komplett erklärend zu sein, sondern soll einem zu dem Erfolgserlebnis verhelfen, dass es funktioniert. Für Einsteiger ist das Tut, das TJ mal geschrieben hat einfach zu voll von Fehlern, die sie noch net alle erkennen können.
Hatte aber leider auch noch keine Zeit, das Tut wie vorgesehen in das Wiki einzutragen, hab stattdessen nur einen Link eingefügt.
Hoffe es hilft dem ein oder anderen Verzweifelten, wenn der PC wieder neustartet und net wie gewollt im Protected Mode "Hello World" anzeigt.
http://www.cheebi.de/c-kernel-tutorial.pdf
Gruß

Cheebi
2
hallo,

nachdem ich's jetzt geschafft habe, dass gcc meinen code auch unter linux übersetzt steh ich jetzt noch vor einem letzten problem beim linken der objektdateien:
folgender code erzeugt nachfolgenden fehler:
void PrintHexNumber(ulong ulNumber, ulong ulColor)
{
  char c = 0;
  char acNumber[10];

  for ( ; c < 8; c++ )
  {
    acNumber[c] = ulNumber & 0xf;
    ulNumber >>= 4;
  }
  acNumber[c++] = 'x';
  acNumber[c] = 0;
  for ( ; c >= 0; c-- )
  {
    switch (acNumber[c])
    {
      case 'x' : PrintChar('x', ulColor); break;
      case 15  : PrintChar('f', ulColor); break;
      case 14  : PrintChar('e', ulColor); break;
      case 13  : PrintChar('d', ulColor); break;
      case 12  : PrintChar('c', ulColor); break;
      case 11  : PrintChar('b', ulColor); break;
      case 10  : PrintChar('a', ulColor); break;
      case 9   : PrintChar('9', ulColor); break;
      case 8   : PrintChar('8', ulColor); break;
      case 7   : PrintChar('7', ulColor); break;
      case 6   : PrintChar('6', ulColor); break;
      case 5   : PrintChar('5', ulColor); break;
      case 4   : PrintChar('4', ulColor); break;
      case 3   : PrintChar('3', ulColor); break;
      case 2   : PrintChar('2', ulColor); break;
      case 1   : PrintChar('1', ulColor); break;
      case 0   : PrintChar('0', ulColor); break;
      default  : PrintChar('-', ulColor); break;
    }
  }
}

fehler:
ld -m elf_i386 -T link.ld -o kernel.sys
video.o: In function `_PrintHexNumber':
video.c:(.text+0x3327): undefined reference to `___stack_chk_fail'

grüße

Cheebi
3
Lowlevel-Coding / gcc inline assembler - %%eax %% - solved
« am: 23. May 2008, 00:25 »
hi,

warum gibt der gnu assembler 2.18.0 bei folgendem code die nachfolgenden fehlermeldung aus?

__asm__("movl %%cr0, %%eax\n\t"
"or $0x80000000, %%eax\n\t"
"mov %%eax, %%cr0\n\t"::);

fehlermeldung:
gcc -ffreestanding -c -O3 -o mem.o mem.c
/tmp/ccIHvtLl.s: Assembler messages:
/tmp/ccIHvtLl.s:21: Error: suffix or operands invalid for `mov'
/tmp/ccIHvtLl.s:23: Error: suffix or operands invalid for `mov'
make: *** [compile] Fehler


wohingegen dieser code anstandslos übersetzt wird:

__asm__("mov %0, %%cr3\n\t"::"r" (value));
gruß Cheebi
4
Lowlevel-Coding / kurze frage zu make
« am: 19. May 2008, 13:27 »
hi leute,

lange nichts von mir gehört.. tut mir leid, aber die letzte zeit war schwer.

meine frage zu make und makefiles:
dieses tutorial bei bona fide:
http://vertigo.hsrl.rutgers.edu/ug/make_help.html
bringt mich nicht vorwärts. ich habe noch nie mit make gearbeitet, weil ich bislang nur unter windows meine eigenen batchdateien benutzt habe. jetzt will ich auf makefiles umstellen. habt ihr eine bessere adresse als die bei bona fide? es muss nicht detusch sein (lieber orginal) aber vielleicht ein bisschen besser verständlich... ich habe nicht ganz den überblick bekommen...

vielen dank

Cheebi
5
Hallo,

mal wieder das übliche thema, aber ganz klar is mir das ganze aus den anderen threads nicht geworden...
ich habe paging implementiert. nun soll jeder task sein eigenes PD bekommen. soweit ist mir noch alles klar nur sehe ich ein problem bei der dynamischen speicherverwaltung:

ich möchte, dass ein task (ring3) malloc() aufrufen kann, um speicher bereit gestellt zu bekommen. angenommen im PD des tasks ist im mom nur eine einzige page present (für den code), dann muss ja malloc() feststellen, dass es keinen heap hat und muss vom betriebssystem eine page anfordern... da liegt das problem. wie funktioniert das?
welchen teil des kernels ruft malloc() auf? und was macht der kernel dann genau? er muss ja irgendwo festlegen, dass eine bestimmte page von einem task genutzt wird. außerdem muss er im PD des tasks die page present setzen und dann noch die pageframeaddress anpassen... nach welchen kriterien wird geschieht das?

habe ich das klar genug formuliert? *verwirrt_bin*

Cheebi
6
ohjee... warum bekomm' ich denn eine General-Protection-Fault-Exception, wenn ich folgenden Code ausführe?

  __asm__ volatile ("ltrw %%ax"::"a"(0x18));
  cli();
  for(;;);

Descriptor 3 der GDT ist der TSSDescriptor und hat folgende Werte:

Word1: 0x00000068
Word2: 0x05808900

Das heißt also:

Größe    = 104 Byte
Base     = 0x5000000
Busy     = false
DPL      = 0
Present  = true
Granular = true

Vom TSS selbst sind nur die beiden Einträge ss0 und esp0 mit Werten besetzt. Alle anderen Einträge tragen den Wert 0.

Warum komme ich also nie zu den Befehlen nach ltrw?

Gruß Cheebi
7
Lowlevel-Coding / gcc und __stdcall, __cdecl etc
« am: 24. July 2007, 14:14 »
hey Leute,

wie sieht das denn bei gcc aus? gibts da auch die möglichkeit dem compiler irgendwie mitzuteilen, wie er ne funktion gestalten soll? so wie es bei den ms-compilern möglich is (__stdcall, __fastcall etc.)?
das wäre von vorteil beim programmieren von dispatchern in c... nur als beispiel...

gruß

Cheebi
8
Lowlevel-Coding / Multitasking, Stacks und Pagetables
« am: 06. July 2007, 00:26 »
hey Leute,

ich blicks immer noch nicht ganz... ich habe folgende fragen:

1) ich habe verstanden, warum ich für jeden prozess mindestens zwei stacks haben sollte (userstack ring3 & kernelstack ring0). aber ich weiß nicht, wie groß ich die stacks beim starten eines tasks bemessen soll, also wieviel byte malloc() allozieren soll. wenn ich den kerneltack zu groß bemesse, habe ich eine enorme speicherverschwendung (zb 10kb + pro Task). das sollte doch eigentlich nicht sein... wie löst ihr das problem?

2) beim allozieren von speicher durch malloc() ist klar, dass ich zum beispiel die stackmethode wähle, um zu wissen welche pages noch unbenutzt sind. aber ein problem ist doch, dass wenn eine anwendung beispielsweise 120kb anfordert, nicht nur 30 pages zur verfügung stehen müssen, sondern auch eine zusammenhängende folge von virtuellen adressen unbenutzt sein muss. zb virtueller speicherbereich von 0x0 bis 0x1000 ist belegt, 0x1500 bis 0x2000 belegt und bis 0x3000 ist der virtuelle speicher frei. wenn jetzt 0x1500 speicher gebraucht wird, dann ist zwar genug speicher frei, aber nicht zusammenhängend... wie kann da malloc() einen pointer auf einen zusammenhängenden speicherbereich liefern?

3) ich habe gelesen, dass man bei jedem taskswitch auch das cr3 ändert, also das pagedirectory... warum das? dann müsste ja jeder task 4mb(pagetables)+4kb(pagedirectory) haben... das ist doch auch vergeudung... oder setzt man dann das presentbit im pagedirectory nicht und spart so pagetables?

gruß

Cheebi
9
Lowlevel-Coding / Paging aktivieren und VESA-Mode LFB
« am: 25. June 2007, 01:34 »
hi Leute,

sorry, dass ich ständig neue threads öffne, aber ich hab einfach mehrere probleme gleichzeitg...
wenn ich paging aktiviere, dann muss ich doch zuvor ein pagedirectory und 1024 pagetables (angenommen ich setze alle pages auf present) anlegen, oder? das habe ich getan. folgender codeabschnitt sorgt dafür:

paging.h:
  #define adr_PageDirectory 0x120000
  #define adr_PageTables 0x121000

  typedef struct
  {
    ulong Entry[1024];
  } SPAGETABLE;
paging.c:
static ulong *PageDirectory = (ulong *)(adr_PageDirectory);
static SPAGETABLE *PageTable = (SPAGETABLE *)(adr_PageTables);

void setup_Paging()
{
  int i1, i2;
  ulong adr = 0;
  for (i1 = 0; i1 < 1024; i1++)
  {
    PageDirectory[i1]=(ulong)PageTable + (i1*1024);
    for (i2 = 0; i2 < 1024; i2++)
    {
      PageTable[i1].Entry[i2] = adr | 3;                                        // alle pages present
      adr += 4096;
    }
  }
  write_cr3((ulong)PageDirectory);
  put_PagingBit();
}

die funktion put_PagingBit() ist in asm geschrieben:
[global _put_PagingBit]
_put_PagingBit:
        mov              eax,       cr0
        or               eax,       080000000h
        mov              cr0,       eax
        jmp              $
        ret

das problem ist, dass noch vor dem jmp $ ein neustart ausgeführt wird... es kommt noch nicht einmal ein "page-fault". woran liegt das?
an der stelle, an der ich setup_Paging() ausführe, befinde ich mich bereits im pm und habe ein flaches speichermodell.

grüße

Cheebi
10
Lowlevel-Coding / Sektoren lesen dauert so lange
« am: 20. June 2007, 23:18 »
Hi leute,

ich habe meinen Disketten-Treiber umgeschrieben in Assembler (vorher C) weil ich dachte, ich könnte dadurch die Performance verbessern. Nun muss ich feststellen, dass auch in Assembler zu lange gebraucht wird, einen Sektor zu laden. Woran kann das liegen?
Mein Loader (Stage 2) lädt die Kerneldatei, die immerhin 49KB groß is, innheralb von vielleicht 4 Sekunden. Im Loader (16Bit-Code) benutze ich den BIOS-Int, der Sektoren liest (also keine Tracks!); meine eigengeshriebene Routine für das Lesen von Sektoren ist aber zu langsam (49KB -> 33 Sec). Woran liegt das? Wie genau lädt das BIOS die Sektoren? Wie lange brauchen eure Disketten-Treiber 98 Sektoren zu lesen?

Danke,

Cheebi
11
Lowlevel-Coding / Multitasking - Frage zum Stack
« am: 02. April 2007, 17:46 »
Hi Leute,

im Moment sind Ferien, da kann man sich so richtig dem OS widmen (wär da net noch so ne doofe Facharbeit zu machen) ... naja, deswegen bin ich zur zeit ziemlich häufig am Fragen-stellen ...
In unserem OS ist der Timer so initialisiert, dass er mit einer Frequenz von etwa 1000 Hz den IRQ0 auslöst. Nun wollen wir Multitasking implementieren, das Problem ist nur, dass im Diskettentreiber der Timer zum Warten einer bestimmten Zeit benötigt wird. Wie kann ich denn den IRQ0 zum Timen von Millisekunden und gleichzeitg noch zum Timen von Taskswitches nutzen, ohne dass 1000 Taskswitches pro Sekunde ablaufen ?

Gruß,
 Cheebi
12
Lowlevel-Coding / API-Implementierung
« am: 29. March 2007, 12:20 »
Hi Leute,

ich hab mich um die API in unserem OS gekümmert, nur stört mich irgendwie die Vorgehensweise. Ich habe einen bestimmten RAM-Bereich, in dem sind einfach nur Zeiger auf Kernel-Funktion abgelegt. Außerdem habe ich eine Bibliothek, die alle Kernel-Funktionen enthält, die wiederum die eigentlichen Kernel-Funktionen über die Informationen aus dem RAM-Bereich aufrufen. (naja, eigentlich egal)
Was ich nun wissen möchte, ist ob ihr das Problem der API ähnlich gelöst habt, oder ob ihr auf Softwareinterrupts zurückgreift, um Funktionen aus dem Kernel aufzurufen. Erklärt also einfach mal die Funktionsweise eurer API, bitte.

Gruß Cheebi
13
Lowlevel-Coding / Gleitkommaberechnung
« am: 26. March 2007, 23:48 »
Hi,

sagt mal, kann ich nicht eine einfach Division wie zum Beispiel 5 / 2 im OS benutzen, ohne auf die FPU zurückgreifen zu müssen?
Weil bei mir ergibt folgender Code immer Null:

  sGDTInfo->ProzentBelegt = (int)(((AnzEintr / MAX_DESCS)*100));

Kann dafür kein richtiges Ergebnis kommen, wenn ich nicht irgendetwas spezielles aktiviere?

Gruß Cheebi
14
Lowlevel-Coding / FDC reagiert auf manchen PCs nicht...
« am: 02. January 2007, 12:57 »
Hallo,
ich habe einen FDC-Treiber geschrieben. Nun... Auf meinem einen PC und auf dem Emulator funktioniert er. Auf einem anderen PC funktioniert der Treiber nicht.
Es werden Befehle an den FDC geschickt, z.B. 0x0f aber der FDC reagiert nicht. Die Ports stimmen, erstens da ich unter Windows an dem PC die Ports vom FDC nachgeschaut habe und weil der Treiber ja auch auf einem anderen PC funktioniert.
Nur, warum nicht auf diesem PC hier? :?
Er reagiert einfach nicht auf die Befehle, da ich z.B. den Motor anschalten, nicht aber recalibrieren kann...

Cheebi
15
Lowlevel-Coding / VESA-Modus 0x118 und Emulatoren
« am: 24. December 2006, 11:05 »
Hallo,

mein OS unterstützt den VESA-Modus 0x118. Aber leider unterstützt ihn mein Emulator quemu nicht. Gibt es andere Emulatoren, die den Grafikmodus unterstützen oder kann ich irgendwelche Erweiterungen einbauen, dass ich nicht immer extra einen anderen PC starten muss, um mein OS zu testen?

Cheebi
16
Offtopic / Der Editor "Context"!?
« am: 04. November 2006, 15:12 »
Hallo Leute,

heut habe ich keine Frage, sondern nen Tip! Ich benutze den Editor Context http://www.context.cx.
Dieser Editor ist so wahnsinnig gut!!! Kann ich nur allen empfehlen. Wirklich alles, was man sich wünscht, ist eingebaut und er wird auch immer weiter entwickelt. (Der Editor ist kostenlos).
Man kann seine Projekte einfügen, bekommt direkt Konsolenausgaben angezeigt, kann verschiedenste Syntaxen von Programmiersprachen hervorheben lassen, etc. ...
Wirklich super dieser Editor...! Muss einfach mal Werbung machen, weil einem viel zu oft Sch**** verkauft wird und kann doch kostenlos wirklich Qualität bekommen, nur muss man die immer suchen... naja, Context ist jedenfalls von wirklich hoher Qualität!

Gruß Cheebi
17
Lowlevel-Coding / CPU-Type Codeabschnitt
« am: 10. October 2006, 19:14 »
Hallo,

ich suche nach einem Codeabschnitt, der mir sagen kann, ob ein 386 oder höher Herr im Hause ist. In der Lowlevel-Ausgabe1 fand ich folgenden Codeabschnitt:
Ich habe eine Zeile markiert, in der ein Befeh meiner Meinung nach unnötig ist. Außerdem prüft mir dieser Codeabschnitt auf 286+ und nicht, wie angegeben, 386+.

; determine CPU type. Code from Freedows 98 ldr_asm.asm
; Copyright (C) 1997 Joachim Breitsprecher
cpu_check:

cli
pushf
pushf
pop ax
mov bx,ax     
and ax,0x0FFF
or bx,0x7000   
push ax       
popf
pushf
pop ax         
push bx       
popf
pushf
pop bx         
popf
and ax,0xF000     ; diese Zeile ist nicht nötig, um cmp ax, 0xf000 auszuführen und um zum gleichen Ergebnis zu kommen, oder?
cmp ax,0xF000
je not_386     
test bx,0x7000
jne is_386plus

not_386:

Bitte um Hilfe,

Cheebi
18
Lowlevel-Coding / Was bedeutet das in Qemu?
« am: 26. September 2006, 16:07 »
Hallo,

ich würd gerne wissen, was es bedeutet, wenn ich bei Qemu nach Eingabe von "info pic" follgende Informationen erhalte:

(qemu) info pic
pic0: irr=01 imr=fd isr=02 hprio=0 irq_base=00 rr_sel=0 elcr=00 fnm=0
pic1: irr=00 imr=ff isr=00 hprio=0 irq_base=00 rr_sel=0 elcr=0e fnm=0


Was haben die einzelnen Kürzel zu bedeuten?

Cheebi
19
Lowlevel-Coding / Speicherbereich über 1MB
« am: 14. September 2006, 16:11 »
Hallo,

wenn ich im Real-Mode über den BIOS-Interrupt 013h einen Sektor von Diskette an die Stelle [es:bx] im RAM lade, darf dann [es:bx] auch auf eine höhere Speicherstelle als 1MB zeigen? Weil, wie kann man denn sonst den 32-Bit-Kernel im RM an eine höhere Adresse als 1MB laden, was ja nun einige Kernel sind...

Gruß Cheebi
20
Hallo,

ich habe nun die IDT geladen. Sie enthält die Infos zu 15 Interrupts und einem IRQ (IRQ1).
Auf einem Intel Pentium Rechner klappt alles, solange ich keine Taste drücke (also, solange kein IRQ1 auftritt). Wenn der eintritt, wird plötzlich bevor noch der IRQ1 abgearbeitet wird, Interrupt 8 ausgelöst. Also die Exception für Double Fault (was auch immer das ist).
Wenn ich das ganze auf einem AMD Rechner laufen lasse, wird schon beim Aktivieren der Interrupts die Exception 13 ausgelöst. (General Protection Exception(Triple Fault))  Woher das kommt, kann ich mir nicht erklären. Ich habe nur 2 Segmente (Ring00) in der GDT. Und die Ints in der IDT sind auch alle Privelegelevel 0.
Das kann ich mir einfach nicht erklären. An der IDT kanns eigentlich nicht liegen, da die Exceptionhandler ja auch gelesen werden können.

Gruß Cheebi
Seiten: [1] 2

Einloggen