runtime error 216 bei absoluter Variable

Für Fragen zur Programmiersprache auf welcher Lazarus aufbaut
turbo
Lazarusforum e. V.
Beiträge: 99
Registriert: Mo 6. Feb 2012, 17:20
OS, Lazarus, FPC: ubuntu 10.10, L 0.9.28.2, FPC 2.4.0
CPU-Target: x86_64
Wohnort: Oldenburg (Oldb)

runtime error 216 bei absoluter Variable

Beitrag von turbo »

Moin,

bei Ubunutu 10.10
fpc 2.4.0 64-Bit

erzeugt dieses Programm

Code: Alles auswählen

program ReadBIOSVar;
 
var
  BIOSTimerVar : longword absolute $046C; // $0040:$006C
 
begin
  writeln(BIOSTimerVar);
  writeln(BIOSTimerVar);
  writeln(BIOSTimerVar);
  writeln(BIOSTimerVar);
  writeln(BIOSTimerVar);
  readln;
end.
eine Allgemeine Schutzverletzung.
216 General Protection fault
The application tried to access invalid memory space. This can be caused by several problems:

1. Deferencing a nil pointer
2. Trying to access memory which is out of bounds (for example, calling move with an invalid length).
http://community.freepascal.org:10000/d ... rch14.html" onclick="window.open(this.href);return false;

1. Warum?
2. Was muss ich dagegen tun?

Danke.

PS:Warum geht die Signatur nicht?
Liebe Grüße
turbo

Benutzeravatar
theo
Beiträge: 10904
Registriert: Mo 11. Sep 2006, 19:01

Re: runtime error 216 bei absoluter Variable

Beitrag von theo »

Was willst du denn da mit absolute?

Meinst du nicht eher

Code: Alles auswählen

var
  BIOSTimerVar : longword = $046C; // $0040:$006C

turbo
Lazarusforum e. V.
Beiträge: 99
Registriert: Mo 6. Feb 2012, 17:20
OS, Lazarus, FPC: ubuntu 10.10, L 0.9.28.2, FPC 2.4.0
CPU-Target: x86_64
Wohnort: Oldenburg (Oldb)

Re: runtime error 216 bei absoluter Variable

Beitrag von turbo »

theo hat geschrieben:Was willst du denn da mit absolute?
Ich habe das erst mal so probiert, wie ich das vor gut 20 Jahren auch mit Turbo Pascal unter Dumm-Dos gemacht hätte.

Ich will der Variable keinen Wert zuweisen sondern ich will die Variable an einer bestimmten Stelle im Speicher ablegen. Ich will eigentlich nur lesen. Schreiben tut ja der Interrupt 1A.
Liebe Grüße
turbo

Socke
Lazarusforum e. V.
Beiträge: 3178
Registriert: Di 22. Jul 2008, 19:27
OS, Lazarus, FPC: Lazarus: SVN; FPC: svn; Win 10/Linux/Raspbian/openSUSE
CPU-Target: 32bit x86 armhf
Wohnort: Köln
Kontaktdaten:

Re: runtime error 216 bei absoluter Variable

Beitrag von Socke »

turbo hat geschrieben:
theo hat geschrieben:Was willst du denn da mit absolute?
Ich habe das erst mal so probiert, wie ich das vor gut 20 Jahren auch mit Turbo Pascal unter Dumm-Dos gemacht hätte.
Bist du dir sicher, dass Ubuntu dir da den Speicherzugriff genau so wie DOS vor 20 Jahren erlaubt?
MfG Socke
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein

Christian
Beiträge: 6079
Registriert: Do 21. Sep 2006, 07:51
OS, Lazarus, FPC: iWinux (L 1.x.xy FPC 2.y.z)
CPU-Target: AVR,ARM,x86(-64)
Wohnort: Dessau
Kontaktdaten:

Re: runtime error 216 bei absoluter Variable

Beitrag von Christian »

Also Speicherzugriffe ausserhalb des eigenen Addressraums erzeugen ne Access Violation das ist schon seit weit mehr als 20 Jahren so.
Wenn man das machen will muss man nen Treiber schreiben.
W.m.k.A.h.e.m.F.h. -> http://www.gidf.de/

