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

Seiten: [1] 2 3 ... 5
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
oh mann... sry, dass ich zu doof war, mir ein wenig einfacheren code einfallen zu lassen   :roll:
Versuch mal -fno-stack-protector beim Compilieren und jo, soviel Code ist schon ein bisschen übertrieben :-)
danke, vielen dank! damit klappts.. so, muss jetzt aber ins bett...

gute nach

Cheebi
3
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
4
Lowlevel-Coding / Re: gcc inline assembler - %%eax %%cr0
« am: 25. May 2008, 02:29 »
ohjeeeeee... VIELEN DANK...
wer kommt denn auch darauf, dass windoofs halt keine 32-bit-version war... das ubuntu, das ich jetzt nutze, aber doch.. es geht jetzt... ich weiß schon warum ich euch liebe  :-D

danke

Cheebi
5
Lowlevel-Coding / Re: gcc inline assembler - %%eax %%cr0
« am: 24. May 2008, 15:28 »
hm... also ich weiß auch nicht... könnt ihr folgendes ohne fehlermeldung copilieren?
test.c:
// test.c
int main()

{

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

}

shellbefehl:
gcc -ffreestanding -c -o test.o test.c
weil das kann ich bei mir nicht compilieren. sollte es bei euch gehen, muss ich mich nach nem anderen assembler umsehen.

Cheebi
6
Lowlevel-Coding / Re: gcc inline assembler - %%eax %%cr0
« am: 24. May 2008, 00:03 »
ach sh**... sry.. hab natürlich schon verstanden was du meintest und auch ausprobiert nur iwie falsch gecopy-pasted...
fehler sind eben wieder die von anfang:
/tmp/cccp1RHB.s:655: Error: suffix or operands invalid for `mov'
/tmp/cccp1RHB.s:657: Error: suffix or operands invalid for `mov'


und dieses mal auch den richtigen code rein kopiert:
 __asm__ volatile ("mov %%cr0, %%eax\n\t"
 "or $0x80000000, %%eax\n\t"
 "mov %%eax, %%cr0\n\t":::"eax");

das interessante ist, dass ich diesen fehler auch bei der zeile hatte:
__asm__ volatile("movl %0, %%cr3\n\t"::"r" (value));da musste ich aus movl dann nur mov machen und schwupps akzeptierte er es.

bei dem zweiten problem hilft das alles nichts.. hängt wohl mit dem spezial regeister cr0 zusammen...

welche version von as nutzt ihr denn?

Cheebi
7
Lowlevel-Coding / Re: gcc inline assembler - %%eax %%cr0
« am: 23. May 2008, 22:59 »
hm.. nö.. bei mir irgendwie nicht weil sonst erfolgen wieder mehrere fehler

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

mem.c:103: Fehler: ungültiges »asm«: Operandenzahl fehlt hinter %-Buchstabe
mem.c:103: Fehler: ungültiges »asm«: Operandenzahl fehlt hinter %-Buchstabe
mem.c:103: Fehler: ungültiges »asm«: Operandenzahl fehlt hinter %-Buchstabe
mem.c:103: Fehler: ungültiges »asm«: Operandenzahl fehlt hinter %-Buchstabe
mem.c:103: Fehler: ungültiges »asm«: Operandenzahl fehlt hinter %-Buchstabe


gruß

Cheebi

ps: ich nutze version 2.18.0 von gnu-as
8
Lowlevel-Coding / Re: gcc inline assembler - %%eax %%cr0
« am: 23. May 2008, 15:10 »
hm.. danke für die schnelle antwort, aber der fehler ist nicht behoben. der code sieht nun so aus:

__asm__ volatile ("mov %cr0, %eax\n\t"

 "or $0x80000000, %eax\n\t"

 "mov %eax, %cr0\n\t":::"eax");

und die fehlermeldung:
mem.c:103: Fehler: ungültiges »asm«: Operandenzahl fehlt hinter %-Buchstabe
mem.c:103: Fehler: ungültiges »asm«: Operandenzahl fehlt hinter %-Buchstabe
mem.c:103: Fehler: ungültiges »asm«: Operandenzahl fehlt hinter %-Buchstabe
mem.c:103: Fehler: ungültiges »asm«: Operandenzahl fehlt hinter %-Buchstabe
mem.c:103: Fehler: ungültiges »asm«: Operandenzahl fehlt hinter %-Buchstabe


das verrückte ist ja, dass der ursprüngliche code mit djgpp unter windows compilierte. nur die linux-gcc-version streikt.

hilfe

Cheebi
9
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
10
Lowlevel-Coding / Re: kurze frage zu make
« am: 20. May 2008, 10:34 »
vielen dank.. das is perfekt..

Cheebi
11
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
12
hm.. also das Problem is gelöst... Ich habe nur vergessen, dass ich zuerst den RAM durchzählen muss, bevor ich die Pages NOT_PRESENT setze, die physikalisch nicht vorhanden sind...
Eine letzte Frage habe ich noch, ich will ja nicht ewig nerven *g*:
Wie hat eine Funktion create_PageDir(ushort PID) auszusehen? Sie muss ja irgendwie ein PageDir für einen Prozess erstellen. Könnt ihr mir ein gutes (und einfaches) Hobby-OS  nennen, wo ich mir das ma anschauen kann?

