Autor Thema: wieder mal ein paar fragen  (Gelesen 3925 mal)

zacK

  • Beiträge: 216
    • Profil anzeigen
    • http://www.domae.ch
Gespeichert
« am: 11. October 2004, 16:39 »
hiho... ;)

1. bis wo geht die lineare adresse im rm ?

2. wenn ich etwas an die stelle 0x10000 laden will, muss ich doch das segment auf 0x1000 und das offset auf 0 stellen?

3. wenn ich nun im kernel anfangen zu coden will. muss ich zuerst alle segmente updaten (es, ds, fs, gs,...) oder reicht es wenn ich nur [org 0x....] schreibe?

lauter anfänger fragen aber es wäre mir sehr nützlich wenn diese jemand kurz beantworten würde ...

meine vermutungen:
1. Bis 0x100000
2. ja
3. beides
....


pls help

hannibal

  • Host
  • Beiträge: 400
    • Profil anzeigen
    • brainsware - the rock.
Gespeichert
« Antwort #1 am: 11. October 2004, 16:52 »
ad 3: afaik genuegts, wenn du org 0x.... schreibst
\\o
o//
\o/

Roshl

  • Beiträge: 1 128
    • Profil anzeigen
    • http://www.lowlevel.net.tc
Gespeichert
« Antwort #2 am: 11. October 2004, 17:42 »
1. 0xFFFFF ist die maximale Addresse danach kommt der Wrap-Around des A20;)
2. Richtig
3. Wenn dein Kernel dann bei 0x1000:0 liegt->
DS,ES auf 0x1000 FS,GS nur wenn du sie verwendest, die Standartbefehle des Prozessors wie lodsx verwenden die nicht.
Das org brauchst du nur wenn dein Kernel dann nicht bei Offset 0 anfängt.
[schild=1]Wieder ein wertvoller(?) Beitrag von Roshl[/schild]

zacK

  • Beiträge: 216
    • Profil anzeigen
    • http://www.domae.ch
Gespeichert
« Antwort #3 am: 11. October 2004, 20:42 »
vielen dank. genau das wollte ich wissen :D

0xFFFFF ist 1 weniger als 0x10000 und entspricht einem megabyte wenn man bei null anfängt zu zählen... ;)

gut. _> begriffen..

TeeJay

  • Beiträge: 630
    • Profil anzeigen
    • http://www.jay-code.de
Gespeichert
« Antwort #4 am: 12. October 2004, 00:33 »
Das org ist nur eine Anweisung für den Compiler:

Angenommen dein Kernel liegt an Adresse 0x1000:0x0

Dann musst du org 0x0 schreiben, weil dein Kernel an Offset 0 beginnt.
Allerdings musst du die Segmentregister auf den Wert 0x1000 setzen.

Sollte dein Kernel jedoch bei 0x1000:0x10 beginnen, dann musst du
org 0x10 schreiben.

Dann weiß der Assembler, das er zu jeder Variablenadresse 0x10 addieren muss.
Weil der Assembler standartmäßig davon ausgeht, das der Code am Offset 0 beginnt und errechnet den Offset der Variblen anhand der Stelle an der sich die Variable in der fertig compilierten Datei befindet.

Angenommen ganz am anfang der compilierten datei wäre eine Variable, dann hätte diese die Adresse 0x0.
Wenn dein Kernel jedoch an Offset 0x10 geladen ist, dann weiß der Assembler mit "org 0x10" das er zu der Adresse 0 noch 0x10 addieren muss. Somit stimmt die Adresse deiner Variablen dann wieder im Speicher.
----------------------
Redakteur bei LowLevel

Roshl

  • Beiträge: 1 128
    • Profil anzeigen
    • http://www.lowlevel.net.tc
Gespeichert
« Antwort #5 am: 12. October 2004, 10:15 »
TJ das wäre auch kürzer gegangen;)
[schild=1]Wieder ein wertvoller(?) Beitrag von Roshl[/schild]

TeeJay

  • Beiträge: 630
    • Profil anzeigen
    • http://www.jay-code.de
Gespeichert
« Antwort #6 am: 12. October 2004, 10:20 »
Ich wollte aber das er es auch versteht :D

Ich bin halt ein Fan des ausführlichen :)
----------------------
Redakteur bei LowLevel

zacK

  • Beiträge: 216
    • Profil anzeigen
    • http://www.domae.ch
Gespeichert
« Antwort #7 am: 12. October 2004, 10:38 »
So ausführlich war genau richtig für mich :D

Roshl

  • Beiträge: 1 128
    • Profil anzeigen
    • http://www.lowlevel.net.tc
Gespeichert
« Antwort #8 am: 12. October 2004, 12:45 »
Aktzepetiert:D
[schild=1]Wieder ein wertvoller(?) Beitrag von Roshl[/schild]

 

Einloggen