turbo
Lazarusforum e. V.
Beiträge: 99
Registriert: Mo 6. Feb 2012, 17:20
OS, Lazarus, FPC: ubuntu 10.10, L 0.9.28.2, FPC 2.4.0
CPU-Target: x86_64
Wohnort: Oldenburg (Oldb)

Re: runtime error 216 bei absoluter Variable

Beitrag von turbo »

Moin,

schon mal vielen Dank soweit.
Socke hat geschrieben:Bist du dir sicher, dass Ubuntu dir da den Speicherzugriff genau so wie DOS vor 20 Jahren erlaubt?
das hört sich recht rhethorisch an. :wink:
Nein, dann hätte ich den Thread nicht eröffnet.
Christian hat geschrieben:Also Speicherzugriffe ausserhalb des eigenen Addressraums erzeugen ne Access Violation das ist schon seit weit mehr als 20 Jahren so.
Wenn man das machen will muss man nen Treiber schreiben.
Das war in dem Sinne ein Vorteil von DOS, dass es faktisch nur einen Adressraum gab - da war man dann immer im eigenen.
Bevor ein Treiber geschrieben wird, denke ich erst mal über andere Wege nach.

Unter Linux gibt es doch bestimmt so eine Art Int 21h wie unter DOS?
Nach welchen Schlagworten muss ich suchen und gibt es eventuell eine gute deutsche Dokumentation mit Beispiel?

Ein anderer Weg wäre der Einsatz des Assemblerbefehls RDTSC.
Allerdings rät Intel auf Seite Vol. 2B 4-461 im Intel® 64 and IA-32 Architectures Software Developer’s Manual Volume 2 (2A, 2B & 2C) dazu, dass Betriebssysteme diese Freiheit einschränken.

Code: Alles auswählen

Normally, the RDTSC instruction can be executed by programs and procedures
running at any privilege level and in virtual-8086 mode. The TSD flag allows use of
this instruction to be restricted to programs and procedures running at privilege level
0. A secure operating system would set the TSD flag during system initialization to
disable user access to the time-stamp counter.
Auf den 1. Blick scheint Linux den Zugriff darauf zuzulassen. Das läuft ohne Fehlermeldung durch.

Code: Alles auswählen

program readrdtsc;
 
begin
  asm
    rdtsc //Aufruf zulässig?
  end;
  readln;
end.
Wie wahrscheinlich ist es denn, dass mir jemand das TSD-Flag sperrt?
Liebe Grüße
turbo

Benutzeravatar
theo
Beiträge: 10904
Registriert: Mo 11. Sep 2006, 19:01

Re: runtime error 216 bei absoluter Variable

Beitrag von theo »

Möchtest du nicht einfach mal beschreiben, was du am Ende erreichen willst?

Ganz im Sinne von http://www.tty1.net/smart-questions_de.html#goal" onclick="window.open(this.href);return false;

turbo
Lazarusforum e. V.
Beiträge: 99
Registriert: Mo 6. Feb 2012, 17:20
OS, Lazarus, FPC: ubuntu 10.10, L 0.9.28.2, FPC 2.4.0
CPU-Target: x86_64
Wohnort: Oldenburg (Oldb)

Re: runtime error 216 bei absoluter Variable

Beitrag von turbo »

Danke für den Hinweis.

Ziel:
Ich suche einen aufsteigendem Zähler mit Zeitbezug, der in einen 64-Bit Integer Wert passt und den ich sehr einfach und möglichst schnell abfragen kann.
Es soll möglichst kein Zugriff auf die Uhr erfolgen.
Es reicht aus, wenn sich aus dem Zähler auf einen Zeitbezug mit einer Auflösung in der Größenordnung von 0,1 Millsekunden bis 2 Sekunden zurückschließen lässt.

Der Zähler soll unter Ubuntu ab 10.10, Windows 7, Windows XP SP2 auf Prozessoren
entweder ab Pentium 3 bzw. AMD Athlon 64 (bevorzugt) oder alternativ
ab Intel i5 und entsprechenden AMD-Prozessoren verfügbar sein.

