Dean.

While I understand that you're trying to port software with as few changes
as possible, I don't see why using RTLinux shared memory (not Linux shared
memory) wouldn't give you the functionality you need.

    Norm

----- Original Message -----
From: Dean W. Anneser <[EMAIL PROTECTED]>
To: <[EMAIL PROTECTED]>
Sent: Friday, July 27, 2001 4:18 PM
Subject: [rtl] problems with mmap and read/write on /proc


>
> Though somewhat off-topic, I am trying to port our
simulation/control/data_acq system to RTLinux.
> Key to the success of this endeavor, is the capability of having one
process able to read/write
> into the process space of another.  In the example provided I can both
mmap() and read()/write()
> /proc on our current platform.  On Linux 2.4.1 (RH7.1) however, neither
worked.
>
> A couple of years ago, when I first tried this with RH5.2 (I don't
remember the Linux version)
> I remember seeing a similar (if not identical) disclaimer to what's in the
current proc(5)
> manpage.  The last sentence gave me hope the capability I was seeking was
to be implemented
> imminently.
>
>   mem    This is not the same as the mem (1:1) device, despite the fact
that it has the
>          same device numbers.  The /dev/mem device is the physical memory
before any
>          address translation is done, but the mem file here is the memory
of the process
>          that accesses it.  This cannot be mmap(2)'ed currently, and will
not be until a
>          general mmap(2) is added to the kernel.  (This might have
happened by the time
>          you read this.)
>
> Either Linux can in some form support this and I'm doing something wrong
(and the documentation
> is out-of-date); or it is currently not yet possible through /proc.
>
> Thank you for taking the time to read this note.  Any help or pointers
would be very much
> appreciated (I hope someone else has crossed this bridge before me).
>
> Dean W. Anneser
> Software Engineering Fellow
> Real-Time Test Systems
> Pratt & Whitney Aircraft
> 400 Main St., m.s. 161-05
> East Hartford, CT  06108
> email: [EMAIL PROTECTED]
> phone: 860.565.9372    fax: 860.557.3482
> "One test result is worth one thousand expert opinions" - Wernher von
Braun
>
>
>
> example code:
>
> Use mmap.c to view the parameter iii in program tst.c, while tst.c is
> running in background:
>
> =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= mmap.c =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
>
> #include <stdio.h>
> #include <fcntl.h>
> #include <unistd.h>
>
> #include <sys/types.h>
> #include <sys/mman.h>
> #include <sys/types.h>
> #include <sys/stat.h>
> #include <sys/utsname.h>
>
> #define MMAP 1
> #define RW   2
>
>
> void main(int argc, char *argv[])
> {
>   int i, j, k;
>   int iii = 0;
>   int *piii;
>
>   char tmp[256];
>   int fd;
>   caddr_t p;
>
>   struct utsname sysname;
>   struct stat statinfo;
>
>   int bytes_read = 0;
>
>   int page_base;
>   int page_offset;
>   int page_size;
>
>   int pid = 0;
>   int addr = 0;
>   int use = MMAP;
>   int ret = 0;
>
>   int argi = 0;
>
>   while (++argi < argc)
>     {
>       if (strcmp(argv[argi], "-pid") == 0)
>         sscanf(argv[++argi], "%d", &pid);
>       else if (strcmp(argv[argi], "-addr") == 0)
>         sscanf(argv[++argi], "%x", &addr);
>       else if (strcmp(argv[argi], "-use") == 0)
>         {
>           if (strcmp(argv[++argi], "mmap") == 0)
>             use = MMAP;
>           else
>             use = RW;
>         }
>       else
>         {
>           printf("unrecognized option: %s\n", argv[argi]);
>           printf("usage: mmap -pid <pid> -addr <addr>\n");
>           exit(1);
>         }
>     }
>
>   uname(&sysname);
>
>   if ((pid == 0) || (addr == 0))
>     {
>       printf("usage: mmap -pid <pid> -addr <addr>\n");
>       exit(1);
>     }
>
>   if (strcmp(sysname.sysname, "Linux") == 0)
>     sprintf(tmp, "/proc/%d/mem", pid); /* Linux */
>   else
>     sprintf(tmp, "/proc/%d/as", pid); /* PowerMAX_OS or SunOS */
>
>   if ((fd = open(tmp, O_RDWR)) == -1)
>     {
>       printf("open failure on %s\n", tmp);
>       exit(1);
>     }
>
>   if (fstat(fd, &statinfo) == -1)
>     {
>       printf("fstat failed on %s\n", tmp);
>       exit(1);
>     }
>
>   if (use == RW)
>     {
>       while (bytes_read != -1)
>         {
>           if ((ret = lseek(fd, addr, SEEK_SET)) == -1)
>             {
>               printf("lseek() error = %d\n", ret);
>               exit(1);
>             }
>           if ((bytes_read = read(fd, &iii, sizeof(int))) <= 0)
>             {
>               printf("read() error = %d\n", bytes_read);
>               exit(1);
>             }
>           printf("bytes_read = %d, iii = %d\r", bytes_read, iii);
>           fflush(stdout);
>           sleep(1);
>         }
>     }
>   else
>     {
>       page_size = getpagesize();
>       page_base = (addr / page_size) * page_size;
>       page_offset = addr % page_size;
>
>       if ((p = (caddr_t)mmap(0, page_size, (PROT_READ | PROT_WRITE),
MAP_SHARED, fd, page_base)) == (caddr_t)-1)
>         {
>           printf("mmap failure on %s\n", tmp);
>           printf("  statinfo.st_size == %d\n", statinfo.st_size);
>           printf("  page_size == %#x\n", page_size);
>           printf("  page_base == %#x\n", page_base);
>           printf("  page_offset == %#x\n", page_offset);
>           perror((char *)0);
>           close(fd);
>           exit(1);
>         }
>
>       piii = (int *)(p + page_offset);
>
>       while (1)
>         {
>           printf("iii = %d\r", *piii);
>           fflush(stdout);
>           sleep(1);
>         }
>     }
> }
>
> =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= tst.c =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
>
> #include <stdio.h>
>
> int iii, jjj, kkk;
>
> void main()
> {
>   iii = jjj = kkk = 0;
>   while (1)
>     {
>       iii += 1;
>       jjj += 1;
>       kkk += 1;
>       printf("iii = %d; jjj = %d; kkk = %d\n", iii, jjj, kkk);
>       fflush(stdout);
>       sleep(1);
>     }
> }
>
>
> =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= Makefile =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
>
> all: mmap tst
>
> %: %.c
>         cc -g $(LFLAGS) -o $@ $<
>
> clean:
>         rm mmap tst
>
> mmap: mmap.c
>
> tst: tst.c
>
>
> =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= running =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
>
> /home/anneser/mmap> nm tst | grep iii
> 08049658 B iii
>
> /home/anneser/mmap> ./tst > tst.out &
> [1] 1356
>
> /home/anneser/mmap> ./mmap -pid 1356 -addr 0x08049658 -use mmap
> mmap failure on /proc/1356/mem
>   statinfo.st_size == 0
>   page_size == 0x1000
>   page_base == 0x8049000
>   page_offset == 0x658
> No such device
>
> /home/anneser/mmap> ./mmap -pid 1356 -addr 0x08049658 -use rw
> read() error = -1
>
> /home/anneser/mmap>
>
> ----- End of forwarded message from [EMAIL PROTECTED] -----
> -- [rtl] ---
> To unsubscribe:
> echo "unsubscribe rtl" | mail [EMAIL PROTECTED] OR
> echo "unsubscribe rtl <Your_email>" | mail [EMAIL PROTECTED]
> --
> For more information on Real-Time Linux see:
> http://www.rtlinux.org/
>

----- End of forwarded message from [EMAIL PROTECTED] -----
-- [rtl] ---
To unsubscribe:
echo "unsubscribe rtl" | mail [EMAIL PROTECTED] OR
echo "unsubscribe rtl <Your_email>" | mail [EMAIL PROTECTED]
--
For more information on Real-Time Linux see:
http://www.rtlinux.org/

Reply via email to