Forum
Tipps
News
Menu-Icon

[ASM] RAM und PORTS (Protected Mode - Real Mode)

Hi,

ich hab ne frage wie das mit dem Protected Mode aussieht.
Ich weiss schonmal das man da keine Interrupts benutzen kann und das man dat mit PORTS macht.
Nur woher weiss unter welcher Adresse welcher Port liegt der zuwas gehört und was man für werte lesen bzw schreiben soll.
Gibt es irgendwo so eine PORT-Liste so ähnlich wie Interrupt listen und so.

Und noch ne Frage.. gibts irgendwo auch eineliste der Speicher Adressen wie: RAM, VideoRAM usw.

Danke im vorraus..

MFG
TOMEK 

« Letzte Änderung: 17.02.07, 16:56:29 von Sniper-Hawk »

Antworten zu [ASM] RAM und PORTS (Protected Mode - Real Mode):

Also eine Liste der zur verfügung steheden Ports gibt es, komme nur gerade nicht darauf, wie Du da drann kommst... ^^ Sorry!

Was den Speicher angeht, bin ich mir ziemlich sicher, das es so etwas standardmäßig nicht gibt.

Aber wenn Du schon so Hardwarenah programmieren möchtest, dann bau Dir doch eine Funktion, die das macht....

Musst ja eigentlcih nur auf die Register des Speuichers zugreifen... ^^ ;-P

Lieben Gruss

Daddy

Hat dir diese Antwort geholfen?

Danke ButtonHilfreiche Antwort Button

Das mit der PORT Liste kann ich nirgendso nich finden.
Google... hilft da jetzt auch nicht weiter.

Das mit dem SpeicherAdressen.. da hab ich was gefunden:

Zitat
First 2MB Memory
Convential (Base) Memory:
0x000000 - 0x090000 - Standard RAM
Upper Memory Area(UMA):
0x0A0000 - 0x0AFFFF - Graphics Mode VideoRAM
0x0B0000 - 0x0B8000 - Monochrome Text Mode VideoRAM
0x0B8001 - 0x0BFFFF - Color Text Mode VideoRAM
0x0C0000 - 0x0C8000 - VideoROM BIOS
0x0C8001 - 0x0DFFFF - Adapter board ROM and special-purpose RAM(free UMA space)
0x0E0000 - 0x0EFFFF - Additional PS/2 Motherboard ROM BIOS (free UMA in non-PS/2 systems)
0x0F0000 - 0x0F6000 - Motherboard ROM BIOS
0x0F6001 - 0x0FE000 - IBM Casette BASIC ROM (will be Adapter board ROM in IBM compatibles)
0x0FE001 - 0x0FFFFF - Motherboard ROM BIOS
Extended Memory:
0x100000 - 0x10FFFF - high Memory Area (HMA), if HIMEM.SYS is loaded.
Extended Memory Specification (XMS) Memory:
0x110000 - 0x1FFFFF - Standard RAM
Zitat
In der Liste sind die logischen Speicheradressen für ein System ab 16 Bit zuerkennen. Um Platz zu sparen, wurden hier nur die ersten zwei MByte dargestellt. Tatsächlich umfasst der Speicher natürlich sämtliche adressierbaren Speicherbereiche.

Arbeitet der Prozessor im Real Mode, ist lediglich der 1-MByte-Bereich adressierbar. Nur im Protected Modekann auf die kompletten 16 MByte, 1.098 MB oder auch 65,536 Mbyte an Speicher zugegriffen werden.
Hmm... dann muss ich wohl logisch draus schlussvolgern das alles nach 0x1F0000 freier RAM Speicher ist.
Ich bin in der sache ein neueinsteiger dehalb nicht aufregen wenn ich da irgendwie total vergriffen habe...

MFG
TOMEK

Hat dir diese Antwort geholfen?

Danke ButtonHilfreiche Antwort Button

Wenn meine annahme stimmt dann sollte diese Tabelle dann auch stimmen:

Zitat
RAM         Anzahl der Adressen   Letzte Adresse
            
2MB           32         0x001FFFF
4MB           64         0x003FFFF
8MB           128         0x007FFFF
16MB           256         0x00FFFFF
32MB           512         0x01FFFFF
64MB           1024         0x03FFFFF
128MB        2048         0x07FFFFF
256MB        4096         0x0FFFFFF
512MB        8196         0x1FFFFFF
1024MB        16392         0x3FFFFFF
2048MB        32784         0x7FFFFFF
4096MB     65568         0xFFFFFFF

MFG
TOMEK
   
« Letzte Änderung: 15.02.07, 21:49:59 von Sniper-Hawk »

Hat dir diese Antwort geholfen?

Danke ButtonHilfreiche Antwort Button

