man(1) Manual page archive


     VMBOXADDR(3)                                         VMBOXADDR(3)

     Name
          bufbox, vmboxaddr, vmbox, varbox - Boxes for process memory

     Synopsis
          #include <ulib.h>

          void* vmboxaddr(char* s, USeg **sp)
          char* vmbox(void* p, ulong sz)
          char* bufbox(buf)
          char* varbox(var)

     Description
          As described in vm(4), virtual memory boxes are used to wrap
          portions of the application address space using either sym-
          bolic names or address ranges.  Vmboxaddr is used by the
          application to obtain the machine address for a virtual mem-
          ory box with name s. This is useful when a s has been cre-
          ated previously using make(2). Vmboxaddr is not a system
          call. It is a library function that reads a table maintained
          by the kernel in user memory to describe the set of virtual
          memory boxes.

          If sp is non-nil, the pointer at *sp is initialized to point
          to a USeg structure containing information about the box.

               struct USeg {
                    Lock;               // usr/kernel sync.
                    char sel[MAXSEL];   // "" are for kernel.
                    ulong     start;         // segment address
                    ulong     limit;         // one past allocated bytes
                    ulong     size;          // actual # of bytes used
               };
          Most fields are self-explanatory. The Lock can be used to
          prevent external access to the box while its contents are in
          use. The kernel sets the lock while accessing box contents;
          the user may do the same.

          Vmbox is used to obtain the name for a virtual memory box
          given an address range starting at address p and containing
          l addresses. The name obtained can be used to operate on the
          box. The macros varbox and bufbox call vmbox to return the
          box name for an array buf or a variable var in scope. The
          box name is created in static storage and is rewritten on
          each call.  It is also important to note that the named box
          is mem unless otherwise specified by user (see the example
          below).

     Example
                    void* p;

     VMBOXADDR(3)                                         VMBOXADDR(3)

                    USeg *l;
                    maken("/b/proc/me/vm/x");
                    p = vmboxaddr("x", &l);
                    memset(p, 0xff, l->size);

          This code creates a segment named x and then obtains its
          address and length to initialize it to "0xff"s.

                    void* p;
                    maken("/b/proc/me/vm/buff");
                    copy("/some/box", nil, "/b/proc/me/vm/buff", nil);
                    p = vmboxaddr("buff", nil);
                    cprint("got %s", p);

          This code copies data from /some/box into local memory at
          address p.

                    struct S v;
                    char  buf[N];
                    ...
                    copy("/some/box", nil, varbox(v), nil);
                    copy(bufbox(buf), "text", "/other/box", nil);
                    copy("/b/proc/me/vm/0x4cd000:0x4ce000", nil, "/some/box", nil);

          The first call copies the contents of /some/box to the vari-
          able v. The second call copies the contents of buf into
          /other/box, using text as the type for the virtual memory
          range box. The third call would copy the memory starting at
          address 0x4cd000 up to (but not including) 0x4ce000 to
          /some/box.

     Source
          /src/b/*/u.c

     See also
          vm(4) and intro(2).

     Bugs
          Vmbox uses static storage.