Syscall implementieren

Syscall implementieren

Beitragvon MitjaStachowiak » 3. Jul 2018, 10:40 Syscall implementieren

Hallo,
weiß jemand, wie ich z.B. den sched_setaffinity-Syscall in Lazarus verwende? Ich habe dankenswerter Weise hier im Forum von MSE mal den Code für den shm-Open-Call bekommen:
Code: Alles auswählen
  const {$ifdef linux}shmlib = 'rt';{$else}shmlib = clib;{$endif}
  function shm_open(name: pchar; oflag: longint; mode: Cardinal): longint; cdecl; external shmlib name 'shm_open';
 

Entsprechend hierzu die man-Page: http://man7.org/linux/man-pages/man3/shm_open.3.html
Dort steht "link with lrt" - daher das shmlib = 'rt'.

Bei sched_setaffinity steht kein solcher Kommentar: http://man7.org/linux/man-pages/man2/sc ... ity.2.html
Die Deklaration sollte wie folgt aussehen:
Code: Alles auswählen
  function sched_setaffinity(pid: Cardinal; cpusetsize: Cardinal; const mask: PByte): longint; cdecl; external '???' name 'sched_setaffinity';


Aber was muss ich für die ??? einsetzen?
Zuletzt geändert von MitjaStachowiak am 3. Jul 2018, 14:48, insgesamt 1-mal geändert.
MitjaStachowiak
 
Beiträge: 336
Registriert: 15. Mai 2010, 12:46
CPU-Target: 64 bit
Nach oben

Beitragvon mse » 3. Jul 2018, 12:32 Re: Syscall implementieren

MitjaStachowiak hat geschrieben:Aber was muss ich für die ??? einsetzen?

Code: Alles auswählen
c

Die wrapper sind in der glibc.
mse
 
Beiträge: 1967
Registriert: 16. Okt 2008, 09:22
OS, Lazarus, FPC: Linux,Windows,FreeBSD,(MSEide+MSEgui 4.6,git master FPC 3.0.4,fixes_3_0) | 
CPU-Target: x86,x64,ARM
Nach oben

Beitragvon MitjaStachowiak » 3. Jul 2018, 14:45 Re: Syscall implementieren

Toll, scheint zu gehen, besten Dank :D

Verrätst du mir noch, woher man das jetzt wissen konnte? Sind alle Syscalls, bei denen keine extra library angegeben sind 'c' oder wie muss man sich das vorstellen?
MitjaStachowiak
 
Beiträge: 336
Registriert: 15. Mai 2010, 12:46
CPU-Target: 64 bit
Nach oben

Beitragvon mse » 3. Jul 2018, 15:45 Re: Syscall implementieren

http://man7.org/linux/man-pages/man3/shm_open.3.html
ist ein "man3" Eintrag, das heisst er bezieht sich auf libc, wenn nichts anderes steht, wird mit -lc gelinkt.
http://man7.org/linux/man-pages/man2/sc ... ity.2.html
ist ein "man2" Eintrag, das heisst es geht um einen SYSCALL. Es werden die glibc Wrapper-Funktionen erwähnt:
VERSIONS
The CPU affinity system calls were introduced in Linux kernel 2.5.8.
The system call wrappers were introduced in glibc 2.3. Initially,
the glibc interfaces included a cpusetsize argument, typed as
unsigned int. In glibc 2.3.3, the cpusetsize argument was removed,
but was then restored in glibc 2.3.4, with type size_t.

Darum habe ich mit MSEide in den Header-Dateien nach "sched_setaffinity" gesucht und in /usr/include/sched.h einen entsprechenden Eintrag gefunden, vermutet dass die Funktion in libc.so.6 gelinkt ist und daher mit 'c' probiert.
sched_setaffinity.png

Zur Kontrolle, nm listet den Eintrag:
Code: Alles auswählen
 
nm /lib/libc.so.6 | grep sched_setaffinity
0012b370 T sched_setaffinity@GLIBC_2.3.3
000d2b80 T sched_setaffinity@@GLIBC_2.3.4
000d2b80 t __sched_setaffinity_new
0012b370 t __sched_setaffinity_old
 
Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.
mse
 