Weiss wirklich niemand was davon ?  :(
 

Hallo,

was genau hast du vor?

Willst du aus dem Protected-Mode Real-Mode Interrupts aufrufen? Oder brauchst du bloss den hohen Speicher?

Die meisten Ports sind vordefiniert ... z.B. DMA-Controller, Zeitgeber, GraKa, Keyboard, Serielle Schnittstelle etc. aber dafür gibt es die Dokumentation im Netz.

Wo schaltest du in den Prot-Mode? Von DOS aus?

Bis denne...

Feyd

Hat dir diese Antwort geholfen?

Danke ButtonHilfreiche Antwort Button
Zitat
Willst du aus dem Protected-Mode Real-Mode Interrupts aufrufen?
Nee das will ich ja nicht. Ich wil ja eher mit Hardware Ports arbeiten. Nur sdas problem ist ich hab NIRGENDSWO eine gute und vollständige liste mit Ports gefunden !
Zitat
Wo schaltest du in den Prot-Mode? Von DOS aus?
Wenn du MS-DOS meinst. Nein. Ich schalte über mein Kernel in den PMode. Über MS-DOS wäre das etwas komisch und irgendwie auch unmöglich  ;) oder ?

Alsoo weiss vielleicht jemand wo es so eine Liste/Dokumentation gibt ?

Und dann noch was zum Speicher:
Ich hab ja hier die RAM-Adressen liste der ersten 2MB gepostet. M;ehr hab ich auch nicht herausgefunden. Da wir ja alle wissen hat der RAM natürlich mehr als 2MB ;D
Hatte ich mir eine eigene fortsetzung darstellen wollen. Nur meine Frage ist da. Ob das auch der realen RAM-Adressierung entspricht.

MFG
TOMEK 
« Letzte Änderung: 24.02.07, 08:57:47 von Sniper-Hawk »

Hallo nochmal,

als beste Referenz für Ports und deren Ansteuerungen würde ich mir z.B. den Quellcode von "Bochs" schnappen. Dort sind ja alle Standardgeräte ziemlich genau abgebildet. Oder du nimmst die einzelnen Datenblätter von den Bausteinen z.B. DMAController (8237) etc.

Das bedeutet aber auch das du alle Gerätetreiber selbst tippen musst ... das dauert sicher etwas länger.  ;)

Zum RAM:
Da deine Liste die ersten 2MB eines DOS-Systems zeigen, bin ich davon ausgegangen das dein Program von DOS aus gestartet wird und dann natürlich deine Kernel in den PM schaltet. Falls du aber einen eigenen Bootloader hast (nicht von DOS aus umschaltest) kannst du alles nach dem ersten MByte benutzen. Falls du aber von DOS als Grundlage ausgehst und auch dorthin wieder zurück möchtest musst du dich mit der 'himem.sys' auseinander setzten um nicht deren Speicherbereich zu überschreiben.
(ich glaub INT 2Fh ?!?).

Ich hoffe ich konnten helfen  ;)

Feyd

Hat dir diese Antwort geholfen?

Danke ButtonHilfreiche Antwort Button

Danke. Hast mir etwas mehr überblick geschaffen  :D

Ja ich hab ein eigenen Bootloader.

Zitat
Das bedeutet aber auch das du alle Gerätetreiber selbst tippen musst ... das dauert sicher etwas länger.   ;)
Bin grad dran ein Tastaturtreiber zu schreiben....

Zitat
als beste Referenz für Ports und deren Ansteuerungen würde ich mir z.B. den Quellcode von "Bochs" schnappen
hab ich jetzt durchgelesen aber... Hab nirgendswo im Quellcode etwas gefunden...

MFG
TOMEK

Im aktuellen Snapshot "\iodev" dort liegen die Sourcen.
Zusätzlich sind die Linux-Kernelquellen sicher auch interessant in hinsicht auf die Ansteuerung der Geräte.

Aber falls du Fragen zu Geräten hast kannst ja einfach schreiben... ist zwar schon 10 Jahre her das ich soetwas (wie du jetzt) gemacht habe, aber ich denke ein paar Sachen bekomme ich noch hin. :D

Was hast du überhaupt vor?!? Ein eigenes Betriebssystem?  ;)

Wichtig ist das du vor dem setzen des Interrupt-Flags im PM die IRQ's auf andere Interrupts umleitest und die A20-Leitung zuschaltest.
Aber ich denke das hast du schon getan, ansonnsten wäre der Tastaturtreiber ja schwierig. :)

Bis denne

Feyd
 

Hat dir diese Antwort geholfen?

Danke ButtonHilfreiche Antwort Button
Hier
ist ein teil von meinem Tastaturtreiber.... is ja nur ein planungs ding.

Zitat
Was hast du überhaupt vor?!? Ein eigenes Betriebssystem? ;)
BINGO ! ;D

Zitat
Wichtig ist das du vor dem setzen des Interrupt-Flags im PM die IRQ's auf andere Interrupts umleitest und die A20-Leitung zuschaltest.
Aber ich denke das hast du schon getan, ansonnsten wäre der Tastaturtreiber ja schwierig. :)