Zu möglichst schnell:
In einem Testprogramm sollen zunächst 1 Mio. und anschließend 1 Mrd. Zählerabfragen in ein Array geschrieben werden.


Hintergrund:
Der Zähler ist Teil einer ID. Diese ID ist ein Schlüssel. Normalerweise hat man in der binären Suche nach Schlüsseln eine Teilung von Intervallen in der Mitte. Mit dem Zeitbezug des Schlüssels soll die binäre Suche optimiert werden. Die Teilung soll dann nicht 50/50 sein sondern z.B. 99/1.


Reicht das so an Infos aus?
Liebe Grüße
turbo

Benutzeravatar
theo
Beiträge: 10904
Registriert: Mo 11. Sep 2006, 19:01

Re: runtime error 216 bei absoluter Variable

Beitrag von theo »

turbo hat geschrieben: Reicht das so an Infos aus?
Ich denke so kann man besser eine Lösung finden.
Ich bin nicht Spezialist dafür, mir fällt GetTickCount in Unit LCLIntf ein.
Ob das deinen Ansprüchen genügt, muss du selber herausfinden.

Vllt. hat jemand noch einen anderen Vorschlag.

Socke
Lazarusforum e. V.
Beiträge: 3178
Registriert: Di 22. Jul 2008, 19:27
OS, Lazarus, FPC: Lazarus: SVN; FPC: svn; Win 10/Linux/Raspbian/openSUSE
CPU-Target: 32bit x86 armhf
Wohnort: Köln
Kontaktdaten:

Re: runtime error 216 bei absoluter Variable

Beitrag von Socke »

theo hat geschrieben:Ich bin nicht Spezialist dafür, mir fällt GetTickCount in Unit LCLIntf ein.
Ob das deinen Ansprüchen genügt, muss du selber herausfinden.
An den habe ich auch zuerst gedacht; Hier gibt es eine Auflösung zwischen 10 und 16 ms. Es gibt von Windows her seit Vista bzw. Server 2008 auch eine Version mit 64-Bit-Ergebniswert (GetTickCount64), diese wird von dem LCLIntf-Wrapper aber nicht unterstützt.
Sofern kein Windows zum Einsatz kommt, basiert der Wert auf der Funktion Now() und ist damit von der Systemuhr abhängig.
turbo hat geschrieben:In einem Testprogramm sollen zunächst 1 Mio. und anschließend 1 Mrd. Zählerabfragen in ein Array geschrieben werden.
Was sind denn die Anforderungen an das Produktivsystem? Bei deiner geforderten Auflösung von 2 Sekunden brauchst du sowieso fast einen Monat um keine doppelten Werte zu ziehen (für eine maximale Optimierung).
MfG Socke
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein

Benutzeravatar
theo
Beiträge: 10904
Registriert: Mo 11. Sep 2006, 19:01

Re: runtime error 216 bei absoluter Variable

Beitrag von theo »

Socke hat geschrieben:Es gibt von Windows her seit Vista bzw. Server 2008 auch eine Version mit 64-Bit-Ergebniswert (GetTickCount64), diese wird von dem LCLIntf-Wrapper aber nicht unterstützt.
Hier gibt's das:

Code: Alles auswählen

function GetTickCount64(): QWord;
begin
  Result := lazutf8sysutils.GetTickCount64();
end;

Socke
Lazarusforum e. V.
Beiträge: 3178
Registriert: Di 22. Jul 2008, 19:27
OS, Lazarus, FPC: Lazarus: SVN; FPC: svn; Win 10/Linux/Raspbian/openSUSE
CPU-Target: 32bit x86 armhf
Wohnort: Köln
Kontaktdaten:

Re: runtime error 216 bei absoluter Variable

Beitrag von Socke »

theo hat geschrieben:Hier gibt's das:

Code: Alles auswählen

function GetTickCount64(): QWord;
begin
  Result := lazutf8sysutils.GetTickCount64();
end;
Genau, nur schau dir mal die Funktion lazutf8sysutils.GetTickCount64() an; da wird nur Windows.GetTickCount() aufgerufen.
MfG Socke
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein

