Autor Thema: 64bit Kernel  (Gelesen 7042 mal)

DarkThing

  • Beiträge: 652
    • Profil anzeigen
Gespeichert
« am: 17. April 2005, 19:06 »
Wie kann ich eigentlich einen 64bit Kernel erstellen. Braucht man einen anderen Compiler oder kann man dem das einfach mitteilen (ich verwende DJGPP & NASM)? Und wie kann ich erkennen ob der PC eine 32bit oder eine 64bit CPU hat?

Roshl

  • Beiträge: 1 128
    • Profil anzeigen
    • http://www.lowlevel.net.tc
Gespeichert
« Antwort #1 am: 17. April 2005, 19:14 »
Naja Ob 64/32 sollte recht einfach sein. Kann man ja über CPUID ermitteln. Da ist das sicher irgendwo vermerkt.
Wenn du 64Bit verwenden willst musst du unterscheiden ob nur die 64Bit Register oder die Adressierungsart.
Die Register dürfte Nasm&djgpp schon verstehen, aber ob sie mit dem Long-Mode (64-Bit-PM) klarkommen weiss ich nicht.
Momentan ist alles mit 64Bit noch etwas kompliziert, auf den x86ern ist das ja relativ neu.
[schild=1]Wieder ein wertvoller(?) Beitrag von Roshl[/schild]

DarkThing

  • Beiträge: 652
    • Profil anzeigen
Gespeichert
« Antwort #2 am: 17. April 2005, 19:24 »
Wie könnte ich denn nen 64bit Dummy-Kernel schreiben (in ASM oder C)? Nasm hat ein Problem mit [BITS 64] und bei DJGPP hab ich noch nicht mal ne Idee. Gibts irgendwas zu beachten wenn ich jetzt einfach einen 32bit Kernel baue und den später nach 64bit konvertieren will?

Another Stupid Coder

  • Beiträge: 749
    • Profil anzeigen
Gespeichert
« Antwort #3 am: 17. April 2005, 19:39 »
Also als Tipp: Ich würde mich mal nach einem 64Bit-OS wie Linux umsehen, da hast du noch eine wahrscheinlichkeit, dass alle Tools 64Bit beherrschen :)

Legend

  • Beiträge: 635
    • Profil anzeigen
    • http://os.joachimnock.de
Gespeichert
« Antwort #4 am: 19. April 2005, 01:22 »
Was DJGPP angeht - aktuelle GCC Versionen sind 64 bit fähig, also solltest du einen Cross Compiler für 64 Bit aus den Sourcen bauen können - ist wahrscheinlich ein Flag beim ./configure lauf.
*post*

DarkThing

  • Beiträge: 652
    • Profil anzeigen
Gespeichert
« Antwort #5 am: 19. April 2005, 11:54 »
Okay. Wie kann ich jetzt aber erkennen ob der Prozessor 16bit oder 32bit oder 64bit hat? Ich kann ja unterscheiden ob man eine 16bit oder 32bit CPU hat und dann anhalten oder in den PMode wechseln. Aber ich muss noch nen 64bit Prozessor von nen 32er unterscheiden.

joachim_neu

  • Beiträge: 1 228
    • Profil anzeigen
    • http://www.joachim-neu.de
Gespeichert
« Antwort #6 am: 19. April 2005, 13:29 »
Wie wird das überhaupt gemacht? Früher stellt man ja anhand von [BITS X] fest, welche Basisgröße die normalen Register haben, sodass der Assembler dann immer 0x66 vorgesetzt hat, wenn es mal nicht das war, und so dann erkannt hat, ob man EAX oder AX meint. Wie ist das mit 64 Bit eigendlich? Hat man da alles umgebaut? Weil das geht ja mit nur einem Präfix nimmer...
http://www.joachim-neu.de | http://www.orbitalpirates.de | http://www.middleageworld.de

System: 256 RAM, GeForce 2 MX 400, AMD Athlon XP 1600+, Windows XP, 1x Diskette, 1x DVD-ROM, 1x CD-R(W) Brenner,...

Legend

  • Beiträge: 635
    • Profil anzeigen
    • http://os.joachimnock.de
Gespeichert
« Antwort #7 am: 19. April 2005, 13:37 »
Nun, jede x64 CPU sollte CPUID beherrschen, deswegen würde ich diese Instruktion dafür benutzen als 1. Idee, vielleicht gibt es aber noch ne einfachere.
*post*

Jidder

  • Administrator
  • Beiträge: 1 625
    • Profil anzeigen
Gespeichert
« Antwort #8 am: 19. April 2005, 13:43 »
das mit dem [BITS XYZ] ist was NASM spezifisches. andere assembler haben dafür andere befehle. der NASM unterstützt kein 64 bit, der YASM schon. der hat dann auch wieder die direktive [BITS 64].

eine 64 bit cpu (genauer gesagt einen AMD64) erkennst du so: (laut AMD64 Manual)
mov eax, 0x80000000
cpuid
cmp eax, 0x80000000 ; sind 0x8000000?-CPUID-funktionen verfügbar
jbe no_long_mode
mov eax, 0x80000001
cpuid
bt edx, 29 ; long mode bit testen ...
jnc no_long_mode

; => wir haben 64 bit ...

no_long_mode:
; => wir haben kein 64 bit ...




die adress größe der instruktionen ist ohne 0x67-präfix 64 bit, mit präfix 32 bit. 16 bit gibts nicht. für die operand größe gibt es neue präfixes. dazu wurden die 1 byte großen instruktionen INC und DEC entfernt und werden nun als präfix verwendet. wo das 0x66 präfix gelandet ist weiss ich jetzt auch nicht so schnell ...
das steht sicherlich im AMD64 Manual "Volume 1: Application Programming" unter punkt 3.4 oder so ...
Dieser Text wird unter jedem Beitrag angezeigt.

DarkThing

  • Beiträge: 652
    • Profil anzeigen
Gespeichert
« Antwort #9 am: 19. April 2005, 15:56 »
Thx. Thx. Thx. Der 64bit Kernel kann ja erstmal warten. Hauptsache man kanns erkennen. Läuft absolut problemlos :D Ich werd dann mal das AMD Doc überfliegen..

 

Einloggen