SharedMemory mit mmap()

In dieser Linux-Ecke dürfen nur Themen rund um Linux geschrieben werden.
Beiträge, die plattformübergreifend sind, gehören ins 'Allgemein'-Forum.
Micha122
Beiträge: 248
Registriert: 02.10.2011 14:45
Wohnort: Sinzig
Kontaktdaten:

SharedMemory mit mmap()

Beitrag von Micha122 »

Hallo Linux User,
würde gerne unter Linux- PB mmap() benutzen.
Google & Co habe ich natürlich schon intensiv benutzt, was aber mangels C Kenntnisse nicht so viel gebracht hat. :oops:

Hier einige Links:
http://linuxreviews.org/man/mmap/index.html.de
http://linuxreviews.org/man/mmap/index.html.de
http://linux.about.com/library/cmd/blcmdl2_mmap.htm

Die Syntax ist ja einigermaßen verständlich, aber PB kennt ja nicht mal die Konstanten. :cry:

Ein Beispiel wie ich SharedMemory damit verwirklichen könnte wäre super.

Gruß, Micha122
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8675
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 32 GB DDR4-3200
Ubuntu 22.04.3 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken
Kontaktdaten:

Re: SharedMemory mit mmap()

Beitrag von NicTheQuick »

Wenn du unter Linux das Paket libc6-dev installierst, dann kannst du dir die mman.h-Include anschauen und findest auch die Konstanten:
Das ist jetzt die Datei '/usr/include/x86_64-linux-gnu/bits/mman.h':

Code: Alles auswählen

/* Definitions for POSIX memory map interface.  Linux/x86_64 version.
   Copyright (C) 2001-2012 Free Software Foundation, Inc.
   This file is part of the GNU C Library.

   The GNU C Library is free software; you can redistribute it and/or
   modify it under the terms of the GNU Lesser General Public
   License as published by the Free Software Foundation; either
   version 2.1 of the License, or (at your option) any later version.

   The GNU C Library is distributed in the hope that it will be useful,
   but WITHOUT ANY WARRANTY; without even the implied warranty of
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
   Lesser General Public License for more details.

   You should have received a copy of the GNU Lesser General Public
   License along with the GNU C Library; if not, see
   <http://www.gnu.org/licenses/>.  */

#ifndef _SYS_MMAN_H
# error "Never use <bits/mman.h> directly; include <sys/mman.h> instead."
#endif

/* The following definitions basically come from the kernel headers.
   But the kernel header is not namespace clean.  */


/* Protections are chosen from these bits, OR'd together.  The
   implementation does not necessarily support PROT_EXEC or PROT_WRITE
   without PROT_READ.  The only guarantees are that no writing will be
   allowed without PROT_WRITE and no access will be allowed for PROT_NONE. */

#define PROT_READ	0x1		/* Page can be read.  */
#define PROT_WRITE	0x2		/* Page can be written.  */
#define PROT_EXEC	0x4		/* Page can be executed.  */
#define PROT_NONE	0x0		/* Page can not be accessed.  */
#define PROT_GROWSDOWN	0x01000000	/* Extend change to start of
					   growsdown vma (mprotect only).  */
#define PROT_GROWSUP	0x02000000	/* Extend change to start of
					   growsup vma (mprotect only).  */

/* Sharing types (must choose one and only one of these).  */
#define MAP_SHARED	0x01		/* Share changes.  */
#define MAP_PRIVATE	0x02		/* Changes are private.  */
#ifdef __USE_MISC
# define MAP_TYPE	0x0f		/* Mask for type of mapping.  */
#endif

/* Other flags.  */
#define MAP_FIXED	0x10		/* Interpret addr exactly.  */
#ifdef __USE_MISC
# define MAP_FILE	0
# define MAP_ANONYMOUS	0x20		/* Don't use a file.  */
# define MAP_ANON	MAP_ANONYMOUS
# define MAP_32BIT	0x40		/* Only give out 32-bit addresses.  */
#endif

