direkter Speicherzugriff

Für alles, was in den übrigen Lazarusthemen keinen Platz, aber mit Lazarus zutun hat.
c-bob
Beiträge: 30
Registriert: Mo 15. Jun 2009, 11:11

direkter Speicherzugriff

Beitrag von c-bob »

Allo!

Habe folgendes Problem:
Mein System hat 16 digtiale IO's (GPIO). Diese sind entweder abzufragen oder zu setzen, indem man eine bestimmte Adresse ausliest/beschreibt. Als Beispiel wurde einfacherweise ein kurzes C-Programm beigelegt:

Code: Alles auswählen

#include <stdio.h>                                                                                 
#include <sys/io.h>                                                                                
#define outportb(a,b) outb(b,a)                                                                    
#define inportb(a) inb(a)                                                                          
 
void main(void)
{
iopl(3);
/* set GPIO port0[7-0] as input mode */
outportb(0x98, 0x00);
/* read data from GPIO port0 */
inportb(0x78);
/* set GPIO port1[7-0] as output mode */
outportb(0x99, 0xff);
/* write data to GPIO port1 */
outportb(0x79, 0x55);
}
Nachteil eins: es muß mit root Rechten ausgeführt werden, Nachteil zwei: Kein Lazarus/Pascal/Delphi!
Wie kann ich das nun mit Lazarus (unter Linux) realisieren? Habe da absolut keinen Anhaltspunkt, wie ich direkt auf den Speicher zugreifen kann. Hat hier unter Umständen jemand eine Idee dazu?

Danke und erstmal einen schönen Samstag!

Euklid
Lazarusforum e. V.
Beiträge: 2808
Registriert: Fr 22. Sep 2006, 10:38
OS, Lazarus, FPC: Lazarus v2.0.10, FPC 3.2.0
Wohnort: Hessen
Kontaktdaten:

Re: direkter Speicherzugriff

Beitrag von Euklid »

Hallo,

direkte Speicherzugriffe sind meines Wissens mit modernen Betriebssystemen nicht mehr ohne weiteres möglich. Ggf. kann man mit Assembler noch Routinen programmieren, die beliebige Speicherbereiche auslesen.
Früher funktionierten mal direkte Speicherzugriffe - unter dem alten DOS.
http://lazarus-ccr.sourceforge.net/docs ... emory.html" onclick="window.open(this.href);return false;

Viele Grüße, Euklid

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 6783
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Burgenland
Kontaktdaten:

Re: direkter Speicherzugriff

Beitrag von af0815 »

Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

