 |
OpenVMS System Services Reference Manual
When you set the PRC$M_NOUAF flag in the stsflg
argument and create a process running LOGINOUT, LOGINOUT will attempt
to map a CLI and command table with the same file names as those
running in your process. The CLI and command table images must
therefore have already been installed by the system manager on the
other node. Problems can arise when you are using something other than
the DCL CLI and its standard command tables. For example, if you are
running on a VAX node with MCR as your current CLI, LOGINOUT will be
unable to map that CLI on an Alpha node. The new process will be
created but then aborted by LOGINOUT.
A detached process is considered an interactive process only if (1) the
process is created with the PRC$M_INTER option specified and (2)
SYS$INPUT is not defined as a file-oriented device.
The $CREPRC service requires system dynamic memory.
Required Access or Privileges
The calling process must have the following:
- IMPERSONATE or CMKRNL privilege to create any of the following
types of process:
- A detached process with a UIC that is different from the UIC of the
calling process
- A detached process with a larger value specified for some quota
than is authorized for the caller
- A detached process on another node if the system parameter
CWCREPRC_ENABLE has a value of 0
- IMPERSONATE privilege to create any of the following types of
process:
- A batch process
- A network process
- A trusted computing base process
- ALTPRI privilege to create a subprocess with a higher base priority
than the calling process
- SETPRV privilege to create a process with privileges that the
calling process does not have
- PSWAPM privilege to create a process with process swap mode disabled
- ACNT privilege to create a process with accounting functions
disabled
- OPER privilege to create a detached process on another OpenVMS
Cluster node on which interactive logins have not yet been enabled
Required Quota
The number of subprocesses that a process can create is controlled by
the subprocess (PRCLM) quota; this quota is returned when a subprocess
is deleted.
The number of detached processes on any one OpenVMS Cluster node that a
process can create with the same user name is controlled by the
MAXDETACH entry in the user authorization file (UAF).
When a subprocess is created, the value of any deductible quota is
subtracted from the total value the creating process has available, and
when the subprocess is deleted, the unused portion of any deductible
quota is added back to the total available to the creating process. Any
pooled quota value is shared by the creating process and all its
subprocesses.
Related Services
$CANEXH, $DCLEXH, $DELPRC, $EXIT, $FORCEX, $GETJPI, $GETJPIW, $HIBER,
$PROCESS_SCAN, $RESUME, $SETPRI, $SETPRN, $SETPRV, $SETRWM, $SUSPND,
$WAKE
Condition Values Returned
SS$_ACCVIO
|
The caller cannot read a specified input string or string descriptor,
the privilege list, or the quota list; or the caller cannot write the
process identification.
|
SS$_BADRAD
|
The specified RAD contains no memory or contains no active CPUs, or the
specified RAD is greater than or equal to the maximum number of RADs on
the system. Use the $GETSYI item code RAD_MAX_RADS to determine the
maximum number of RADs on the system.
|
SS$_DUPLNAM
|
The specified process name duplicates one already specified within that
group.
|
SS$_EXPRCLM
|
The creation of a detached process failed because the creating process
already reached its limit for the creation of detached processes. This
limit is established by the MAXDETACH quota in the user authorization
file (UAF) of the creating process.
|
SS$_EXQUOTA
|
At least one of the following conditions is true:
- The process has exceeded its quota for the creation of subprocesses.
- A quota value specified for the creation of a subprocess exceeds
the creating process's corresponding quota.
- The quota is deductible and the remaining quota for the creating
process would be less than the minimum.
|
SS$_INCOMPAT
|
The remote node is running an incompatible version of the operating
system, namely, one that does not support remote process creation.
|
SS$_INSFMEM
|
The system dynamic memory is insufficient for the requested operation.
|
SS$_INVARG
|
An invalid argument was specified.
|
SS$_IVLOGNAM
|
At least one of the following two conditions is true:
- The specified process name has a length of 0 or has more than 15
characters.
- The specified image name, input name, output name, or error name
has more than 255 characters.
|
SS$_IVQUOTAL
|
The quota list is not in the proper format.
|
SS$_IVSTSFLG
|
A reserved status flag was specified.
|
SS$_NODELEAVE
|
The specified node was removed from the OpenVMS Cluster during the
$CREPRC service's execution.
|
SS$_NOPRIV
|
The caller violated one of the privilege restrictions.
|
SS$_NORMAL
|
The service completed successfully.
|
SS$_NOSLOT
|
No process control block is available; in other words, the maximum
number of processes that can exist concurrently in the system has been
reached.
|
SS$_NOSUCHNODE
|
The specified node is not currently a member of the cluster.
|
SS$_REMRSRC
|
The remote node has insufficient resources to respond to the request.
(Bring this error to the attention of your system manager.)
|
SS$_UNREACHABLE
|
The remote node is a member of the cluster but is not accepting
requests. This is normal for a brief period early in the system boot
process.
|
$CRETVA
Adds a range of demand-zero allocation pages (on VAX systems) or
pagelets (on Alpha systems) to a process's virtual address space for
the execution of the current image.
Format
SYS$CRETVA inadr ,[retadr] ,[acmode]
C Prototype
int sys$cretva (struct _va_range *inadr, struct _va_range *retadr,
unsigned int acmode);
Arguments
inadr
OpenVMS usage: |
address_range |
type: |
longword (unsigned) |
access: |
read only |
mechanism: |
by reference |
Address of a 2-longword array containing the starting and ending
virtual addresses of the pages to be created. If the starting and
ending virtual addresses are the same, a single page is created. The
addresses are adjusted up or down to fall on CPU-specific page
boundaries. Only the virtual page number portion of the virtual address
is used; the low order byte-within-page bits are ignored.
retadr
OpenVMS usage: |
address_range |
type: |
longword (unsigned) |
access: |
write only |
mechanism: |
by reference--array reference or descriptor |
Address of a 2-longword array to receive the starting and ending
virtual addresses of the pages created.
On Alpha systems, the retadr argument should be
checked by programs for actual allocation. Because the Alpha
architecture defines more than one page size, more space might be
created than was specified in the retadr argument.
acmode
OpenVMS usage: |
access_mode |
type: |
longword (unsigned) |
access: |
read only |
mechanism: |
by value |
Access mode and protection for the new pages. The
acmode argument is a longword containing the access
mode.
The $PSLDEF macro defines the following symbols for the four access
modes:
Symbol |
Access Mode |
PSL$C_KERNEL
|
Kernel
|
PSL$C_EXEC
|
Executive
|
PSL$C_SUPER
|
Supervisor
|
PSL$C_USER
|
User
|
The most privileged access mode used is the access mode of the caller.
The protection of the pages is read/write for the resultant access mode
and those more privileged.
Description
The Create Virtual Address Space service adds a range of demand-zero
allocation pages to a process's virtual address space for the execution
of the current image.
Pages are created starting at the address contained in the first
longword of the location addressed by the inadr
argument and ending with the second longword. The ending address can be
lower than the starting address. The retadr argument
indicates the byte addresses of the pages created.
If an error occurs while pages are being created, the
retadr argument, if specified, indicates the pages
that were successfully created before the error occurred. If no pages
were created, both longwords of the retadr argument
contain the value --1.
If $CRETVA creates pages that already exist, the service deletes those
pages if they are not owned by a more privileged access mode than that
of the caller. Any such deleted pages are reinitialized as demand-zero
pages. For this reason, it is important to use the
retadr argument to capture the address range actually
created. Because the Alpha architecture has a larger page size than the
VAX architecture, more space is potentially affected on Alpha systems.
Required Access or Privileges
None
Required Quota
The paging file quota (PGFLQUOTA) of the process must be sufficient to
accommodate the increased size of the virtual address space.
Related Services
$ADJSTK, $ADJWSL, $CRMPSC, $DELTVA, $DGBLSC, $EXPREG, $LCKPAG, $LKWSET,
$MGBLSC, $PURGWS, $SETPRT, $SETSTK, $SETSWM, $ULKPAG, $ULWSET, $UPDSEC,
$UPDSECW
The Expand Program/Control Region ($EXPREG) service also adds pages to
a process's virtual address space.
Note
Do not use the $CRETVA system service in conjunction with other
user-written procedures or procedures supplied by Compaq (including
Run-Time Library procedures). This system service provides no means to
communicate a change in virtual address space with other routines.
Compaq recommends that you use either $EXPREG or the Run-Time Library
procedure Allocate Virtual Memory (LIB$GET_VM) to get memory. You can
find documentation on LIB$GET_VM in the OpenVMS RTL Library (LIB$) Manual. When using
$DELTVA, you should take care to delete only pages that you have
specifically created.
|
Condition Values Returned
SS$_NORMAL
|
The service completed successfully.
|
SS$_ACCVIO
|
The
inadr argument cannot be read by the caller, or the
retadr argument cannot be written by the caller.
|
SS$_EXQUOTA
|
The process has exceeded its paging file quota.
|
SS$_INSFWSL
|
The process's working set limit is not large enough to accommodate the
increased size of the virtual address space.
|
SS$_NOPRIV
|
A page in the specified range is in the system address space.
|
SS$_NOSHPTS
|
A virtual address within a shared page table region was specified.
|
SS$_PAGOWNVIO
|
A page in the specified range already exists and cannot be deleted
because it is owned by a more privileged access mode than that of the
caller.
|
SS$_VA_IN_USE
|
The existing underlying page cannot be deleted because it is associated
with a buffer object.
|
SS$_VASFULL
|
The process's virtual address space is full; no space is available in
the page tables for the requested pages.
|
$CRETVA_64 (Alpha Only)
On Alpha systems, adds a range of demand-zero allocation pages to a
process's virtual address space for the execution of the current image.
The new pages are added at the virtual address specified by the caller.
This service accepts 64-bit addresses.
Format
SYS$CRETVA_64 region_id_64 ,start_va_64 ,length_64 ,acmode ,flags
,return_va_64 ,return_length_64
C Prototype
int sys$cretva_64 (struct _generic_64 *region_id_64, void *start_va_64,
unsigned __int64 length_64, unsigned int acmode, unsigned int flags,
void *(*(return_va_64)), unsigned __int64 *return_length_64);
Arguments
region_id_64
OpenVMS usage: |
region identifier |
type: |
quadword (unsigned) |
access: |
read only |
mechanism: |
by 32- or 64-bit reference |
The region ID associated with the region to create the virtual address
range. The file VADEF.H in SYS$STARLET_C.TLB and the $VADEF macro in
STARLET.MLB define a symbolic name for each of the three default
regions in P0, P1, and P2 space.
The following region IDs are defined:
Symbol |
Region |
VA$C_P0
|
Program region
|
VA$C_P1
|
Control region
|
VA$C_P2
|
64-bit program region
|
Other region IDs, as returned by the $CREATE_REGION_64 service, can be
specified. Also, given a particular virtual address, the region ID for
the region it is in can be obtained by calling the $GET_REGION_INFO
system service specifying the VA$_REGSUM_BY_VA function.
start_va_64
OpenVMS usage: |
address |
type: |
quadword address |
access: |
read only |
mechanism: |
by value |
The starting address for the created virtual address range. The
specified virtual address must be a CPU-specific page aligned address.
length_64
OpenVMS usage: |
byte count |
type: |
quadword (unsigned) |
access: |
read only |
mechanism: |
by value |
Length of the virtual address space to be created. The length specified
must be a multiple of CPU-specific pages.
acmode
OpenVMS usage: |
access_mode |
type: |
longword (unsigned) |
access: |
read only |
mechanism: |
by value |
Access mode associated with the call to $CRETVA_64. The access mode
determines the owner mode of the pages as well as the read and write
protection on the pages. The acmode argument is a
longword containing the access mode.
The $PSLDEF macro in STARLET.MLB and the file PSLDEF.H in
SYS$STARLET_C.TLB define the following symbols and their values for the
four access modes:
Value |
Symbolic Name |
Access Mode |
0
|
PSL$C_KERNEL
|
Kernel
|
1
|
PSL$C_EXEC
|
Executive
|
2
|
PSL$C_SUPER
|
Supervisor
|
3
|
PSL$C_USER
|
User
|
The $CRETVA_64 service uses whichever of the following access modes is
least privileged:
- Access mode specified by the acmode argument
- Access mode of the caller
The protection of the pages is read/write for the resultant access mode
and those more privileged.
Address space cannot be created within a region that has a create mode
associated with it that is more privileged than the caller's mode. The
condition value SS$_IVACMODE is returned if the caller is less
privileged than the create mode for the region.
flags
OpenVMS usage: |
mask_longword |
type: |
longword (unsigned) |
access: |
read only |
mechanism: |
by value |
Flag mask controlling the characteristics of the demand-zero pages
created. The flags argument is a longword bit vector
in which each bit corresponds to a flag. The $VADEF macro and the
VADEF.H file define a symbolic name for each flag. You construct the
flags argument by performing a logical OR operation on
the symbol names for all desired flags.
The following table describes the flag that is valid for the $CRETVA_64
service:
Flag |
Description |
VA$M_NO_OVERMAP
|
Pages cannot overmap existing address space. By default, pages can
overmap existing address space.
|
All other bits in the flags argument are reserved for future use by
Compaq and should be specified as 0. The condition value SS$_IVVAFLG is
returned if any undefined bits are set.
return_va_64
OpenVMS usage: |
address |
type: |
quadword (unsigned) |
access: |
write only |
mechanism: |
by 32- or 64-bit reference |
The lowest process virtual address of the created virtual address
range. The return_va_64 argument is the 32- or 64-bit
virtual address of a naturally aligned quadword into which the service
returns the virtual address.
return_length_64
OpenVMS usage: |
byte count |
type: |
quadword (unsigned) |
access: |
write only |
mechanism: |
by 32- or 64-bit reference |
The length of the virtual address range created. The
return_length_64 argument is the 32- or 64-bit virtual
address of a naturally aligned quadword into which the service returns
the length of the virtual address range in bytes.
Description
The Create Virtual Address Space service is a kernel mode service that
can be called from any mode. The service adds a range of demand-zero
allocation pages, starting at the virtual address specified by the
start_va_64 argument. The pages are added to a
process's virtual address space for the execution of the current image.
Expansion occurs at the next free available address within the
specified region if the range of addresses is beyond the next free
available address.
The new pages, which were previously inaccessible to the process, are
created as demand-zero pages.
The returned address is always the lowest virtual address in the range
of pages created. The returned length is always an unsigned byte count
indicating the length of the range of pages created.
Successful return status from $CRETVA means that the specified address
space was created of the size specified in the
length_64 argument.
If $CRETVA_64 creates pages that already exist, the service deletes
those pages if they are not owned by a more privileged access mode than
that of the caller. Any such deleted pages are reinitialized as
demand-zero pages.
If the condition value SS$_ACCVIO is returned by this service, a value
cannot be returned in the memory locations pointed to by the
return_va_64 and return_length_64
arguments.
If an address within the specified address range is not within the
bounds of the specified region, the condition value SS$_PAGNOTINREG is
returned.
If a condition value other than SS$_ACCVIO is returned, the returned
address and returned length indicate the pages that were successfully
added before the error occurred. If no pages were added, the
return_va_64 argument will contain the value --1, and
a value cannot be returned in the memory location pointed to
by the return_length_64 argument.
Required Privileges
None
Required Quota
The working set quota (WSQUOTA) of the process must be sufficient to
accommodate the increased length of the process page table required by
the increase in virtual address space.
The process's paging file quota (PGFLQUOTA) must be sufficient to
accommodate the increased size of the virtual address space.
Related Services
$CREATE_BUFOBJ_64, $CREATE_REGION_64, $DELETE_REGION_64, $DELTVA_64,
$EXPREG_64, $LCKPAG_64, $LKWSET_64, $PURGE_WS, $SETPRT_64, $ULKPAG_64,
$ULWSET_64
Condition Values Returned
SS$_NORMAL
|
The service completed successfully.
|
SS$_ACCVIO
|
The
return_va_64 or
return_length_64 argument cannot be written by the
caller.
|
SS$_EXPGFLQUOTA
|
The process has exceeded its paging file quota.
|
SS$_INSFWSL
|
The process's working set limit is not large enough to accommodate the
increased virtual address space.
|
SS$_IVACMODE
|
The caller's mode is less privileged than the create mode associated
with the region.
|
SS$_IVREGID
|
An invalid region ID was specified.
|
SS$_IVVAFLG
|
An invalid flag, a reserved flag, or an invalid combination of flags
and arguments was specified.
|
SS$_LEN_NOTPAGMULT
|
The
length_64 argument is not a multiple of CPU-specific
pages.
|
SS$_NOSHPTS
|
The region ID of a shared page table region was specified.
|
SS$_PAGNOTINREG
|
A page in the specified range is not within the specified region.
|
SS$_PAGOWNVIO
|
A page in the specified range already exists and cannot be deleted
because it is owned by a more privileged access mode than that of the
caller.
|
SS$_REGISFULL
|
The specified virtual region is full.
|
SS$_VA_IN_USE
|
A page in the specified range is already mapped, and the
VA$M_NO_OVERLAP flag was set, or the existing underlying page cannot be
deleted because it is associated with a buffer object.
|
SS$_VA_NOTPAGALGN
|
The
start_va_64 argument is not CPU-specific page aligned.
|
|