/* These are Linux-specific.  */
#ifdef __USE_MISC
# define MAP_GROWSDOWN	0x00100		/* Stack-like segment.  */
# define MAP_DENYWRITE	0x00800		/* ETXTBSY */
# define MAP_EXECUTABLE	0x01000		/* Mark it as an executable.  */
# define MAP_LOCKED	0x02000		/* Lock the mapping.  */
# define MAP_NORESERVE	0x04000		/* Don't check for reservations.  */
# define MAP_POPULATE	0x08000		/* Populate (prefault) pagetables.  */
# define MAP_NONBLOCK	0x10000		/* Do not block on IO.  */
# define MAP_STACK	0x20000		/* Allocation is for a stack.  */
# define MAP_HUGETLB	0x40000		/* Create huge page mapping.  */
#endif

/* Flags to `msync'.  */
#define MS_ASYNC	1		/* Sync memory asynchronously.  */
#define MS_SYNC		4		/* Synchronous memory sync.  */
#define MS_INVALIDATE	2		/* Invalidate the caches.  */

/* Flags for `mlockall'.  */
#define MCL_CURRENT	1		/* Lock all currently mapped pages.  */
#define MCL_FUTURE	2		/* Lock all additions to address
					   space.  */

/* Flags for `mremap'.  */
#ifdef __USE_GNU
# define MREMAP_MAYMOVE	1
# define MREMAP_FIXED	2
#endif

/* Advice to `madvise'.  */
#ifdef __USE_BSD
# define MADV_NORMAL	  0	/* No further special treatment.  */
# define MADV_RANDOM	  1	/* Expect random page references.  */
# define MADV_SEQUENTIAL  2	/* Expect sequential page references.  */
# define MADV_WILLNEED	  3	/* Will need these pages.  */
# define MADV_DONTNEED	  4	/* Don't need these pages.  */
# define MADV_REMOVE	  9	/* Remove these pages and resources.  */
# define MADV_DONTFORK	  10	/* Do not inherit across fork.  */
# define MADV_DOFORK	  11	/* Do inherit across fork.  */
# define MADV_MERGEABLE	  12	/* KSM may merge identical pages.  */
# define MADV_UNMERGEABLE 13	/* KSM may not merge identical pages.  */
# define MADV_HUGEPAGE	  14	/* Worth backing with hugepages.  */
# define MADV_NOHUGEPAGE  15	/* Not worth backing with hugepages.  */
# define MADV_DONTDUMP	  16    /* Explicity exclude from the core dump,
                                   overrides the coredump filter bits.  */
# define MADV_DODUMP	  17	/* Clear the MADV_DONTDUMP flag.  */
# define MADV_HWPOISON	  100	/* Poison a page for testing.  */
#endif

/* The POSIX people had to invent similar names for the same things.  */
#ifdef __USE_XOPEN2K
# define POSIX_MADV_NORMAL	0 /* No further special treatment.  */
# define POSIX_MADV_RANDOM	1 /* Expect random page references.  */
# define POSIX_MADV_SEQUENTIAL	2 /* Expect sequential page references.  */
# define POSIX_MADV_WILLNEED	3 /* Will need these pages.  */
# define POSIX_MADV_DONTNEED	4 /* Don't need these pages.  */
#endif
So wird '#define PROT_EXEC 0x4' zum Beispiel zu

Code: Alles auswählen

#PROT_EXEC = $4
In der Datei '/usr/include/x86_64-linux-gnu/sys/mman.h' findest du dann die eigentlichen Funktionsdeklarationen, die du dann natürlich in PB entweder mit 'OpenLibrary' oder mit 'Import' einbinden musst. Bei mir ist die Bibliothek selbst hier zu finden:
locate mmap.so hat geschrieben:/usr/lib/x86_64-linux-gnu/argyll/libgammap.so
/usr/lib/x86_64-linux-gnu/argyll/libgammap.so.0
/usr/lib/x86_64-linux-gnu/argyll/libgammap.so.0.0.0
Bild
Micha122
Beiträge: 248
Registriert: 02.10.2011 14:45
Wohnort: Sinzig
Kontaktdaten:

Re: SharedMemory mit mmap()

Beitrag von Micha122 »

Hallo NicTheQuick,
Danke für deine ausführliche Antwort! :allright:
Jetzt weis ich zumindest wo ich reinschauen muss.

Hab wirklich vor das mal selber zu lernen, bzw. werde heute Abend mal versuchen aus deiner Info was zu machen. Wenn ich nicht zurecht komme melde ich mich.

Gruß, Micha122