Beiträge: 1967
Registriert: 16. Okt 2008, 09:22
OS, Lazarus, FPC: Linux,Windows,FreeBSD,(MSEide+MSEgui 4.6,git master FPC 3.0.4,fixes_3_0) | 
CPU-Target: x86,x64,ARM
Nach oben

Beitragvon MitjaStachowiak » 3. Jul 2018, 20:09 Re: Syscall implementieren - Crosscompile

Da dann wolln wa mal sehen, ob ich das nächstes mal alleine schaffe 8)
Noch folgendes Problem: Aktuell sieht das bei mir so aus:
Code: Alles auswählen
type
  size_t = Integer;
  ssize_t = Cardinal;
  pid_t = Cardinal;
 
function sched_setaffinity(pid: pid_t; cpusetsize: size_t; const mask: PByte): Integer; cdecl; external 'c' name 'sched_setaffinity';
function readlink(const pathname: PChar; var buf; bufsize: size_t) : ssize_t; cdecl; external 'c' name 'readlink';
 

Ich hoffe, dass die Typen für size_t so stimmen. Das readlink geht auf meinem x86 auf jeden Fall. Das ganze soll dann später auf einem ARM-Soc laufen.

Aktuell hänge ich daran, das mit dem Crosscompiler zu linken. Habe FPC als Crosscompiler Linux i386 -> Linux arm eingerichtet. Kann das Programm ohne die Syscalls auch für ARM kompilieren. Mit kommt wieder ein Linker Error. Heißt dass ich muss eine "cross-glibc" für ARM nachinstallieren, damit der Linker das findet?

Oder gibt es die Möglichkeit, das dynamisch zu machen? Auf Windows muss eine verwendete DLL ja auch nicht installiert sein, damit man es zumindest kompilieren kann.
MitjaStachowiak
 
Beiträge: 336
Registriert: 15. Mai 2010, 12:46
CPU-Target: 64 bit
Nach oben

Beitragvon mse » 4. Jul 2018, 07:28 Re: Syscall implementieren - Crosscompile

MitjaStachowiak hat geschrieben:Ich hoffe, dass die Typen für size_t so stimmen. Das readlink geht auf meinem x86 auf jeden Fall. Das ganze soll dann später auf einem ARM-Soc laufen.

MSEgui hat die Units msectypes und mselibc worin diese Typen für die Linux und FreeBSD Versionen definiert sind.
https://gitlab.com/mseide-msegui/mseide ... ctypes.pas
https://gitlab.com/mseide-msegui/mseide ... selibc.pas
Auch Free Pascal hat eine ctypes-Unit.
Aktuell hänge ich daran, das mit dem Crosscompiler zu linken. Habe FPC als Crosscompiler Linux i386 -> Linux arm eingerichtet. Kann das Programm ohne die Syscalls auch für ARM kompilieren. Mit kommt wieder ein Linker Error. Heißt dass ich muss eine "cross-glibc" für ARM nachinstallieren, damit der Linker das findet?

Ja. Es müssen auch Links lib*.so -> lib*.so.n vorhanden sein, siehe den ewigen Bugreport https://bugs.freepascal.org/view.php?id=32367
erste Diskussionen über das Thema liegen 10 Jahre zurück.
Vollständige Cross-Compiling-Debugging Umgebungen Linux -> ARM (Raspberry Pi) sind hier:
https://sourceforge.net/projects/mseide ... pcrossarm/
Für MSEide gibt es auch ein entsprechendes Projekttemplate, siehe MSEide+MSEgui README.TXT.
Du könntest zuerst mit RPi üben und dich mit dem SOC herumschlagen, sobald es auf dem RPi grundsätzlich funktioniert.
Für Embedded gibt es auch eine entsprechende Version:
https://sourceforge.net/projects/mseide ... membedded/
Siehe auch
viewtopic.php?p=102817#p102817

Oder gibt es die Möglichkeit, das dynamisch zu machen? Auf Windows muss eine verwendete DLL ja auch nicht installiert sein, damit man es zumindest kompilieren kann.

Man könnte GetProcAddress() verwenden statt "statically shared" zu linken. Entsprechende Routinen sind hier:
https://gitlab.com/mseide-msegui/mseide ... ynload.pas
AFAIK braucht der Linux Linker für "statically shared" Zugriff auf die Bibliothek zur Kompilierzeit unter anderem um den SONAME zu bestimmen.
mse
 
