Skip to content

rvm_create_segment

NAME

rvm_create_segment - create a segment with load map header

SYNOPSIS

#include "seg.h"

typedef struct {
    rvm_offset_t        offset;
    rvm_length_t        length;
    char                *vmaddr;
} rvm_region_def_t;

rvm_return_t rvm_create_segment (DevName, DevLength, options,
                                 nregions, regions)

char             *DevName;  /* name of heap segment */
rvm_offset_t     DevLength; /* length of heap raw partition */
rvm_options_t    *options;  /* optional pointer to an options record */
unsigned long    nregions;  /* number of region descriptors */
rvm_region_def_t *regions;  /* pointer to array of region descriptors */

DESCRIPTION

rvm_create_segment is used to initialize the segment header with the region load map. The name of the file or partition for the segment is specified by DevName, and the length of the partition is specified in DevLength. If the segment is represented by a file, DevLength should be zero. Also, the file must exist and be at least one page long.

The parameter region_defs must point to an array of rvm_region_def_t descriptors, with one descriptor for each region to be loaded by rvm_load_segment. The descriptor array must be allocated and deallocated by application, and must be as long as the number of descriptors specified by nregions. The maximum number of regions that can be described in the header is limited by the page size of the machine, which is available as the macro RVM_PAGE_SIZE. If the number of regions requested by the parameter nregions causes the header to exceed page size, the error RVM_ENO_MEMORY will be returned.

Each rvm_region_def_t descriptor requires the regions virtual memory address and its length. The virtual memory address where the region will be loaded must be page-aligned. It can be specified as zero and, if so, will cause the loader to allocate virtual memory for the region. Regions containing pointers must specify an address to guarantee that they are loaded in the same place each time. The region length must be an integral multiple of the page size, or the error code RVM_ERANGE will be returned.

Regions are not allowed to overlap in virtual memory. If this condition is not met, the error code RVM_EVM_OVERLAP will be returned.

rvm_create_segment assigns space in the segment to the header and regions contiguously, beginning with the header at byte zero and with length equal to the page size. The regions are allocated next, in the order of their occurrence in the region_defs array. The offset is returned in the offset field of each descriptor.

The virtual memory specified in the descriptors does not have to be addressable when calling rvm_create_segment. Also, rvm_create_segment does not map or alter the applications data in the segment; only the first page of the segment for the header is affected.

Since it is an initialization function, rvm_create_segment performs no internal synchronization, so if there is a possibility of concurrent access to the segment, the application must do appropriate serialization.

An optional RVM options descriptor can be passed to rvm_create_segment if no log has been previously declared. RVM must be initialized before rvm_create_segment is called.

DIAGNOSTICS

  • RVM_SUCCESS: success
  • RVM_ERANGE: a region length is not page sized
  • RVM_EVM_OVERLAP: region mappings oberlap in virtual mapping
  • RVM_ENO_MEMORY: heap exhausted, or header cannot be allocated
  • RVM_EOPTIONS: invalid options record or pointer
  • RVM_ELOG: no log file has been specified
  • RVM_EINIT: RVM not initialized

SEE ALSO

rvm_load_segment, rvm_map, rds_zap_heap, rds_load_heap, rdsinit

AUTHOR

David C. Steere