Vieln Dank,

 Cheebi
13
Irgendwie bin ich immer noch schwer mit dem Memorymanagement beschäftigt...
Im Moment versuche ich, nur die tatsächlich vorhanden Pages zu mappen (bei der Initialisierung, um dann das Paging zu aktivieren). Auf meinem Test-PC sind 128MB RAM installiert. Wenn ich diese 1:1 mape, dann gibts nen Neustart (schätzt erst Page-Fault und dann irgendwann Triple-Fault). Das liegt doch bestimmt am Video-Bereich... ich nutze VESA.. deshalb müsste ich doch eig. auch den Video-RAM mappen, oder? Nur stelle ich das wohl irgendwie falsch an... Ich mape von (LinearFrameBuffer-Begin) bis (LinearFrameBuffer-Beginn + TotalVideoMemory). TotalVideoMemory bekommt man aus dem VesaInfoBlock.
Was soll ich tun? Habe ich einen Denk-Fehler und vegess irgendeinen RAM-Bereich zu mappen, oder sollte ich einfach alles (auch die nicht vorhandenen physikalischen Pages) 1:1 mappen?

Gruß,

Cheebi
14
Gibt 3 Möglichkeiten [...]
* Den ges. physikalischen Adressraum im Kerneladressraum einblenden
* Eine phys. Page auf die zugegriffen wird bei Bedarf in den Kerneladressraum einblenden
* Speziell für die PageDirs/-Tables gibts den Trick, dass du das PageDir des Prozesses als PageTable im Kernel angibst. Damit werden die kompletten 4MB PageTables in den Adressraum eingeblendet.
Ok... Möglichkeit drei gefällt mir, aber kann man das nicht mit Nummer zwei verbinden? Also, ich stell mir das folgendermaßen vor:

Es gibt eine Funktion, der sage ich, auf wessen PD ich zugreifen möchte. Diese lädt mir dann das PD eines Prozesses in einen ganz bestimmten Eintrag des Kernel-PDs. Dann kann ich über ein und den selben 4MB-Frame eines Kernel-PD-Eintrages auf DP + PTs eines Prozesses zugreifen...

So brauche ich nur ein einziges mal virtuelle 4MB, denn sonst würde ja mit Möglichkeit drei, für jeden prozess 4MB virtuelle Adressen benötigt...
Hab ich das richtig verstanden und ist meine Idee möglich?

Gruß,
 Cheebi
15
nochmal danke soweit, jetzt ist mir einiges klarer...

ich habe aber mmer noch ein großes Problem:

angenommen ich will einen neuen prozess starten, dann reserviere ich auf dem kernelheap genug platz für code- und datensegment des prozesses. wohin aber lade ich das pagedirectory [und die pagetables] für den prozess? auf den heap des kernels darf es nicht, weil der nicht garantiert 4kB-aligned ist... wie löst ihr das problem?

Cheebi
16
danke
17
ohje.. warum funktioniert das denn nicht:

  typedef struct SMEMHEADER
  {                           
    SMEMHEADER  *prev;                 // vorheriges Element in der Liste  [**** error ****]
    SMEMHEADER  *next;                 // nächstes Element in der Liste
    ulong       size;                  // Größe des Speicherblocks
    ulong       id_val:31;             // ID-value - zum Erkennen des Headers
    bool        used:1;                // used : frei ? genutzt
  } SMEMHEADER;

Ausgabe von gcc:

parse error before 'SMEMHEADER'             [in Zeile ****error****]

das liegt ja wahrscheinlich daran, dass der typ von next und prev in dem moment erst deklariert wird, oder? wie löst ihr das problem?

Cheebi
18
danke ihr beiden,

aber ganz klar, wie der kernel die pages in das PD des prozesses mappt ist mir immer noch nicht... Ich dachte, ich habe eine art kernel-heap, wo der kernel den code und die daten für seine prozesse unterbringt. diesen heap verwaltet er einfach ganz normal. wird nun ein prozess gestartet, so wird ein bestimmter bereich des heaps genutzt, um die prozessdaten unterzubringen. dann erstelle ich ein neues PD, in dem nur ein paar wenige pages present sind. diese pages enthalten den code und die daten und wurden sozusagen "aus" dem heap des kernels in das PD des prozesses gemappt. meine frage ist aber, wie kann ich einen syscall machen (bei dem logischerweise cr3 nicht geändert wird) und dabei auf den heap des kernels zugreifen, um notfalls neue bereiche in das prozessPD zu mappen?

Cheebi
19
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
20
Lowlevel-Coding / Re: C-Kernel Problem
« am: 11. August 2007, 11:59 »
Versuchs mal mit den tausend anderen Threads die wegen diesem sch*** Tutorial gestartet worden sind ...

http://lowlevel.brainsware.org/forum/index.php?topic=1836.msg21100#msg21100

Wenn du das nicht verstehst, frag nach ... war ja schließlich nur ne Antwort auf ne ähnliche Frage ...

Cheebi
Seiten: [1] 2 3 ... 5

Einloggen