Beiträge: 1967
Registriert: 16. Okt 2008, 09:22
OS, Lazarus, FPC: Linux,Windows,FreeBSD,(MSEide+MSEgui 4.6,git master FPC 3.0.4,fixes_3_0) | 
CPU-Target: x86,x64,ARM
Nach oben

Beitragvon MitjaStachowiak » 8. Jul 2018, 01:36 Re: Syscall implementieren

Dynamisch linken geht leider nicht, weil dynlibs selbst wieder eine statische Verlinkung braucht, die nicht im cross-compile geht. :roll:

Sehe ich das richtig, dass FPC seit Version 2.irgendwas seinen eigenen Linker mitbringt?

Ich bekomme die Warnungen crtbegin.o und crtend.o not found. Diese Dateien habe ich in deinem Projekt gefunden. Mein ARM-FPC ist in /usr/lib/fpc/3.0.4 installiert. Jedenfalls habe ich mal die .o-Files aus deinem eabi zu meinem aktiven ppcrossarm in /usr/lib/fpc/3.0.4 kopiert. Dann Bekomme ich die Meldung
Code: Alles auswählen
/usr/lib/x86_64-linux-gnu/crti.o: file not recognized: File format not recognized


Komisch - wieso nimmt er hier nicht die crti.o, die ich in das ppcrossarm-Verzeichnis kopiert habe?

Also die Einstellungen in der /etc/fpc.cfg zu -Fu verweisen auf das units-Verzeichnis im fpc/3.0.4-Ordner. Es ändert aber nichts, wenn ich hier etwas anderes einstelle. Vielleicht werden diese units im aktuellen Projekt nicht benötigt... Aber wo ist der Unterschied zu den .o-Files in units und denen, die ich aus eabi kopiert habe?
MitjaStachowiak
 
Beiträge: 336
Registriert: 15. Mai 2010, 12:46
CPU-Target: 64 bit
Nach oben

Beitragvon mse » 8. Jul 2018, 07:03 Re: Syscall implementieren

Dynamisch linken geht leider nicht, weil dynlibs selbst wieder eine statische Verlinkung braucht, die nicht im cross-compile geht.

Das sollte man schon hinkriegen, sonst ist Hopfen und Malz verloren.
Sehe ich das richtig, dass FPC seit Version 2.irgendwas seinen eigenen Linker mitbringt?

AFAIK nur für Windows.
Ich bekomme die Warnungen crtbegin.o und crtend.o not found.

Ich kann dir nur empfehlen, als ersten Versuch die unveränderten Umgebungen in
https://sourceforge.net/projects/mseide ... z/download
für 64 Bit Linux Host
https://sourceforge.net/projects/mseide ... z/download
für 32 Bit Linux Host
mit einem RPi und dem MSEide crossarm* Projekttemplate auszuprobieren. Bei mir und weiteren Usern funktioniert das.
Aus README.TXT:
Code: Alles auswählen
 
Crosscompiling and remote debugging i386/x84_64-linux -> arm-linux
***********************************************************
For Raspberry Pi:
- Establish a ssh login without password (public key authentication).
 
- On the i386/x84_64-linux host install the scp program
- download and extract
  https://sourceforge.net/projects/mseide ... 0_5.tar.gz
  (or crossfpc-x86_64_linux_eabihf_3_0_5.tar.gz)
  to <your crossfpc directory>.
 
- Start MSEide, in 'Settings'-'Configure MSEide'-'Global Macros' add:
 
Name            Value
 
CROSSMSEDIR     <MSEide+MSEgui directory>
CROSSFPCDIR     <your crossfpc directory>
CROSSFPCVERSION 3.0.5
HOSTIP          <the IP address of the host>
REMOTEIP        <the IP address of the remote target>
REMOTEPORT      <the remote port, ex: 2345>
REMOTEUSER      pi
 
- 'Project'-'New'-'From Template', select "crossarmdefault.prj" or
  "crossarmconsole.prj".
- Create the new project.
- 'Project'-'Options'-'Macros', set the TARGETPROJECTDIR value to the project
  path in remote target, ex: "/home/pi/proj/testcase".
- Check the TARGETENV macro.
- If your application needs additional libraries copy them from Raspberry Pi
  /lib/arm-linux-gnueabihf or /usr/lib/arm-linux-gnueabihf to
  <your crossfpc directory>/eabihf/lib
 
