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/