Ahh... das lustige ist ja.... ich beiß mich erst durch das PM Tutorial durch  ;D

MFG
TOMEK

Deine Idee ist schon ganz gut...

bloss wird es so nicht gemacht.  :-\
Ich sehe aus deinem Code das du immerzu versuchst die Tastatur auszulesen. Das ist nicht gut im Multitaskingbetrieb da du nur unnötig Zeit verschwendest die für andere Applikationen verwendet werden könnte.

Die Lösung:  ;D
Die Tastatur hat den IRQ1. Wenn die Tastatur etwas im Ausgabepuffer hat wird ein Interrupt ausgelöst.

Folgendes sollte dann im Interrupthandler ausgeführt werden:
- Wurde der IRQ von der Hardware aufgerufen? -> Nein=Interrupt beenden
- Ist ein Zeichen im Ausgabepuffer der Tastatur vorhanden. (Port 64 Bit 0) -> Nein=Interrupt beenden
- Scancode auslesen (Port 60)
-> Scancode durch vorhergehende Tastendrück (evtl. Shift etc.) in ASCII umwandeln und in den Puffer der Applikation einfügen
- IRQ bestätigen
- Interrupt beenden

Puhhh! :) Sieht schlimmer aus als es ist.  :o

Bis denne...

Feyd

Hat dir diese Antwort geholfen?

Danke ButtonHilfreiche Antwort Button
Zitat
- Wurde der IRQ von der Hardware aufgerufen? -> Nein=Interrupt beenden
- Ist ein Zeichen im Ausgabepuffer der Tastatur vorhanden. (Port 64 Bit 0) -> Nein=Interrupt beenden

Das kommt mir irgendwie komisch vor...
Wieso soll man nach dem IRQ prüfen wenn man immer prüfen kann ob etwas im Ausgabepuffer ist ?

Wie ich dass verstanden habe könnte man das wie volgt aufbauen:

- Port 0x0064 Prüfen.
Wenn Bit 0:
-Taskwechsel
Wenn Bit 1:
-Scanncode in Port 0x0064 lesen
-Wert an einen AllgemeinenTastaturpuffer schicken

Dann wäre doch das mit dem IRQ eig. unnötig.
Oder irre ich mich da mal wieder totaaaal  ;D

MFG
TOMEK
 - 

Nein, der IRQ wird automatisch von der Hardware ausgelöst wenn sich was im Ausgabepuffer der Tastatur befindet. D.H der Prozessor wird automatisch durch den PIC in eine Unterbrechung geschaltet. (wenn Interruprflag gesetzt ist)

Somit ist das ganze Anwendungslos ... also bezieht sich auf keine direkte Anwendung sondern nur auf den Gerätetreiber.
Selbst wenn nun eine Anwendung hängt wird dieser Interrupt ausgelöst und kann die Sachen zeitgerecht umsetzten.

Spätestens wenn du Disketten/Festplatten/USB/Soundkarte/Serielle Schn./Zeitgeber ansprichst musst du auf die IRQ's zurückgreifen.

Deine augenblickliche Variante verschwendet im Augenblick nur Resourcen die die anderen Anwendungen gerne nutzen würden.

Hast du schon Multitasking integriert? Ich frage da der Taskwechsel oft durch den Taktgeber "PIT" (IRQ0) vollzogen wird. Bei den Sachen die ich kenne. :D

Bis denne...

Feyd

Hat dir diese Antwort geholfen?

Danke ButtonHilfreiche Antwort Button

Nene.. beim Multitasking bin ich noch nich  ;D

Ok. Wenn ich schon auf IRQ zugreifen soll... wie stelle ich das an ;D
Gibts da auch irgendwelche Adressen. Oder wird das durch das PM irgendwie festgelegt ?!

Alsoo wie ich schon sagte ich kämpfe mich erst im PM Tutorial durch.

MFG
TOMEK


« Ist mein Tastaturtreiber überhaupt legitiem ?Hostnamen als Variable bei batch »
 

Schnelle Hilfe: Hier nach ähnlichen Fragen und passenden Tipps suchen!

Fremdwörter? Erklärungen im Lexikon!
I Mode
I-Mode ist eine in Japan sehr populäre Mobilfunktechnik, mit der Daten wie Bilder oder Spiele übertragen werden können. Im Gegensatz zu UMTS arbeitet sie m...

Modem
Modem ist ein Kunstwort und setzt sich zusammen aus  Modulator und Demodulator. Das Modem wandelt die digitalen Daten des Computers in analoge Daten, die über d...

IP-Adresse
Die IP-Adresse ist eine Adresse in einem Computernetzwerk, das auf dem Internet-Protokoll (IP) basiert. Sie besteht aus vier Zahlenblöcken mit Zahlen von 0 bis 255, ...