Benutzeravatar
theo
Beiträge: 10904
Registriert: Mo 11. Sep 2006, 19:01

Re: runtime error 216 bei absoluter Variable

Beitrag von theo »

Socke hat geschrieben: Genau, nur schau dir mal die Funktion lazutf8sysutils.GetTickCount64() an; da wird nur Windows.GetTickCount() aufgerufen.
Stimmt. Aber direkt aufrufen könnte man's trotzdem unter Windows, entweder aus windows.pas oder selber importieren.

turbo
Lazarusforum e. V.
Beiträge: 99
Registriert: Mo 6. Feb 2012, 17:20
OS, Lazarus, FPC: ubuntu 10.10, L 0.9.28.2, FPC 2.4.0
CPU-Target: x86_64
Wohnort: Oldenburg (Oldb)

Re: runtime error 216 bei absoluter Variable

Beitrag von turbo »

Socke hat geschrieben:Was sind denn die Anforderungen an das Produktivsystem? Bei deiner geforderten Auflösung von 2 Sekunden brauchst du sowieso fast einen Monat um keine doppelten Werte zu ziehen (für eine maximale Optimierung).
Aus 1 Mrd. Schlüsseln soll ein Schlüssel in deutlich < 0,1 Sekunde von einer Festplatte mit 10 ms Zugriffszeit gefunden sein. Beim Zugriff auf Dateien im RAM ist der Wert noch nicht definiert.
Doppelte Werte lassen sich ganz gut ausschließen. Bei 2 Sekunden Auflösung habe ich in der aktuellen Konstruktion einen Zeitraum von 272 Jahren ermittelt. Da wird es erst einmal nicht eng.

Aktuell habe ich das Problem, dass ich weder eine für mich verständliche Dokumentation noch Sourcecode finden kann

http://www.lazarusforum.de/portal.php?c ... tTickCount" onclick="window.open(this.href);return false;
ist praktisch ohne Aussage:

Code: Alles auswählen

GetTickCount64
Declaration
Source position: lclintf.pas line 75
function GetTickCount64: QWord;
In den beiden Free Pascal Büchern ist die Funktion nicht im Index enthalten.

laut locate lclintf.pas
ist die Datei nicht in meinem System vorhanden, obwohl sehr viele andere Quellen hier liegen
/usr/share/fpcsrc/2.4.0

freepascal.org ist heute noch mehr down als gestern
Bei sourceforge weiß ich nicht, wie ich die Datei finden soll, die lclintf.pas enthält

Wie komme ich da am besten weiter?
Liebe Grüße
turbo

Socke
Lazarusforum e. V.
Beiträge: 3178
Registriert: Di 22. Jul 2008, 19:27
OS, Lazarus, FPC: Lazarus: SVN; FPC: svn; Win 10/Linux/Raspbian/openSUSE
CPU-Target: 32bit x86 armhf
Wohnort: Köln
Kontaktdaten:

Re: runtime error 216 bei absoluter Variable

Beitrag von Socke »

turbo hat geschrieben:Aktuell habe ich das Problem, dass ich weder eine für mich verständliche Dokumentation noch Sourcecode finden kann
Wie gesagt, das ganze kommt ursprünglich von Windows, daher wird dich vermutlich mein Link zu MSDN weiter Oben die beste Dokumentation finden. Die FPC-/Lazars-Dokumentationen enthalten üblicherweise nicht die Dokumentation externer (Betriebssystem-)Bibliotheken.
turbo hat geschrieben:laut locate lclintf.pas
ist die Datei nicht in meinem System vorhanden, obwohl sehr viele andere Quellen hier liegen
/usr/share/fpcsrc/2.4.0
Vielleicht sagt dir das mehr: lclintf.pas -- es handelt sich um eine Datei aus der LCL von Lazarus. Wie angemerkt ist es unter Windows nur ein Wrapper für Windows.GetTickCount() und den Teil für andere Betriebssysteme kannst du dir kurz selbst aus dem Quellcode kopieren.
MfG Socke
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein

Antworten