Autor Thema: Mehrkernige Prozessoren  (Gelesen 5439 mal)

bitmaster

  • Troll
  • Beiträge: 1 138
    • Profil anzeigen
    • OS-64 = 64 Bit Operating System
Gespeichert
« am: 30. November 2006, 22:01 »
Hallöchen!

Mich interessiert das Thema mehrkernige Prozessoren. Wie sieht das technisch eigentlich aus. Gibt es bei 2-Kern-Prozessoren dann 2 rax, rbx, rcx, rdx, rsi, rdi, rip, usw. Register? Gibt es auch 2 Segmentregister? Das heißt ein Kern befindet sich mit cs:rip woanders als der andere Kern mit cs:rip??? Das kann doch dann aber in die Hose gehen, oder nicht? Wenn 2 Tasks gleichzeitig ausgeführt werden. Z.B. der eine schreibt einen Pixel auf den Schirm und der andere zufälligerweise an der selben Position auch einen. Hat jemand von euch schon mehrkernige Unterstützung in seinem OS?

thx

bitmaster
In the Future everyone will need OS-64!!!

bluecode

  • Beiträge: 1 391
    • Profil anzeigen
    • lightOS
Gespeichert
« Antwort #1 am: 01. December 2006, 11:07 »
hi,

Eine Multicore CPU bootet nur mit einem Core. Du musst dann selbst den zweiten Core aktivieren (meist über den APIC). Jeder Core hat alle Register (general purpose regs, segment regs, gdtr, ldtr, idtr, ... auch tlb) seperat. Jeder Core führt immer zumindest einen anderen Thread aus. Falls auf den gleichen Speicher zugegriffen werden kann, muss man die Zugriffe synchronisieren, ansonsten kann es zu Deadlocks kommen. Dies geht normalerweise über Mutex (mutual exclusion), Semaphore oder Critical Sections. Du brauchst auch für jeden Core deinen eigenen kernel-level Stack (beim stack-based taskswitching).

Dein Beispiel mit dem Pixel ist triffts eigentlich eher nicht, da das gleiche auch passiert, wenn du zwei Prozsse hast, welche nacheinander auf den vram zugreifen. Such einfach mal nach Deadlock, da gibts sehr viel gravierendere Beispiele.
lightOS
"Überlegen sie mal 'nen Augenblick, dann lösen sich die ganzen Widersprüche auf. Die Wut wird noch größer, aber die intellektuelle Verwirrung lässt nach.", Georg Schramm

blitzmaster

  • Beiträge: 77
    • Profil anzeigen
Gespeichert
« Antwort #2 am: 01. December 2006, 15:33 »
weiß nich ob ich das richtig verstanden habe, aber HT (Hyper Threating) hat doch garnix mit 2 Kernen zu tun. Da wird einfach ein 2ter virtualisiert oder?
A / OS PM - THE operating system of the future

Homix

  • Beiträge: 138
    • Profil anzeigen
Gespeichert
« Antwort #3 am: 01. December 2006, 15:43 »
hi, ja aber das wird alles hardwaretechnisch gemacht.
ich denke, dass HT sich genauso programmieren lässt wie DualCore oder 2 echte Prozessoren, evt. sind einige Flags anders gesetzt aber es dürften keine großen Unterschiede vorhanden sein.

Grüsse,
Stefan

bluecode

  • Beiträge: 1 391
    • Profil anzeigen
    • lightOS
Gespeichert
« Antwort #4 am: 01. December 2006, 17:09 »
Die Initialisierung des 2ten "Cores" ist bei HT afaik etwas anders, ansonsten unterscheidet das sich programmiertechnisch nicht. Und ja, bei HT wird der 2te Core nur simuliert, aber trotzallem sind alle regs 2mal vorhanden.
lightOS
"Überlegen sie mal 'nen Augenblick, dann lösen sich die ganzen Widersprüche auf. Die Wut wird noch größer, aber die intellektuelle Verwirrung lässt nach.", Georg Schramm

ST-225

  • Beiträge: 43
    • Profil anzeigen
Gespeichert
« Antwort #5 am: 01. December 2006, 17:52 »
@ T0ast3r: Wäre das nicht mal was für ein genuine-Dokument ?

nooooooooos

  • Beiträge: 734
    • Profil anzeigen