PS: Das mit den Konstanten habe ich bereits jetzt schon begriffen. :allright:
Micha122
Beiträge: 248
Registriert: 02.10.2011 14:45
Wohnort: Sinzig
Kontaktdaten:

Re: SharedMemory mit mmap()

Beitrag von Micha122 »

Hätte wohl erwähnen müssen das ich OpenSuse 12.2 32bit verwende. :oops:

Also die Datei mman.h-Include habe ich im Verzeichnis /usr/include/bits gefunden. Stellt auch kein Problem dar daraus PB Konstanten zu machen, begreife sogar ich. :D
Die Datei /mman.h ist bei mir in /usr/include/sys. Sieht etwas komplizierter aus, aber sicher nicht unüberwindbar. Zum Glück sind es ja nicht so viele Befehle.

Was ich aber nicht finde ist die Library argyll/libgammap.so. Das Verzeichnis gibt es bei mir gar nicht und das Paket libc6-dev scheint es bei OpenSuse gar nicht zu geben. Das wichtigste um überhaupt mal richtig anfangen zu können fehlt mir also.

Vielleicht kennt sich hier ja jemand mit OpenSuse aus.

Gruß, Micha122
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Re: SharedMemory mit mmap()

Beitrag von ts-soft »

Die Namen weichen leicht ab, aber Du wirst die entsprechenden Libs schon haben :wink:
Meine bisherigen Versuchen schlagen leider bei mmap fehl und mir fehlt die Zeit das
weiter zu untersuchen, vielleicht hat ja noch jemand Ideen. Hier der bisherige Code, der
noch nicht funktioniert!:

Code: Alles auswählen

DeclareModule FileMap
  Declare Create(Name.s, Size.i)
  Declare Open(Name.s)
  Declare Close(*Mem)
EndDeclareModule

