home *** CD-ROM | disk | FTP | other *** search
/ NetNews Usenet Archive 1992 #18 / NN_1992_18.iso / spool / comp / unix / programm / 4256 < prev    next >
Encoding:
Text File  |  1992-08-12  |  5.1 KB  |  151 lines

  1. Path: sparky!uunet!mcsun!corton!nenufar.saclay.cea.fr!soleil!basile
  2. From: basile@soleil.serma.cea.fr (Basile STARYNKEVITCH)
  3. Newsgroups: comp.unix.programmer
  4. Subject: How to reserve adress ranges on SVR4 or SunOS5.0
  5. Keywords: mmap, adress range
  6. Message-ID: <1992Aug12.173104.7279@nenufar.saclay.cea.fr>
  7. Date: 12 Aug 92 17:31:04 GMT
  8. Sender: @nenufar.saclay.cea.fr
  9. Reply-To: basile@soleil.serma.cea.fr (Basile STARYNKEVITCH)
  10. Organization: Commissariat a l Energie Atomique
  11. Lines: 130
  12. Nntp-Posting-Host: soleil-gw.serma.cea.fr
  13.  
  14. on SunOS5.0 Beta (= Solaris 2.0 Beta), Sun4/40 IPC, 20Mb RAM.
  15.  
  16. I'm writing a garbage collected system. I wish to reserve a rather huge
  17. adress range (let say 0.5 or 1 GigaBytes) - usually much bigger than my
  18. swap space. I won't use all of it (this range is an absolute max), but
  19. i want to be sure my allocator could ask for contiguous adresses
  20. ranges, so i would like to reserve a contiguous adress range and then
  21. mmap MAP_FIXED /dev/zero O_RDWRD opened PROT_READ|PROT_WRITE some
  22. bunches of it.  [basically i want some kind of sbrk(2) behavior, but
  23. not interfering with the system break and malloc(3); i will also use
  24. protection bits in my GC, like Appel, Chenay, et al].  In other words,
  25. i wish to have a very big adress range into which i'm sure mmap won't
  26. fall if not asked to by MAP_FIXED!.
  27.  
  28. I thought that opening /dev/zero as read-only, and mmap(2)ing it
  29. without any access permitted would be ok. It doesn't work as expected
  30. (iez it eats up swap space; mmap(2)-ing /dev/null don't work neither;
  31. Does anybody have some ideas?? 
  32.  
  33. Please post your answers or email, thank you.
  34.  
  35.  
  36. Here is a test run
  37.  
  38. cantor:basile:127: swap -s   ### swap space before 
  39. total: 13928k bytes allocated + 5336k reserved = 19264k used, 41496k available
  40.  
  41. trying to reserve a lot of memory
  42. cantor:basile:134: testmmap 131072 2048
  43.  mypagesize=4096=0x1000 myreadlen=131072K=0x8000000 mywritelen=2048K=0x200000 
  44.  mmap rzero read len=134217728=0x8000000 failure errno=11:No more processes 
  45.  mmap zero write len=2097152=0x200000 at 0xef51f000 up to 0xef71efff
  46.  sleeping 5 sec 
  47. <Hit ^Z>
  48. Stopped
  49. cantor:basile:135: swap -s  ## while testmmap is sleeping
  50. total: 14004k bytes allocated + 7384k reserved = 21388k used, 39396k available
  51. cantor:basile:136: fg
  52. testmmap 131072 2048
  53.  exiting 
  54.  
  55. cantor:basile:137: testmmap 32768 2048
  56.  mypagesize=4096=0x1000 myreadlen=32768K=0x2000000 mywritelen=2048K=0x200000 
  57.  mmap rzero read len=33554432=0x2000000 at 0xed71f000 up to 0xef71efff
  58.  mmap zero write len=2097152=0x200000 at 0xed71f000 up to 0xed91efff
  59.  sleeping 5 sec 
  60. <Hit ^Z>
  61. Stopped
  62. cantor:basile:138: swap -s
  63. total: 14004k bytes allocated + 40152k reserved = 54156k used, 6604k available
  64. cantor:basile:139: 
  65.  
  66. cantor:basile:139: fg
  67. testmmap 32768 2048
  68.  exiting 
  69.  
  70. here is a test program:
  71.  
  72. /* file SRC/testmmap.c */
  73. #include <unistd.h>
  74. #include <stdlib.h>
  75. #include <sys/types.h>
  76. #include <sys/mman.h>
  77. #include <sys/stat.h>
  78. #include <fcntl.h>
  79. #include <string.h>
  80. #include <errno.h>
  81.  
  82. void *myreadmap;
  83. void *mywritemap;
  84. int   myreadlen;
  85. int   mywritelen;
  86. int   mypagesize;
  87. int   myzero;
  88. int   myreadzero;
  89. int   mynull;
  90. int
  91. main(int argc, char **argv)
  92. {
  93.    myzero = open("/dev/zero", O_RDWR);
  94.    if (myzero < 0) {
  95.       perror(" open /dev/zero rdwr");
  96.       exit(1);
  97.    };
  98.    myreadzero = open("/dev/zero", O_RDONLY);
  99.    if (myreadzero < 0) {
  100.       perror(" open /dev/zero read ");
  101.       exit(1);
  102.    };
  103.    mynull = open("/dev/null", O_RDONLY);
  104.    if (mynull < 0) {
  105.       perror(" open /dev/null ");
  106.       exit(1);
  107.    };
  108.    mypagesize = sysconf(_SC_PAGESIZE);
  109.    if (argc >= 2)
  110.       myreadlen = atoi(argv[1]) * 1024;
  111.    if (argc >= 3)
  112.       mywritelen = atoi(argv[2]) * 1024;
  113.    printf(" mypagesize=%d=%#x myreadlen=%dK=%#x mywritelen=%dK=%#x \n",
  114.       mypagesize, mypagesize, myreadlen / 1024, myreadlen, mywritelen / 1024, mywritelen);
  115.    myreadmap = mmap((void *) 0, myreadlen, 0, MAP_SHARED, myreadzero, 0);
  116.    if (myreadmap == (void *) -1) {
  117.       printf(" mmap rzero read len=%d=%#x failure errno=%d:%s \n",
  118.          myreadlen, myreadlen, errno, strerror(errno));
  119.       myreadmap = 0;
  120.    }
  121.    else
  122.       printf(" mmap rzero read len=%d=%#x at %#x up to %#x\n",
  123.          myreadlen, myreadlen, myreadmap, myreadmap + myreadlen - 1);
  124.    mywritemap = mmap(myreadmap, mywritelen,
  125.              PROT_READ | PROT_WRITE,
  126.              myreadmap ? (MAP_PRIVATE | MAP_FIXED) : MAP_PRIVATE,
  127.              myzero, 0);
  128.    if (mywritemap == (void *) -1)
  129.       printf(" mmap zero write len=%d=%#x failure errno=%d:%s \n",
  130.          mywritelen, mywritelen, errno, strerror(errno));
  131.    else
  132.       printf(" mmap zero write len=%d=%#x at %#x up to %#x\n",
  133.          mywritelen, mywritelen, mywritemap, mywritemap + mywritelen - 1);
  134.    printf(" sleeping 5 sec \n");
  135.    sleep(5);
  136.    printf(" exiting \n");
  137.    exit(0);
  138.    return 0;
  139. }
  140. /* eof testmmap.c */
  141.  
  142.  
  143. -- 
  144. Basile STARYNKEVITCH
  145. Commissariat a l Energie Atomique
  146. DRN/DMT/SERMA * C.E. Saclay bat.470 * 91191 GIF/YVETTE CEDEX * France
  147. fax: (33) 1- 69.08.23.81;    phone: (33) 1- 69.08.40.66
  148. email: basile@soleil.serma.cea.fr;  homephone: (33) 1- 46.65.45.53
  149. N.B. Any opinions expressed here are solely mine, and not of my organization.
  150. N.B. Les opinions exprimees ici me sont personnelles et n engagent pas le CEA.
  151.