mschnell
Beiträge: 3444
Registriert: Mo 11. Sep 2006, 10:24
OS, Lazarus, FPC: svn (Window32, Linux x64, Linux ARM (QNAP) (cross+nativ)
CPU-Target: X32 / X64 / ARMv5
Wohnort: Krefeld

Re: direkter Speicherzugriff

Beitrag von mschnell »

Euklid hat geschrieben:Ggf. kann man mit Assembler noch Routinen programmieren, die beliebige Speicherbereiche auslesen.
Das nützt nix. Unabhängig von der Programmiersprache verhindert jedes "normale" Betriebssystem den direkten Zugriff auf jede Hardware.

Was er sich vorstellt ist vermutlich ioperm. (Soweit ich weiß geht damit manches (u. a. auch Systemabstürze), manches andere aber nicht)

In Linux ist die offizielle Methode, einen Kernel Device Driver zu schreiben. Das geht aber wohl nur mit C.

-Michael

Euklid
Lazarusforum e. V.
Beiträge: 2808
Registriert: Fr 22. Sep 2006, 10:38
OS, Lazarus, FPC: Lazarus v2.0.10, FPC 3.2.0
Wohnort: Hessen
Kontaktdaten:

Re: direkter Speicherzugriff

Beitrag von Euklid »

Ach ja, die guten alten DOS-Zeiten...

... wo noch jedes Programm nach belieben im Speicher rumwurschteln durfte.

creed steiger
Beiträge: 958
Registriert: Mo 11. Sep 2006, 22:56

Re: direkter Speicherzugriff

Beitrag von creed steiger »

mschnell hat geschrieben:
Was er sich vorstellt ist vermutlich ioperm. (Soweit ich weiß geht damit manches (u. a. auch Systemabstürze), manches andere aber nicht)
Geht denkich auch nur als root.

c-bob
Beiträge: 30
Registriert: Mo 15. Jun 2009, 11:11

Re: direkter Speicherzugriff

Beitrag von c-bob »

So, also vielleicht zur weiteren Erklärung:

das System, auf dem das laufen soll, ist erst vor knapp anderthalb Jahren entstanden und wird mittlerweile anscheienend auch in größerer Stückzahl gebaut. Da waren durch aus schon "moderne" OS bekannt. Dieser hier (ist ein PC/104 System) soll in einem Messgerät werkeln und hat u.a. besagte 16 digitale I/O's, welche mit dem o.g. Beispielprogram ausgewertet werden können. Da ich leider weder Delphi- noch C/C++ Profi bin, muß ich halt bei so speziellen Dingen anderweitig Hilfe suchen. Es muss doch eine Möglichkeit geben, die obige Funktionalität auch in Delphi/Lazarus nach zu stellen, wenns uner C auch geht?! Gibt es unter Lazarus eigentlich die Möglichkeit,Assemblercode einzubauen? Vielleicht wäre dann dass die Lösung - und natürlich die Ausführung als root.

creed steiger
Beiträge: 958
Registriert: Mo 11. Sep 2006, 22:56

Re: direkter Speicherzugriff

Beitrag von creed steiger »

Vielleicht wendest du dich mit dem Problem an die FPC Mailinglist
Da sind die Profis unterwegs.
http://www.freepascal.org/maillist.var" onclick="window.open(this.href);return false;

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: direkter Speicherzugriff

Beitrag von Socke »

Woran ihr immer direkt denkt...
Ich hätte mit der Frage angefangen: Wie schreibe ich wild im Speicher durch die Gegend?

Code: Alles auswählen

var
  p: ^Byte;
begin
  p := $abcdefgh; // Adresse, von der ich lesen will/schreiben will
  p^ := $FF; // ein Byte schreiben
  Result := p^; // ein Byte lesen
end;
Ganz einfache Pointer-Basics.
Ich denke, das funktioniert in Free Pascal/Delphi genau so, wie in C oder was weiß ich auch immer. In der Regel sollte das OS aber eine AccessViolation auslösen.
MfG Socke
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein

mschnell
Beiträge: 3444
Registriert: Mo 11. Sep 2006, 10:24
OS, Lazarus, FPC: svn (Window32, Linux x64, Linux ARM (QNAP) (cross+nativ)
CPU-Target: X32 / X64 / ARMv5
Wohnort: Krefeld

Re: direkter Speicherzugriff

Beitrag von mschnell »

creed steiger hat geschrieben:Geht denkich auch nur als root.
Wäre jedenfalls vernünftig :)

-> Socke
Klar geht das, Aber nur bei Memory, nicht bei I/O . Dafür hat FPC aber auch entsprechen Vorkehrungen, ogne dass man explizit ASM schreiben muss.

Nützt aber alles nix, wenn das Betriebssystem es nicht zulässt, und das tut es vernünftiger Weise - auch mit ioperm - nicht, wenn das Programm nicht root Rechte hat.

-> c-bob
Man kann - soweit ich weiß - in Linux einem Programm bestimmte Rechte geben, unabhängig davon, wer es startet.

Wenn Du keinen Kernel-Treiber machen kannst (das wäre die korrekte Methode), könntest Du ein zusätzliches (möglichst simples) FPC Programm machen, das vom rc-Script mit Root-Rechten gestartet wird und die I/O-Zugriffe mit ioperm macht. Es unterhält sich dann später über eine sinnvolle Schnittstelle (z.B. eine Pipe ("mkfifo"...) mit dem User-Programm darüber, was zu tun ist.

-Michael

c-bob
Beiträge: 30
Registriert: Mo 15. Jun 2009, 11:11

Re: direkter Speicherzugriff

Beitrag von c-bob »

So, nach Euren Denkanstößen bin ich nun etwas fündig geworden: Lazarus unter Linux: die Unit x86 mit der der Funktion fpIOperm und die entsprechend Funktion ReadB verschafft mir nun zumindest schonmal Zugriff auf die Ports. habe aber leider wenig dazu im Netz finden können - nur die recht kurze Beschreibung auf den FP Seiten.

Ich kann aber leider nicht einschätzen, in wieweit das eine "saubere" Lösung ist, aber sofern "nur" root-rechte zur Ausführung notwendig sind, sollte das auch zu akzeptieren sein. Das System läuft später sowieso völlig autonom und ohne jegliche Chance von außen kompromittiert zu werden.
Die einzige Frage, welche ich mir stelle ist, wie die Stabilität leiden könnte - einerseits wegen der root rechte und andererseits wegen der IOperm Zugriffe.

@mschnell:
Das mit dem Kernel Treiber wäre zwar ne dolle Sache, hab da aber leider echt keine Zeit, mich da auch noch rein zu denken. Muss hier erstmal nach dem quick'n'dirty Prinzip rangehen. Aber die Variante mit dem kleinen Programm, welches extra arbeitet und per Pipe kommuniziert, klingt gut. Habe leider mit der Interprozesskommunikation noch nix gemacht - zwar schon theoretisch einiges gelesen - aber wie's leider so ist - Theorie und Praxis sind halt doch unterschiedlich, zumindest wenn es um die schnelle Anwendung geht ;-)
Kannst Du mir vielleicht einen Hinweis geben, wie ich da einen guten Einstieg aus Richtung Lazarus/FP finden kann?

Gruß
-c-

marcov
Beiträge: 1102
Registriert: Di 5. Aug 2008, 09:37
OS, Lazarus, FPC: Windows ,Linux,FreeBSD,Dos (L trunk FPC trunk)
CPU-Target: 32/64,PPC(+64), ARM
Wohnort: Eindhoven (Niederlande)

Re: direkter Speicherzugriff

Beitrag von marcov »

Unit x86 hat auch fpiopl. Damit kanst du dass originelle Beispiel 1:1 uebersetzen.

Die Stabilitaet usw ist aehnlich an der C loesung, und mir sind keine Probleme bekannt.

mschnell
Beiträge: 3444
Registriert: Mo 11. Sep 2006, 10:24
OS, Lazarus, FPC: svn (Window32, Linux x64, Linux ARM (QNAP) (cross+nativ)
CPU-Target: X32 / X64 / ARMv5
Wohnort: Krefeld

Re: direkter Speicherzugriff

Beitrag von mschnell »

c-bob hat geschrieben:Habe leider mit der Interprozesskommunikation noch nix gemacht
Ganz einfach (Weil in Linux alles eine Datei ist): Mit mkfifo eine Pipe anlegen. Das ist dann eine (peudo-) Datei im File-System. Ein Prozess kann die Datei nun zum, Lesen öffnen und einen Read absetzten (mit FPC: TFilestream.Read). Der Prozess blockiert dann, bis so viele Bytes angekommen sind, wie er angefordert hat. (Wenn er nicht blockieren soll, gibt es da diverse Methoden.)

Ein anderer Prozess (oder auch mehrere) kann nun die Datei zum Schreiben öffnen und was er schreibt, bekommt der lesende Prozess angeliefert.

-Michael

c-bob
Beiträge: 30
Registriert: Mo 15. Jun 2009, 11:11

Re: direkter Speicherzugriff

Beitrag von c-bob »

@marcov: Danke für den Hinweis - werde das erstmal so angehen.

@mschnell: Ok, das ist dann vielleicht der erste einstieg. Kann man das aber auch sozusagen interrupt- oder Eventgesteuert machen?! weil sonst muss ich ja aus der Datei quasi immer pollen, um zu sehen, ob was geschehen ist oder nicht!?
Gruß
_-c-_

mschnell
Beiträge: 3444
Registriert: Mo 11. Sep 2006, 10:24
OS, Lazarus, FPC: svn (Window32, Linux x64, Linux ARM (QNAP) (cross+nativ)
CPU-Target: X32 / X64 / ARMv5
Wohnort: Krefeld

Re: direkter Speicherzugriff

Beitrag von mschnell »

Wie gesagt: das "Read" blockiert, Du musst also nicht pollen, sondern Das Programm läuft erst los, wenn die entsprechende Anzahl Zeichen (Bytes) angekommen ist. Das ist dann das "Event".

Wenn Du auf mehrere solche "Events" gleichzeitig warten willst, musst Du den entsprechenden Linux Systemaufruf machen. Da gibt es mehrere . Der bekannteste ist "select()". Moderner ist "epoll()" (was aber mit pollen auch niox zu tun hat). Ich weiß nicht, wie dieses Systemaufrufe in der FPC-RTL umgesetzt sind.

Das Programm sollte natürlich keine GUI haben, weil die natürlich hängt, während während das Programm auf Zeichen aus der Pipe wartet. (Pollen geht wahrscheinlich mit TFilestream.Count, würde ich aber nicht machen.)

-Michael

Antworten