Module FileMap
  EnableExplicit

  Global hMap.i
  
  CompilerSelect #PB_Compiler_OS
    CompilerCase #PB_OS_Windows
      
      Procedure Create(Name.s, Size.i)
        hMap = CreateFileMapping_(#INVALID_HANDLE_VALUE, 0, #PAGE_READWRITE | #SEC_COMMIT | #SEC_NOCACHE, 0, Size, @Name)
        If hMap
          ProcedureReturn MapViewOfFile_(hMap, #FILE_MAP_ALL_ACCESS, 0, 0, 0)
        EndIf    
      EndProcedure
      
      Procedure Open(Name.s)
        hMap = OpenFileMapping_(#FILE_MAP_ALL_ACCESS, 0, @Name)
        If hMap
          ProcedureReturn MapViewOfFile_(hMap, #FILE_MAP_ALL_ACCESS, 0, 0, 0)
        EndIf
      EndProcedure
      
      Procedure Close(*Mem)
        UnmapViewOfFile_(*Mem)
        CloseHandle_(hMap)  
      EndProcedure
    
    CompilerCase #PB_OS_Linux
      
      #O_RDWR = $2
      #O_CREAT = $100
      #PROT_READ = $1
      #PROT_WRITE = $2
      #PROT_EXEC = $4
      #MAP_SHARED = $1
      
      ImportC "-lrt"
        shm_open(name.p-Unicode, oflag, mode)
        shm_unlink(name.p-Unicode)
      EndImport      
      
      Global gSize.i, gName.s
      
      Procedure Create(Name.s, Size.i)
        Name = ReplaceString(Name, "/", "")
        Name = "/" + Left(name, 254)
        hMap = shm_open(name, #O_CREAT | #O_RDWR, 0)
        If hMap
          gSize = Size
          gName = Name
          ProcedureReturn mmap_(0, Size, #PROT_READ | #PROT_WRITE, #MAP_SHARED, hMap, 0)
        EndIf
      EndProcedure
      
      Procedure Open(Name.s)
        Name = ReplaceString(Name, "/", "")
        Name = "/" + Left(name, 254)
        hMap = shm_open(name, #O_RDWR, 0)
        If hMap
          ProcedureReturn mmap_(0, gSize, #PROT_READ | #PROT_WRITE, #MAP_SHARED, hMap, 0)
        EndIf
      EndProcedure
      
      Procedure Close(*Mem)
        If Not munmap_(*Mem, gSize)
          shm_unlink(gName)
        EndIf
      EndProcedure
     
  CompilerEndSelect
EndModule
Vielleicht findet ja noch jemand das Problem, bzw. besser die Lösung :wink:

Gruß
Thomas
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Micha122
Beiträge: 248
Registriert: 02.10.2011 14:45
Wohnort: Sinzig
Kontaktdaten:

Re: SharedMemory mit mmap()

Beitrag von Micha122 »

ts-soft schrieb:
Die Namen weichen leicht ab, aber Du wirst die entsprechenden Libs schon haben :wink:
Ich denke auch das die Lib schon irgendwo ist, die Frage ist nur wo und unter welchem Namen.
Die suche im Terminal "sudo find / -name libgammap.so" hat auf der Linux Platte 0 Treffer gebracht.
Dafür aber auf der Windows Partition. Erstaunlich was Windows alles speichert wenn man 2 Stunden googelt. :shock:

Danke für den Code! Hätte ich die Lib, würde ich gerne mal versuchen ein bisschen was damit zu basteln.

Gruß, Micha122
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Re: SharedMemory mit mmap()

Beitrag von ts-soft »

Du brauchst keine weitere Lib, nur der Code enthält irgendwie noch einen Fehler.
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8675
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 32 GB DDR4-3200
Ubuntu 22.04.3 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken
Kontaktdaten:

Re: SharedMemory mit mmap()

Beitrag von NicTheQuick »

Micha122 hat geschrieben:Ich denke auch das die Lib schon irgendwo ist, die Frage ist nur wo und unter welchem Namen.
Die suche im Terminal "sudo find / -name libgammap.so" hat auf der Linux Platte 0 Treffer gebracht.
Als kleiner Tipp. Installiere dir 'mlocate'. Dann machst du einmalig 'sudo updatedb' (dauert eine Weile) und dann kannst du mit 'locate libgammap.so' innerhalb von Sekunden die Datei auf deiner Platte finden. 'updatedb' erstellt einen Index vom Dateisystem, ist darin aber recht fix.
Bild
Micha122
Beiträge: 248
Registriert: 02.10.2011 14:45
Wohnort: Sinzig
Kontaktdaten:

Re: SharedMemory mit mmap()

Beitrag von Micha122 »

@ts-soft
Du brauchst keine weitere Lib, nur der Code enthält irgendwie noch einen Fehler.
Habe natürlich gesehen, das du C Source einfügst. :wink: Findest du vielleicht die Lib auch nicht?

@NicTheQuick
Als kleiner Tipp. Installiere dir 'mlocate'. Dann machst du einmalig 'sudo updatedb' (dauert eine Weile) und dann kannst du mit 'locate libgammap.so' innerhalb von Sekunden die Datei auf deiner Platte finden. 'updatedb' erstellt einen Index vom Dateisystem, ist darin aber recht fix.
Also unter OpenSuse 12 und 13 keine Spur??

Habe dann mal auf einer anderen HD Linux Mint Debian 32bit installiert. Also mlocate und libc6-dev sind da von Haus aus mit dabei.
Aber von deiner Lib leider auch unter Debian keine Spur!?

Gruß, Micha122
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Re: SharedMemory mit mmap()

Beitrag von ts-soft »

Micha122 hat geschrieben:@ts-soft
Du brauchst keine weitere Lib, nur der Code enthält irgendwie noch einen Fehler.
Habe natürlich gesehen, das du C Source einfügst. :wink: Findest du vielleicht die Lib auch nicht?
mmap_ kennt PB bereits als API und die anderen beiden Funktionen werden Importiert

Code: Alles auswählen

ImportC "-lrt"
Der genaue Name und Pfad ist hierfür nicht unbedingt erforderlich. Der linker findet das über /etc/ld.so.conf
oder eine Umgebungsvariable. "-lrt" steht in der Manpage. Bei der Installation von weiteren Libs, werden diese mit dem
Programm: ldconfig aktualisiert, bzw. mit dem von SuSE verwendetem Aufruf.
C-Source hab ich auch nicht eingefügt, damit kann der PBCompiler doch nischt anfängen :wink:

Direkter Aufruf eine Lib mit Pfad ist keine gute Idee, es sei denn, die Lib gehört nicht zur Distribution und wird nur
von Deinem Programm benötigt.

Gruß
Thomas
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Antworten