Press F9 and hope the best. ;-)
If there is a debugger timeout at startup enlarge the
'Project'-'Options'-'Target'-'Wait before connect' value.
 

Sobald es funktioniert kannst du anhand des Musters deine eigene Entwicklungsumgebung auf Vordermann bringen.
Ich werde noch MSEide RPi Demoprojekte machen.
Edit:
Ich nehme an, dass auf deinem SoC Linux läuft. Korrekt?
mse
 
Beiträge: 1967
Registriert: 16. Okt 2008, 09:22
OS, Lazarus, FPC: Linux,Windows,FreeBSD,(MSEide+MSEgui 4.6,git master FPC 3.0.4,fixes_3_0) | 
CPU-Target: x86,x64,ARM
Nach oben

Beitragvon mse » 8. Jul 2018, 08:52 Re: Syscall implementieren

mse hat geschrieben:Ich werde noch MSEide RPi Demoprojekte machen.

Hier:
https://gitlab.com/mseide-msegui/mseuni ... aspberrypi
mse
 
Beiträge: 1967
Registriert: 16. Okt 2008, 09:22
OS, Lazarus, FPC: Linux,Windows,FreeBSD,(MSEide+MSEgui 4.6,git master FPC 3.0.4,fixes_3_0) | 
CPU-Target: x86,x64,ARM
Nach oben

Beitragvon MitjaStachowiak » 10. Jul 2018, 15:32 Re: Syscall implementieren

Danke, mit den Zusatzinfos habe ich es geschafft: Man muss das Verzeichnis mit den .so-Files in der fpc.cfg über die -Fl hinzufügen, nicht wie im Wiki beschrieben mit -Xr. Dort stehen zwei Zeilen mit -Xr, das ist doch bestimmt ein Fehler, oder?

Naja, jetzt linkt es. Leider bekomme ich auf dem Zielsystem einen Segmentation Fault (mit und ohne die syscalls). Das soll auf einem Xilinx ZedBoard laufen (ARM Cortex™-A9, Linux-4.9.0-mathworks). Werde es nachher erst mal auf meinem PI starten, um zu sehen, ob es daran liegt.
MitjaStachowiak
 
Beiträge: 336
Registriert: 15. Mai 2010, 12:46
CPU-Target: 64 bit
Nach oben

Beitragvon marcov » 10. Jul 2018, 15:59 Re: Syscall implementieren

mse hat geschrieben:
AFAIK nur für Windows.


(Etwas später (2.4?) auch fuer Dos/go32v2, und in trunk fuer 16-bit Dos)
marcov
 
Beiträge: 1031
Registriert: 5. Aug 2008, 08:37
Wohnort: Eindhoven (Niederlande)
OS, Lazarus, FPC: Windows ,Linux,FreeBSD,Dos (L trunk FPC trunk) | 
CPU-Target: 32/64,PPC(+64), ARM
Nach oben

Beitragvon MitjaStachowiak » 11. Jul 2018, 13:09 Re: Syscall implementieren

Auf dem PI bekomme ich auch einen Speicherzugriffsfehler. Irgendwas ist noch falsch...
MitjaStachowiak
 
Beiträge: 336
Registriert: 15. Mai 2010, 12:46
CPU-Target: 64 bit
Nach oben

Beitragvon mse » 11. Jul 2018, 14:14 Re: Syscall implementieren

MitjaStachowiak hat geschrieben:Auf dem PI bekomme ich auch einen Speicherzugriffsfehler. Irgendwas ist noch falsch...

Nochmals der Hinweis auf die Demoprojekte:
Konsole
https://gitlab.com/mseide-msegui/mseuni ... helloworld
Graphisch
https://gitlab.com/mseide-msegui/mseuni ... pi/minimal
mse
 
Beiträge: 1967
Registriert: 16. Okt 2008, 09:22
OS, Lazarus, FPC: Linux,Windows,FreeBSD,(MSEide+MSEgui 4.6,git master FPC 3.0.4,fixes_3_0) | 
CPU-Target: x86,x64,ARM
Nach oben

• Themenende •

Zurück zu Linux



Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 1 Gast

cron
porpoises-institution
accuracy-worried