Gespeichert
« Antwort #6 am: 01. December 2006, 17:55 »
Und wenn man den zweiten Core aktiviert, kann man auch gleich alle Register setzen??? Oder zumindest CS:(E/R)IP?

Homix

  • Beiträge: 138
    • Profil anzeigen
Gespeichert
« Antwort #7 am: 01. December 2006, 18:09 »
hi,
ohne mich jetzt mit dem thema ausgiebig beschäftigt zu haben :
ich hab gehört, dass man per APIC den 2ten Core aktivieren muss und dieser dann an einer bestimmten Stelle im Arbeitsspeicher (kann man selbst festlegen ; unter 1 MB Grenze afaik) anfängt Code abzuarbeiten.
Diesen Code muss man halt selbst an diese speicherstelle schreiben.
Der Code sollte halt dann das setzten von registerwerten, initialisierung des 2ten cores in den PMode, IDT aufsetzten, ect. handhaben und den Core in das OS "einführen".

Grüsse,
Stefan

blitzmaster

  • Beiträge: 77
    • Profil anzeigen
Gespeichert
« Antwort #8 am: 01. December 2006, 18:17 »
und woher weiß der Prozessor dann welches Register man laden will? core 1 oder core 2?
A / OS PM - THE operating system of the future

bluecode

  • Beiträge: 1 391
    • Profil anzeigen
    • lightOS
Gespeichert
« Antwort #9 am: 01. December 2006, 18:32 »
Du benutzt immer die Register des Cores auf dem dein Code momentan läuft. Man kann es sich wohl am besten als zwei unterschiedliche Threads/Prozesse vorstellen, die gleichzeitig (und zwar _wirklich_ gleichzeitig, nicht nur mit task-switches zwischen drin) ausgeführt werden.

@stefan2005: Jo so hab ist mir das auch im Hinterkopf geblieben.
lightOS
"Überlegen sie mal 'nen Augenblick, dann lösen sich die ganzen Widersprüche auf. Die Wut wird noch größer, aber die intellektuelle Verwirrung lässt nach.", Georg Schramm

bitmaster

  • Troll
  • Beiträge: 1 138
    • Profil anzeigen
    • OS-64 = 64 Bit Operating System
Gespeichert
« Antwort #10 am: 01. December 2006, 21:16 »
Seit ihr euch da sicher das jeder Core in den gewünschten Modus springen muss und nicht nur ein Sprung ausreicht? Das würde heißen bei einer CPU mit 4 Cores man 4 mal in den gewünschten Modus springen muss? Das wäre doch ziemlicher blödsinn!?

bitmaster
In the Future everyone will need OS-64!!!

Homix

  • Beiträge: 138
    • Profil anzeigen
Gespeichert
« Antwort #11 am: 01. December 2006, 21:37 »
Hi,
nein das stimmt schon so. Die beiden Cores bzw.CPUs sind echte alleinige CPUs und müssen daher auch ganz normal alleine initialisiert werden und über APIC können beide Cores dann miteinander kommunizieren.
Theoretisch kannst du auch, z.B. bei den neuen QuadCores einen Core 16-Bit Code, den anderen 32-Bit Code, den anderen 64-Bit Code und den 4ten was weiss ich ausführen lassen (die kommunikation könnte dann evt bisschen schwieriger werden) :lol:

Noch was: in der Regel sollte der Code, mit dem man z.B. den zweiten Core initialisiert hat auch für die restlichen Cores funktionieren, sprich für den 3ten, 4ten, ect ...

Grüsse,
Stefan

Legend

  • Beiträge: 635
    • Profil anzeigen
    • http://os.joachimnock.de
Gespeichert
« Antwort #12 am: 02. December 2006, 11:08 »
2 CPUs, Dual Core, Hyperthreading, alles mehr oder weniger ähnlich, zumindestens für die Software, um so ähnlicher je höher man programmiert. ;)
*post*

Homix

  • Beiträge: 138
    • Profil anzeigen
Gespeichert
« Antwort #13 am: 03. December 2006, 17:22 »
hi,
Toaster: danke für den überaus sinnlosen Beitrag  :-o

ich werde mal im laufe der nächsten Woche schaun, ob ich was zur initialisierung finde, ich möchte das auch mal in mein OS einbauen
vlt kann ich ja dann darüber n tutorial schreiben, mal schaun. :-D

Grüsse,
Stefan

 

Einloggen